java - rodrigo - elemento obsoleto de referencia: el elemento no está adjunto al documento de la página
manila filipinas (7)
Tengo una lista que tiene múltiples enlaces debajo de cada sección. Cada sección tiene los mismos enlaces. Debo hacer clic en un enlace particular debajo de cada sección. He escrito el siguiente código, pero cuando se ejecuta me da una stale element reference: element is not attached to the page document
error del stale element reference: element is not attached to the page document
.
Este es mi código:
public static void main(String[] args) throws InterruptedException
{
WebDriver driver = new ChromeDriver();
driver.navigate().to("url......");
driver.findElement(By.id("Login1_txtEmailID")).sendKeys("[email protected]");
driver.findElement(By.id("Login1_txtPassword")).sendKeys("Testing1*");
driver.findElement(By.id("Login1_btnLogin")).click();
List<WebElement> LeftNavLinks=driver.findElements(By.xpath("//*[@id=''sliding-navigation'']//a"));
Thread.sleep(1000);
String ben="Benefit Status";
String[] linkTexts = new String[LeftNavLinks.size()];
int i = 0;
for (WebElement e : LeftNavLinks)
{
linkTexts[i] = e.getText();
System.out.print(i+" " + linkTexts[i]+"/n");
if(linkTexts[i].equals(ben))
{
String BenefitStatLi="//*[@id=''sliding-navigation'']/li[%s]/a";
System.out.print(i+" " + linkTexts[i]+"/n");
driver.findElement(By.xpath(String.format(BenefitStatLi,i))).click();
driver.findElement(By.xpath("//* [@id=''divContentHolder'']/div[1]/a[1]")).click();
}
i++;
}
}
}
Esta es la estructura HTML es la siguiente
<div id="ucAdminMenu_divMenu">
<ul id="sliding-navigation">
<li class="sliding-element">
<a href=" ">Claims Status</a>
</li>
<li class="sliding-element">
<a href=" ">Eligibility Status</a>
</li>
<li class="sliding-element">
<h3>Section-1</h3>
</li>
<li class="sliding-element">
<a href=" ">Forms and Documents</a>
</li>
<li class="sliding-element">
<a href=" HourBank.aspx?id=002">Hour Bank</a>
</li>
<li class="sliding-element">
<h3>Section-2</h3>
</li>
<li class="sliding-element">
<a href=" ">Benefit Status</a>
</li>
<li class="sliding-element">
<a href=" ">Forms and Documents</a>
</li>
<li class="sliding-element">
<h3>Section-3</h3>
</li>
<li class="sliding-element">
<a href=" ">Forms and Documents</a>
</li>
<li class="sliding-element">
<h3>Testing Fund</h3>
</li>
<li class="sliding-element">
<a href=" ">Benefit Status</a>
</li>
<li class="sliding-element">
<a href=" ">Order ID Card</a>
</li>
</ul>
</div>
El rastro de error es:
Exception in thread "main"
org.openqa.selenium.StaleElementReferenceException: stale element
reference: element is not attached to the page document
¿Cuál es la línea que da excepción?
La razón de esto es porque el elemento al que ha referido se elimina de la estructura DOM
Estaba enfrentando el mismo problema mientras trabajaba con IEDriver. La razón fue porque javascript cargó el elemento una vez más después de haberlo referido, por lo que mi referencia de fecha apuntaba a un objeto inexistente, incluso si era correcto su interfaz de usuario. Usé la siguiente solución.
try {
WebElement date = driver.findElement(By.linkText(Utility.getSheetData(path, 7, 1, 2)));
date.click();
}
catch(org.openqa.selenium.StaleElementReferenceException ex)
{
WebElement date = driver.findElement(By.linkText(Utility.getSheetData(path, 7, 1, 2)));
date.click();
}
¡Vea si lo mismo puede ayudarlo!
Lo que pasa aquí es que estás usando un bucle for fuera de tu enunciado condicional.
Después de que se cumplan las condiciones en su instrucción IF, probablemente navegue a otra página, por lo tanto, cuando el bucle for intente iterar una vez más, obtendrá el error del elemento obsoleto porque se encuentra en una página diferente.
Puede agregar un descanso al final de su declaración if, esto funcionó para mí.
Para manejarlo, utilizo el siguiente método de clic. Esto intentará encontrar y hacer clic en el elemento. Si el DOM cambia entre buscar y hacer clic, lo intentará de nuevo. La idea es que si falla y lo intento de nuevo inmediatamente, el segundo intento tendrá éxito. Si los cambios DOM son muy rápidos, esto no funcionará.
public boolean retryingFindClick(By by) {
boolean result = false;
int attempts = 0;
while(attempts < 2) {
try {
driver.findElement(by).click();
result = true;
break;
} catch(StaleElementException e) {
}
attempts++;
}
return result;
}
Solo rompa el ciclo cuando encuentre el elemento sobre el que desea hacer clic. por ejemplo:
List<WebElement> buttons = getButtonElements();
for (WebElement b : buttons) {
if (b.getText().equals("Next"){
b.click();
break;
}
Usa este código:
public class LinkTest
{
public static void main(String[] args)
{
WebDriver driver = new FirefoxDriver();
driver.navigate().to("file:///C:/Users/vkiran/Desktop/xyz.html");
List<WebElement> alllinks =driver.findElements(By.xpath("//*[@id=''sliding-navigation'']//a"));
String a[]=new String[alllinks.size()];
for(int i=0;i<alllinks.size();i++)
{
a[i]=alllinks.get(i).getText();
if(a[i].startsWith("B"))
{
System.out.println("clicking on this link::"+driver.findElement(By.linkText(a[i])).getText());
driver.findElement(By.linkText(a[i])).click();
}
else
{
System.out.println("does not starts with B so not clicking");
}
}
}
}
use este código para esperar hasta que el elemento esté conectado:
boolean breakIt = true;
while (true) {
breakIt = true;
try {
// write your code here
} catch (Exception e) {
if (e.getMessage().contains("element is not attached")) {
breakIt = false;
}
}
if (breakIt) {
break;
}
}
try {
WebElement button = driver.findElement(By.xpath("xpath"));
button.click();
}
catch(org.openqa.selenium.StaleElementReferenceException ex)
{
WebElement button = driver.findElement(By.xpath("xpath"));
button.click();
}
Este código try / catch realmente funcionó para mí. Tengo el mismo error de elemento obsoleto.