Selenium遇到页面自动刷新导致循环中断 如何实现N个表格行连续遍历
问题根因分析
现有代码的核心问题如下:
- for循环内部执行了
break,每次遍历到第一个tr执行点击操作后就直接跳出for循环,永远只会处理第一行数据,不会继续遍历后续tr - 点击第9列的操作触发页面原生刷新后,此前通过
find_elements_by_xpath获取到的options列表中的所有元素对象都会失效(即Selenium中的StaleElementReferenceException),后续尝试调用这些元素的方法会直接抛出异常 - 异常捕获逻辑包裹在整个while循环外层,只要触发一次异常,整个循环就会终止,无法继续执行后续迭代
解决方案
核心思路是:不缓存元素列表,每次页面刷新后重新获取表格,通过记录当前待处理的tr索引值来实现逐行遍历,直到所有行处理完成。
修正后的代码如下:
import time from selenium.common.exceptions import ElementNotVisibleException, WebDriverException, NoSuchElementException, StaleElementReferenceException # 初始化当前要处理的行索引,从1开始(xpath的tr索引是从1计数) current_tr_index = 1 while True: try: # 如果页面刷新后会跳转到非目标页,再取消注释下方行重新加载目标页 # browser.get('URL') # 每次循环重新获取当前行,避免元素失效 target_tr = browser.find_element_by_xpath(f'//*[@id="event"]/tbody/tr[{current_tr_index}]') # 点击对应列 target_tr.find_element_by_xpath('./td[9]').click() # 等待页面刷新完成,可根据实际情况调整时长,也可替换为显式等待提升稳定性 time.sleep(2.5) # 处理完当前行,索引+1处理下一行 current_tr_index += 1 # 捕获找不到对应行的异常,说明所有行已经处理完成,跳出循环 except NoSuchElementException: print(f"所有行处理完成,共处理{current_tr_index - 1}行") break # 捕获元素失效等其他可重试异常,重试当前行 except (ElementNotVisibleException, WebDriverException, StaleElementReferenceException): time.sleep(1) continue
内容的提问来源于stack exchange,提问作者XFiles
相关产品推荐
相关产品推荐

