Python使用Selenium获取JS动态加载数据结果不一致问题咨询
解决方案
内置ExpectedCondition的presence_of_element_located仅校验元素存在于DOM树中,visibility_of_element仅校验元素可见,都不会校验元素内部的动态填充内容,因此无法满足你的需求。你可以通过自定义预期条件实现等待元素内容加载完成后再执行后续操作,具体实现方式如下:
1. 快速实现:基于lambda的自定义等待
直接在wait.until中传入匿名函数,判断目标元素的内容非空即可:
# 等待目标元素innerHTML内容非空,超时时间20秒 wait.until(lambda dr: dr.find_element(By.XPATH, "//*[@id='dev_diaginfo_fid']").get_attribute("innerHTML").strip() != "")
等待通过后再提取元素内容即可。
2. 更稳定的实现:基于格式校验的自定义等待
如果已知固件版本的格式规则(比如x.x.x的数字版本号、v1.2.3带前缀的版本号等),可以通过正则匹配进一步过滤占位符、空内容的异常情况,代码示例如下:
import re # 自定义预期条件:校验指定元素内容是否匹配对应正则规则 def element_content_match(locator, pattern): def check(driver): ele = driver.find_element(*locator) content = ele.get_attribute("innerHTML").strip() return re.match(pattern, content) is not None return check # 调用示例:假设你的固件版本为x.x.x格式的数字版本号,可根据实际格式调整正则 version_loc = (By.XPATH, "//*[@id='dev_diaginfo_fid']") wait.until(element_content_match(version_loc, r'^\d+\.\d+(\.\d+)*$'))
补充优化建议
- 修正原代码的两处语法错误:XPath路径的引号嵌套冲突、
get_attribute后的多余等号,正确的内容提取写法为:print(driver.find_element(By.XPATH, "//*[@id='dev_diaginfo_fid']").get_attribute("innerHTML")) - 如果仍有偶发失效情况,可以增加短轮询重试逻辑,进一步适配网络波动场景:
import time max_retry = 5 version_content = "" for _ in range(max_retry): version_content = driver.find_element(By.XPATH, "//*[@id='dev_diaginfo_fid']").get_attribute("innerHTML").strip() if version_content: break time.sleep(0.5) - 若部分场景下innerHTML取不到内容,可尝试替换为
get_attribute("textContent")或者.text提取内容,适配不同的JS填充逻辑。
内容的提问来源于stack exchange,提问作者ex28
相关产品推荐
相关产品推荐

