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

Selenium运行报stale element reference异常问题求助

异常产生原因

你遇到的StaleElementReferenceException和find_elements找不到元素返回空数组的逻辑无关,触发异常的根本原因是:
你提前通过driver.find_elements_by_class_name("msg-conversation-listitem")拿到了所有消息列表项的引用存入members变量,但领英消息页是动态渲染的,可能因为新消息推送、列表懒加载、页面局部刷新等原因,导致members中存储的DOM节点被页面移除或替换,此时这些引用就变成了“过时”的无效引用。后续你遍历members对无效引用的元素调用i.find_elements方法时,就会抛出该异常。

修复方案

可以从以下几个维度优化代码解决问题:

  • 增加显式等待,确保页面完全加载稳定后再提取元素,避免拿取元素后页面还在渲染替换DOM节点
  • 缩短元素引用的持有时间,不要提前把所有列表元素存下来再遍历处理,尽量做到拿到元素后立刻提取所需的文本、属性,不需要保留元素对象本身
  • 增加异常捕获重试机制,遇到该异常时重新获取最新的列表元素再重试操作
  • 避免对同一个元素多次调用查找方法,减少触发异常的概率

以下是优化后的代码示例:

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

def get_last_messages(driver: WebDriver, db: Db, retry_times=3):
    safe_open(driver, "https://www.linkedin.com/messaging", db)
    # 显式等待消息列表加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CLASS_NAME, "msg-conversation-listitem"))
    )
    
    for _ in range(retry_times):
        try:
            result = []
            # 每次重试都重新获取最新的列表元素,不持有旧引用
            members = driver.find_elements_by_class_name("msg-conversation-listitem")
            for item in members:
                # 拿到元素后立刻提取所有需要的内容,不保留元素引用
                snippet_ele = item.find_elements_by_class_name("msg-conversation-card__message-snippet-body")
                if not snippet_ele:
                    continue
                title_row_ele = item.find_elements_by_class_name("msg-conversation-card__title-row")
                if not title_row_ele:
                    continue
                time_ele = title_row_ele[0].find_elements_by_tag_name("time")
                if not time_ele:
                    continue
                result.append((snippet_ele[0].text, time_ele[0].text))
            return result
        except StaleElementReferenceException:
            # 遇到元素失效异常则进入下一轮重试,重新获取列表
            continue
    # 重试多次仍失败则返回空列表
    return []

内容的提问来源于stack exchange,提问作者DFX Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:15:03