You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:01:31