如何使用Selenium检测div内容更新及DOM节点变动
解决方案
以下两种实现方式均无需编写Selenium扩展,仅用Python原生Selenium接口即可实现,完全符合仅检测DOM变化、不对比数值的需求。
方案1:轻量轮询检测(实现最简单,适合绝大多数场景)
原理:每次页面更新都会替换父div下的第一个子节点,我们只需要比对Selenium为节点生成的内部唯一标识即可判断是否有新节点插入,不需要对比节点的实际内容。
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get("替换为你的目标页面地址") # 定位目标父div,可根据实际情况修改定位方式和选择器 parent_div = driver.find_element(By.CSS_SELECTOR, "#替换为父div的实际选择器") # 初始化记录第一个子节点的Selenium内部唯一ID last_first_child_id = parent_div.find_elements(By.XPATH, "./div")[0].id while True: current_first_child = parent_div.find_elements(By.XPATH, "./div")[0] # ID不一致说明有新节点插入 if current_first_child.id != last_first_child_id: # 此处添加你的数值存储逻辑 new_value = current_first_child.text print(f"检测到新值: {new_value}") # 更新记录的ID last_first_child_id = current_first_child.id # 轮询间隔可根据更新频率调整,100-500ms基本不会漏数据,性能损耗极小 time.sleep(0.2)
优势:代码量极少,逻辑清晰易懂,不需要操作JS代码,适配所有场景。
方案2:事件驱动检测(无轮询,性能更优,适合高频更新场景)
原理:直接在页面注入一段极简的MutationObserver JS代码,通过Selenium的异步执行接口等待变化通知,全程不需要轮询,也不需要编写浏览器扩展。
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("替换为你的目标页面地址") # 定位目标父div,可根据实际情况修改定位方式和选择器 parent_div = driver.find_element(By.CSS_SELECTOR, "#替换为父div的实际选择器") while True: # 注入MutationObserver监听子节点变化,异步等待更新通知 new_first_child = driver.execute_async_script(""" const callback = arguments[arguments.length - 1]; const observer = new MutationObserver((mutations) => { for (const mutation of mutations) { // 检测到子节点添加时返回新的第一个子节点 if (mutation.addedNodes.length > 0) { observer.disconnect(); callback(mutation.addedNodes[0]); return; } } }); observer.observe(arguments[0], { childList: true }); """, parent_div) # 此处添加你的数值存储逻辑 new_value = new_first_child.text print(f"检测到新值: {new_value}")
优势:完全基于事件触发,无轮询空转消耗,性能更高,不会漏掉任何更新。
内容的提问来源于stack exchange,提问作者Dots
相关产品推荐
相关产品推荐

