Glossar · UI-Automatisierung
StaleElementReferenceException
Auch genannt: Stale Element Reference, Stale Element Exception, Stale Element, veraltete Elementreferenz
Definition
Ein Selenium-Fehler, der auftritt, wenn ein Test ein WebElement verwendet, dessen DOM-Knoten nach dem Finden entfernt oder ersetzt wurde, typischerweise nach einem Re-Render.
StaleElementReferenceException bedeutet, dass das Element, das Ihr Code festhält, nicht mehr in der Seite existiert. Ein WebElement in Selenium ist eine Referenz auf genau einen DOM-Knoten. Entfernt die Anwendung diesen Knoten, etwa weil ein Framework die Liste neu gerendert hat, die Seite navigiert wurde oder ein AJAX-Update einen Abschnitt ersetzt hat, zeigt die Referenz ins Leere, und jeder Aufruf darauf wirft diese Exception.
Beispiel
WebElement firstRow = driver.findElement(By.cssSelector("table tbody tr"));
driver.findElement(By.id("sort-by-date")).click(); // table body is re-rendered
firstRow.getText(); // StaleElementReferenceException
Das Element sieht auf dem Bildschirm identisch aus, ist aber ein neuer Knoten. Die alte Referenz ist tot.
Wie Sie es beheben
Suchen Sie das Element in dem Moment erneut, in dem Sie es brauchen, und warten Sie auf den neuen Zustand, statt die Exception abzufangen.
By firstRow = By.cssSelector("table tbody tr");
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement before = driver.findElement(firstRow);
driver.findElement(By.id("sort-by-date")).click();
// Wait until the old node is gone, then look up the new one
wait.until(ExpectedConditions.stalenessOf(before));
String text = driver.findElement(firstRow).getText();
Weitere hilfreiche Muster:
By-Locatoren speichern, keineWebElement-Felder, in Page Objects. Suchen Sie das Element innerhalb jeder Methode.- Warten, bis das Update abgeschlossen ist (ein Spinner verschwindet, eine Zeilenanzahl ändert sich), bevor Sie Werte auslesen.
- Langlebige Listen vermeiden. Über eine
List<WebElement>zu iterieren und dabei Elemente anzuklicken, die ein Re-Render auslösen, ist eine klassische Quelle dieses Fehlers. Fragen Sie bei jedem Durchlauf erneut per Index oder über ein eindeutiges Attribut ab.
Warum Playwright dieses Problem selten hat
Ein Playwright-Locator ist eine Abfrage, keine Knotenreferenz. Er löst das Element bei jeder Aktion und Assertion neu auf, sodass ein Re-Render zwischen zwei Schritten ihn nicht bricht. Das niedrigere ElementHandle von Playwright kann allerdings weiterhin auf einen abgehängten Knoten zeigen; das ist ein Grund, warum die Dokumentation Sie in Richtung Locatoren lenkt.
Jeden Aufruf in eine Retry-on-Stale-Schleife zu verpacken, lässt den Fehler verschwinden, verdeckt aber das eigentliche Problem: Der Test wartet nicht, bis die Seite zur Ruhe gekommen ist.