Encontré un sitio web que ofrece puntajes de dardos. Cada vez que se publica una nueva partitura, me gustaría ser notificado.
import time import selenium from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait URL = 'https://live.dartsdata.com/' driver = webdriver.Chrome('/Users/hjam/downloads/chromedriver') driver.get(URL) time.sleep(1) matches = driver.find_elements(By.XPATH, ".//*[@class='sr-match__wrapper srt-base-1 sr-ml-list__match']") matches[0].click()
Quiero recuperar los segundos hasta que comience el partido (no hay cajeros automáticos de partidos en vivo, pero la idea es la misma). Veo que este punto de datos se encuentra en
seconds = driver.find_elements(By.XPATH, ".//*[@class='sr-lmt-0-ms-countdown__time srt-primary-7 srm-large']")[-1]
Ahora quiero usar un MutationObserver
para rastrear los cambios de este elemento. Cada vez que cambia el elemento, quiero que se imprima. Usando el ejemplo de docs escribo lo siguiente
driver.execute_script(""" const targetNode = document.querySelector('#content1 > div.sr-lmt-plus__comp.srm-double.srm-isLmt > div > div > div > div > div > div > div.sr-lmt-wrap > div > div.sr-lmt-22-state > div.sr-bb.sr-lmt-matchstatus.sr-ltr.sr-lmt-matchstatus--small > div > div > div.sr-lmt-matchstatus__slider.sr-slider-flex__slider > div > div > div.sr-lmt-setsports-ms-matchstatus__row.sr-lmt-setsports-ms-matchstatus__countdown-wrapper > div > div.sr-lmt-0-ms-countdown__row > div:nth-child(4)'); const config = { attributes: true, childList: true, subtree: true }; const callback = function(mutationsList, observer) { for(const mutation of mutationsList) { console.log('Time is ticking'); } }; const observer = new MutationObserver(callback); observer.observe(targetNode, config); """)
Esto no produce ningún error, pero no pasa nada. Debería imprimir continuamente 'el tiempo corre' en la Consola, ¿verdad?
¿Qué estoy haciendo mal? ¿Y también existe la posibilidad de que la salida se imprima en mi script de python?
querySelectorAll no está activo. Devuelve representaciones de lo que era el dom y estás monitoreando esa instantánea. Debe usar getElementsByClassName para conectarse a un elemento en vivo.