Zum Inhalt springen
SDETRole
SDETRole

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, keine WebElement-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.

Tippen Sie, um SDETRole zu durchsuchen.

Volltextsuche mit Pagefind · läuft in Ihrem Browser Suchseite öffnen →