Veralteter Elementverweis
Der veraltete Elementverweis-Fehler ist ein WebDriver-Fehler, der auftritt, weil das referenzierte Webelement nicht mehr an den DOM angehängt ist.
Jedes DOM-Element wird in 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. den Tag-Namen eines Elements zu erhalten und eine Eigenschaft eines Elements abzurufen.
Wenn ein Element nicht mehr an den DOM angehängt ist, d.h. es wurde aus dem Dokument entfernt oder das Dokument hat sich geändert, gilt es als veraltet. Veraltetsein tritt zum Beispiel auf, wenn Sie eine Webelement-Referenz haben und das Dokument, aus dem sie abgerufen wurde, navigiert.
Beispiele
Dokumentnavigation
Beim Navigieren werden alle Webelement-Referenzen auf das vorherige Dokument zusammen mit dem Dokument verworfen. Dies führt dazu, dass jede nachfolgende Interaktion mit dem Webelement mit dem veralteten Elementverweis-Fehler fehlschlägt:
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
Knotenentfernung
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 veralteten Elementverweis-Fehler fehlschlägt:
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
- Webelement
- Zugehörige Befehle: