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

为何代码无法点击列表所有元素?遇StaleElementReferenceException报错

问题分析与解决方案

错误原因

  • StaleElementReferenceException 本质:你最初获取的cities列表中的元素,是绑定在初始页面的DOM节点上的。当调用driver.back()返回原页面时,页面会重新渲染,旧DOM被销毁,原来的元素引用就失效了,自然无法再操作。
  • 双击操作不合理:Agoda的城市条目默认是单击跳转,双击可能触发异常页面行为,导致后续流程混乱。

解决方案

方案1:先收集所有城市URL,直接访问(推荐,更稳定)

这种方式避免了页面来回跳转导致的元素失效问题,先一次性提取所有城市的链接,再逐个访问:

url = "https://www.agoda.com/region/punjab-province-pk.html"

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

s=Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=s)
driver.implicitly_wait(5)
driver.get(url)

# 收集所有城市的名称和跳转链接
city_links = []
# 定位到<a>标签,直接获取href属性
city_elements = driver.find_elements(By.CSS_SELECTOR, 'dt[data-selenium="neighbor-name"] a')
for elem in city_elements:
    city_name = elem.text
    city_url = elem.get_attribute('href')
    city_links.append((city_name, city_url))

# 逐个访问每个城市页面
for name, link in city_links:
    print(name)
    driver.get(link)
    print(driver.current_url)
    # 在这里添加你需要在城市页面执行的操作

方案2:每次返回后重新获取元素(适合必须用back()的场景)

如果必须保留来回跳转的逻辑,需要在每次回到原页面后重新查询元素列表,用索引循环而非直接遍历旧元素:

url = "https://www.agoda.com/region/punjab-province-pk.html"

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

s=Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=s)
driver.implicitly_wait(5)
driver.get(url)

# 先获取城市总数
total_cities = len(driver.find_elements(By.CSS_SELECTOR, 'dt[data-selenium="neighbor-name"]'))

for i in range(total_cities):
    # 每次循环重新查询元素,确保引用有效
    cities = driver.find_elements(By.CSS_SELECTOR, 'dt[data-selenium="neighbor-name"]')
    current_city = cities[i]
    print(current_city.text)
    # 改用单击跳转,符合页面交互逻辑
    current_city.click()
    print(driver.current_url)
    driver.back()
    # 等待页面加载完成,避免后续元素查询失败
    driver.implicitly_wait(3)

关键注意点

  • 避免复用页面跳转后的旧元素引用:只要页面发生刷新、跳转、back/forward,之前获取的元素都会失效,必须重新查询。
  • 遵循页面原生交互逻辑:优先使用页面设计的交互方式(比如单击而非双击),减少异常触发概率。

内容的提问来源于stack exchange,提问作者Abdullah Shahzad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:26:01