Selenium点击分页按钮触发StaleElementReferenceException求助
解决Selenium分页跳转的StaleElementReferenceException问题
异常原因
你遇到的StaleElementReferenceException是因为页面分页后DOM发生了重新渲染,你之前提前获取的span_element等元素引用已经失效——这些引用指向的是旧页面中的元素,新页面加载后它们在DOM中不存在了,自然无法操作。
前两次跳转没出问题只是巧合,本质上每次分页后DOM都会更新,之前缓存的元素引用都已经无效,第三次操作才触发了异常。
修复方案
核心原则:每次点击下一页前,重新定位目标元素,不要复用之前的元素对象。
方案1:直接定位下一页的a标签(最可靠)
a标签是实际的跳转链接,直接点击它比点击内部的span元素更稳定,代码也更简洁:
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "li.pager__item--next a"))).click()
方案2:精准定位目标span元素(每次重新查找)
如果一定要点击span元素,不要提前缓存region_content或span_element,每次都通过WebDriverWait重新定位当前DOM中的元素:
# 直接等待第二个span元素可点击,每次操作都重新查找 next_button = wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR, "li.pager__item--next a > span:nth-child(2)") )).click()
额外优化:等待页面加载完成
如果是AJAX异步加载的分页,可以在点击后等待页面内容更新(比如等待列表元素变化,或者分页按钮的href属性更新),避免后续操作过早执行:
# 点击前记录当前页面的分页链接 current_page_href = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "li.pager__item--next a"))).get_attribute("href") # 点击下一页 wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "li.pager__item--next a"))).click() # 等待旧分页链接失效,确认页面加载完成 wait.until(EC.staleness_of(driver.find_element(By.CSS_SELECTOR, f'a[href="{current_page_href}"]')))
旧代码出错的根源
你的代码先获取region_content和span_element,这些元素对象是绑定到当前页面DOM的。当分页跳转后,新页面的DOM替换了旧DOM,span_element[1]已经变成了失效的引用,再用它去等待可点击自然会抛出异常。
内容的提问来源于stack exchange,提问作者econnoob5
相关产品推荐
相关产品推荐

