【问题标题】:Track changes within DOM element with MutationObserver Python使用 MutationObserver Python 跟踪 DOM 元素内的变化
【发布时间】:2021-12-26 17:01:31
【问题描述】:

我找到了一个推送飞镖分数的网站。每次发布新乐谱时,我都希望收到通知。

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()

我想检索比赛开始前的秒数(没有实时比赛 atm,但想法是一样的)。我看到这个数据点位于

seconds = driver.find_elements(By.XPATH, ".//*[@class='sr-lmt-0-ms-countdown__time srt-primary-7 srm-large']")[-1]

现在我想使用MutationObserver 来跟踪这个元素的变化。每次元素更改时,我都希望将其打印出来。使用docs的例子我写如下

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);
""")

这不会产生错误,但什么也不会发生。它应该在控制台中连续打印 'time is ticking' 对吗?

我做错了什么?是否也有可能在我的 python 脚本中打印输出?

【问题讨论】:

  • 数组语法在类似数组的结构上无效。 -1 无效。
  • tnx 现在错误消失了,但是没有输出

标签: javascript python selenium mutation-observers


【解决方案1】:

querySelectorAll 未上线。它返回 dom 的表示,并且您正在监视该快照。您需要使用 getElementsByClassName 来连接到活动元素。

【讨论】:

  • 感谢您的提示。如果我将脚本更改如下:var targetNode = document.getElementsByClassName('sr-lmt-0-ms-countdown__time srt-primary-7 srm-large')[3];,我仍然在控制台中看不到日志输出
  • 因为你在配置中缺少 'characterData: true'
  • @HJA24 在characterData: true 之后,mutationobserver 是否在你这边工作?我的意思是把 Time is ticking 扔到控制台?
  • 是的,添加之后就可以了!
猜你喜欢
  • 2018-12-30
  • 2020-10-03
  • 1970-01-01
  • 2021-05-18
  • 2014-05-21
  • 2019-08-12
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多