Saltar al contenido
SDETRole
SDETRole

Glosario · Automatización de UI

StaleElementReferenceException

También llamado: stale element, stale element reference, elemento obsoleto, referencia a elemento obsoleta

Definición

Error de Selenium que se lanza cuando un test usa un WebElement cuyo nodo del DOM se eliminó o se reemplazó después de encontrarlo, normalmente tras un re-render.

StaleElementReferenceException significa que el elemento que tu código tiene guardado ya no existe en la página. Un WebElement de Selenium es una referencia a un nodo concreto del DOM. Si la aplicación elimina ese nodo, por ejemplo porque un framework volvió a renderizar la lista, la página navegó o una actualización AJAX reemplazó una sección, la referencia no apunta a nada y cualquier llamada sobre ella lanza esta excepción.

Ejemplo

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

En pantalla el elemento parece idéntico, pero es un nodo nuevo. La referencia antigua está muerta.

Cómo solucionarlo

Vuelve a buscar el elemento en el momento en que lo necesitas y espera al nuevo estado en lugar de capturar la excepción.

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();

Otros patrones que ayudan:

  • Guarda locators By, no campos WebElement, en los page objects. Busca el elemento dentro de cada método.
  • Espera a que termine la actualización (que desaparezca un spinner, que cambie el número de filas) antes de leer valores.
  • Evita las listas de larga vida. Recorrer una List<WebElement> mientras se hace clic en elementos que provocan re-renders es una fuente clásica de este error. Vuelve a consultar por índice o por un atributo único en cada iteración.

Por qué Playwright rara vez tiene este problema

Un Locator de Playwright es una consulta, no una referencia a un nodo. Vuelve a resolver el elemento en cada acción y aserción, así que un re-render entre pasos no lo rompe. El ElementHandle de más bajo nivel de Playwright sí puede apuntar a un nodo desconectado, y esa es una de las razones por las que la documentación te orienta hacia los locators.

Envolver cada llamada en un bucle de reintento ante elementos obsoletos hace desaparecer el error, pero oculta el problema real: el test no está esperando a que la página se estabilice.

Escribe para buscar en todo SDETRole.

Búsqueda de texto completo con Pagefind · se ejecuta en tu navegador Abrir la página de búsqueda →