Selenium中click()后driver.find_elements()返回结果异常求助
问题解决方案
1. 彻底解决StaleElementReferenceException
核心思路是绝不缓存WebElement对象,每次操作前都从当前页面的DOM重新定位元素——因为跳转详情页再返回后,原页面的DOM已重新渲染,之前的WebElement全部失效。
具体实现逻辑:
# 先获取当前页的企业总数(可从分页栏或元素数量提取) total_items = len(driver.find_elements(By.CSS_SELECTOR, "你的企业元素选择器")) for i in range(total_items): # 每次循环都重新抓取当前页的企业列表 current_items = driver.find_elements(By.CSS_SELECTOR, "你的企业元素选择器") if i >= len(current_items): continue # 防止索引越界 # 提取当前企业的名称、国家 company_name = current_items[i].find_element(By.CSS_SELECTOR, "名称选择器").text country = current_items[i].find_element(By.CSS_SELECTOR, "国家选择器").text # 进入详情页 current_items[i].click() # 抓取邮箱信息 email = driver.find_element(By.CSS_SELECTOR, "邮箱选择器").text # 返回列表页 driver.back() # 强制等待列表页重新加载完成(关键步骤) WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "你的企业元素选择器")) )
2. 修复重新获取列表内容不一致的问题
问题本质是页面Ajax未加载完成就执行了元素定位,手动浏览时浏览器自动等待,但代码需要显式控制:
- 用
WebDriverWait代替time.sleep(),确保元素完全加载后再操作:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 返回列表页后,等待企业容器或分页控件可见,确认页面加载完成 wait = WebDriverWait(driver, 15) wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "企业列表容器选择器")))
- 每次获取列表后,判断列表长度是否符合预期(比如等于每页固定数量),不符合则重新等待加载。
3. 高效优化方案:批量处理详情页链接
避免来回跳转导致的DOM刷新问题,先抓取所有详情页链接,再通过新标签页批量处理:
# 先获取当前页所有企业的详情页链接 links = [item.get_attribute("href") for item in driver.find_elements(By.CSS_SELECTOR, "企业名称链接选择器")] for link in links: # 打开新标签页 driver.execute_script("window.open('');") driver.switch_to.window(driver.window_handles[1]) driver.get(link) # 抓取邮箱信息 email = driver.find_element(By.CSS_SELECTOR, "邮箱选择器").text # 关闭标签页并切回列表页 driver.close() driver.switch_to.window(driver.window_handles[0])
内容的提问来源于stack exchange,提问作者rahimai
相关产品推荐
相关产品推荐

