Selenium跳转页面返回后迭代元素报stale element reference错误如何解决
StaleElementReferenceException错误解决办法
错误原因
你触发报错的核心原因是:首次进入列表页时你一次性获取了所有列表项元素存储到divs变量中,当点击元素进入详情页、再返回列表页后,整个页面的DOM树已经重新渲染,之前缓存的divs里的元素已经脱离了当前页面文档,属于过期引用,循环到第二个元素操作时就会抛出该错误。
修复方案
调整逻辑,不要提前缓存所有列表元素,改为先获取列表总长度,每次循环时重新从当前页面获取对应索引的列表项操作,修改后的代码如下:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import time url = 'https://register.fca.org.uk/s/search?q=capital&type=Companies' service = Service('你的chromedriver路径') driver = webdriver.Chrome(service=service) driver.get(url) # 先等列表加载完成,替换固定sleep WebDriverWait(driver, 20).until( EC.presence_of_all_elements_located((By.XPATH, '//div[@class="result-card_main"]')) ) # 只获取列表总数量,不缓存元素 item_count = len(driver.find_elements(By.XPATH, '//div[@class="result-card_main"]')) for i in range(item_count): # 每次循环都重新获取当前页面的列表元素 divs = driver.find_elements(By.XPATH, '//div[@class="result-card_main"]') d = divs[i] RN = '' companyName = '' companyName = d.find_element(By.TAG_NAME, 'h2').text RNData = d.find_element(By.XPATH, './/div[@class="result-card_figure-offset"]').text RN = RNData.split(':')[1].strip() d.click() # 等详情页指定元素加载完成 WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.XPATH, '//*[@id="who-is-this-details-content"]/div[1]/div[2]/div[2]/div/div/div[2]')) ) phoneNumber = '' phoneNumberData = driver.find_elements(By.XPATH, '//*[@id="who-is-this-details-content"]/div[1]/div[2]/div[2]/div/div/div[2]') phoneNumber = phoneNumberData[0].text.split('\n')[1] print(RN) print(companyName) print(phoneNumber) driver.execute_script("history.back();") # 返回后等列表重新加载完成再进入下一次循环 WebDriverWait(driver, 20).until( EC.presence_of_all_elements_located((By.XPATH, '//div[@class="result-card_main"]')) )
额外优化点
- 替换了固定
time.sleep()为显式等待WebDriverWait,既可以避免页面加载不完全导致的报错,也能减少不必要的等待时间 - 调整了driver初始化写法,兼容Selenium 4+版本的API规范,如果你用的是旧版本Selenium可以改回你原来的初始化逻辑
内容的提问来源于stack exchange,提问作者dfcsdf
相关产品推荐
相关产品推荐

