Glossaire · Automatisation de l’UI
StaleElementReferenceException
Également appelé : stale element, stale element reference, stale element exception, élément obsolète
Définition
Erreur Selenium levée quand un test utilise un WebElement dont le nœud DOM a été supprimé ou remplacé après sa recherche, généralement à la suite d'un re-rendu.
StaleElementReferenceException signifie que l’élément que votre code détient n’existe plus dans la page. Dans Selenium, un WebElement est une référence vers un nœud DOM précis. Si l’application supprime ce nœud, par exemple parce qu’un framework a re-rendu la liste, que la page a navigué ou qu’une mise à jour AJAX a remplacé une section, la référence ne pointe plus sur rien et tout appel dessus lève cette exception.
Exemple
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
L’élément paraît identique à l’écran, mais c’est un nouveau nœud. L’ancienne référence est morte.
Comment la corriger
Recherchez à nouveau l’élément au moment où vous en avez besoin, et attendez le nouvel état plutôt que d’intercepter l’exception.
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();
Autres pratiques utiles :
- Stockez des locators
By, pas des champsWebElement, dans les page objects. Recherchez l’élément à l’intérieur de chaque méthode. - Attendez la fin de la mise à jour (disparition d’un spinner, changement du nombre de lignes) avant de lire des valeurs.
- Évitez les listes conservées longtemps. Parcourir une
List<WebElement>en cliquant sur des éléments qui déclenchent des re-rendus est une source classique de cette erreur. Refaites la requête par index ou par un attribut unique à chaque passage.
Pourquoi Playwright a rarement ce problème
Un Locator Playwright est une requête, pas une référence vers un nœud. Il résout à nouveau l’élément à chaque action et à chaque assertion : un re-rendu entre deux étapes ne le casse donc pas. L’ElementHandle de plus bas niveau de Playwright peut encore pointer vers un nœud détaché, ce qui est l’une des raisons pour lesquelles la documentation vous oriente vers les locators.
Envelopper chaque appel dans une boucle qui réessaie en cas d’élément obsolète fait disparaître l’erreur mais masque le vrai problème : le test n’attend pas que la page se stabilise.