Pular para o conteúdo
SDETRole
SDETRole

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

Digite para buscar em todo o SDETRole.

Busca de texto completo com Pagefind · roda no seu navegador Abrir página de busca →