页面刷新后出现stale element reference错误,求Selenium代码解决方案
页面刷新后Stale Element Reference错误的解决办法
问题根源
页面刷新后,你之前在循环外定位的table元素已经失效——因为整个DOM重新渲染了,旧的table元素不再附着在当前页面文档上,后续用它查找子元素自然会报错。
修正代码
把表格的定位逻辑移到while循环内部,每次刷新页面后重新获取最新的table元素:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC while True: # 每次刷新后重新等待表格加载并定位 table = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div[" "1]/section/section/section/main/section/section/div[" "2]/div/div[2]/div[1]/div/div[2]/table"))) # 等待表格行全部加载完成 rows = WebDriverWait(table, 999).until(EC.presence_of_all_elements_located((By.XPATH, ".//tbody/tr"))) for row in rows: td_list = [td.text for td in row.find_elements(By.XPATH, ".//td")] if td_list[2] == "Done": print(f"{td_list[1]}\n{td_list[2]}\n{td_list[9]}\n{td_list[15]}\n{td_list[19]}\n") driver.refresh()
额外优化点
- 别用绝对XPATH,这种路径只要页面结构稍微变一点就会失效,建议换成基于元素属性的定位,比如表格的
id、class,或者包含的特征文本。 - 加个异常捕获,防止偶尔页面加载失败导致程序直接崩掉:
while True: try: table = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "..."))) rows = WebDriverWait(table, 999).until(EC.presence_of_all_elements_located((By.XPATH, ".//tbody/tr"))) for row in rows: td_list = [td.text for td in row.find_elements(By.XPATH, ".//td")] if td_list[2] == "Done": print(f"{td_list[1]}\n{td_list[2]}\n{td_list[9]}\n{td_list[15]}\n{td_list[19]}\n") driver.refresh() except Exception as e: print(f"出错了: {e}") driver.refresh()
内容的提问来源于stack exchange,提问作者Nggarap
相关产品推荐
相关产品推荐

