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

Python Selenium:双层循环返回后页面刷新引发陈旧元素引用异常

Selenium 陈旧元素引用问题修复方案

核心问题分析

  • 外层while True循环每次都重新请求页面,导致每次循环都从第一个div开始处理,永远走不完所有元素
  • 点击返回按钮后页面DOM重新渲染,之前获取的divs列表里的元素全部失效,再次遍历时触发stale element reference错误
  • 固定time.sleep()稳定性差,容易因加载延迟导致元素定位失败

修复后的代码

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.elizabethnj.org/Directory.aspx")
driver.maximize_window()

# 获取顶部菜单的元素数量,用于循环计数
div_count = len(WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.XPATH, '//div[@class="topmenu"]/div'))
))

# 按索引遍历每个菜单元素,避免引用失效
for index in range(div_count):
    # 每次循环重新定位当前索引的菜单元素
    current_div = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, f'//div[@class="topmenu"]/div[{index+1}]'))
    )
    current_div.click()
    
    # 等待联系人表格加载完成
    contacts = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.XPATH, '//*[@id="cityDirectoryDepartmentDetails"]/tbody/tr'))
    )
    for contact in contacts:
        print(contact.text)
    
    # 点击返回按钮,等待页面回到菜单页面
    back_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="CityDirectoryLeftMargin"]/div[3]/span'))
    )
    back_btn.click()
    
    # 等待菜单元素重新加载完成,确保下一次定位有效
    WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.XPATH, '//div[@class="topmenu"]/div'))
    )

driver.quit()

关键改动说明

  • 去掉外层无限while循环,改为按菜单元素数量循环,避免重复刷新页面从头开始
  • 改用索引定位元素,每次循环都重新从DOM获取当前要点击的元素,彻底避免陈旧引用问题
  • 替换固定time.sleep()为WebDriverWait显式等待,等待元素可点击/出现后再操作,提升稳定性
  • 每次点击返回后,等待菜单元素重新加载完成,确保下一次循环能正常定位

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:37:38