使用Selenium Python点击表格链接下载报表遇Stale element异常如何解决
异常原因
你提前一次性获取了所有匹配的元素并存储到列表中,点击第一个元素后,哪怕页面没有发生整页跳转,只要表格区域有局部DOM刷新(比如点击后元素状态更新、表格重绘),之前缓存的所有元素引用都会直接失效,循环访问第二个元素时就会抛出StaleElementReferenceException。
解决方案
不要一次性提前缓存所有元素,改为每次循环时重新查找对应位置的元素,示例代码如下:
import time import random from selenium.common.exceptions import StaleElementReferenceException # 先获取目标元素总数量 date_xpath = '//*[@id="tr-undefined"]/td[1]/span' total_count = len(driver.find_elements_by_xpath(date_xpath)) for idx in range(total_count): # 每次循环重新查找元素,取对应索引的节点 try: current_date = driver.find_elements_by_xpath(date_xpath)[idx] current_date.click() except StaleElementReferenceException: # 偶发刷新未完成的情况,重试一次即可 current_date = driver.find_elements_by_xpath(date_xpath)[idx] current_date.click() # 等待下载完成 time.sleep(random.randint(5, 10))
可选优化
如果点击元素后表格排序会发生变化导致索引失效,可以提前提取所有日期的唯一标识,循环时通过日期文本匹配目标元素再点击即可。
内容的提问来源于stack exchange,提问作者karanrp
相关产品推荐
相关产品推荐

