Stale element reference

Der Fehler stale element reference ist ein WebDriver-Fehler, der auftritt, weil das referenzierte Webelement nicht mehr mit dem DOM verbunden ist.

Jedes DOM-Element wird im WebDriver durch eine eindeutige Identifikationsreferenz dargestellt, bekannt als Webelement. Die Webelement-Referenz ist eine UUID, die verwendet wird, um Befehle auszuführen, die auf bestimmte Elemente abzielen, wie z.B. Abrufen des Tag-Namens eines Elements und Abrufen einer Eigenschaft eines Elements.

Wenn ein Element nicht mehr mit dem DOM verbunden ist, d.h. es aus dem Dokument entfernt wurde oder sich das Dokument geändert hat, wird es als veraltet bezeichnet. Veralterung tritt beispielsweise auf, wenn Sie eine Webelement-Referenz haben und das Dokument, aus dem sie abgerufen wurde, navigiert.

Beispiele

Dokumentnavigation

Bei einer Navigation werden alle Webelement-Referenzen zum vorherigen Dokument zusammen mit dem Dokument verworfen. Dies führt dazu, dass jede nachfolgende Interaktion mit dem Webelement mit dem Fehler "stale element reference" fehlschlägt:

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)

Ausgabe:

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

Knotenanwendung

Wenn ein Dokumentknoten aus dem DOM entfernt wird, wird seine Webelement-Referenz ungültig. Dies führt ebenfalls dazu, dass jede nachfolgende Interaktion mit dem Webelement mit dem Fehler "stale element reference" fehlschlägt:

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)

Ausgabe:

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

Siehe auch