Glossário · Automação de UI
StaleElementReferenceException
Também chamado de: stale element, stale element reference, elemento stale, stale element exception
Definição
Erro do Selenium lançado quando um teste usa um WebElement cujo nó no DOM foi removido ou substituído depois de encontrado, normalmente após uma nova renderização.
StaleElementReferenceException significa que o elemento que o seu código está segurando não existe mais na página. Um WebElement no Selenium é uma referência a um nó específico do DOM. Se a aplicação remove esse nó, por exemplo porque um framework renderizou a lista de novo, a página navegou ou uma atualização AJAX substituiu uma seção, a referência passa a apontar para o nada e qualquer chamada sobre ela lança essa exceção.
Exemplo
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
O elemento parece idêntico na tela, mas é um nó novo. A referência antiga está morta.
Como resolver
Encontre o elemento de novo no momento em que precisar dele e espere pelo novo estado, em vez de capturar a exceção.
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();
Outros padrões que ajudam:
- Guarde locators
By, e não camposWebElement, nos page objects. Busque o elemento dentro de cada método. - Espere a atualização terminar (um spinner sumir, a quantidade de linhas mudar) antes de ler valores.
- Evite listas de vida longa. Iterar sobre uma
List<WebElement>enquanto clica em itens que disparam novas renderizações é uma fonte clássica desse erro. Faça a consulta de novo por índice ou por um atributo único a cada passada.
Por que o Playwright raramente tem esse problema
Um Locator do Playwright é uma consulta, e não uma referência a um nó. Ele resolve o elemento de novo a cada ação e assertion, então uma nova renderização entre os passos não o quebra. O ElementHandle, de nível mais baixo, ainda pode apontar para um nó desanexado, e esse é um dos motivos pelos quais a documentação recomenda usar locators.
Envolver cada chamada em um loop de retry quando ocorre o stale faz o erro sumir, mas esconde o problema real: o teste não está esperando a página se estabilizar.