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 camposWebElement, 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.