陈旧元素引用

**陈旧元素引用** 错误是 WebDriver 错误,它发生是因为引用的 网页元素 不再附加到 DOM

每个 DOM 元素在 WebDriver 中都由一个唯一的标识引用表示,称为网页元素。网页元素引用是一个 UUID,用于执行针对特定元素的命令,例如 获取元素的标签名称检索元素的属性

当某个元素不再附加到 DOM 时,例如它已从文档中删除或文档已更改,则称其为陈旧。例如,当您拥有网页元素引用并且它获取到的文档发生导航时,就会发生陈旧情况。

示例

文档导航

导航后,所有对先前文档的网页元素引用将与文档一起被丢弃。这将导致任何后续与 网页元素 的交互都失败,并出现陈旧元素引用错误。

python
import urllib

from selenium import webdriver
from selenium.common import exceptions

def inline(doc):
    return "data:text/html;charset=utf-8,{}".format(urllib.quote(doc))

session = webdriver.Firefox()
session.get(inline("<strong>foo</strong>"))
foo = session.find_element_by_css_selector("strong")

session.get(inline("<i>bar</i>"))
try:
    foo.tag_name
except exceptions.StaleElementReferenceException as e:
    print(e)

输出

StaleElementReferenceException: The element reference of e75a1764-ff73-40fa-93c1-08cb90394b65 is stale either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

节点移除

当文档节点从 DOM 中移除时,其网页元素引用将失效。这也会导致任何后续与 网页元素 的交互都失败,并出现陈旧元素引用错误。

python
import urllib

from selenium import webdriver
from selenium.common import exceptions

def inline(doc):
    return "data:text/html;charset=utf-8,{}".format(urllib.quote(doc))

session = webdriver.Firefox()
session.get(inline("<button>foo</button>"))
button = session.find_element_by_css_selector("button")
session.execute_script("""
    let [button] = arguments;
    button.remove();
    """, script_args=(button,))

try:
    button.click()
except exceptions.StaleElementReferenceException as e:
    print(e)

输出

StaleElementReferenceException: The element reference of e75a1764-ff73-40fa-93c1-08cb90394b65 is stale either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

另请参阅