Question référence des éléments obsolètes: l'élément n'est pas attaché au document de la page


J'ai une liste qui contient plusieurs liens sous chaque section. Chaque section a les mêmes liens que je dois cliquer sur un lien particulier sous chaque section. J'ai écrit le code ci-dessous mais quand il s'exécute il me donne stale element reference: element is not attached to the page document Erreur.

Ceci est mon code:

public static void main(String[] args) throws InterruptedException 
{
    WebDriver driver = new ChromeDriver();
    driver.navigate().to("url......");
        driver.findElement(By.id("Login1_txtEmailID")).sendKeys("hourbank5@....com");
    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++;
    }
}

}

Ceci est la structure HTML est comme ci-dessous

<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>

La trace d'erreur est:

    Exception in thread "main" 
org.openqa.selenium.StaleElementReferenceException: stale element 
reference: element is not attached to the page document

36
2017-08-14 07:49


origine


Réponses:


Quelle est la ligne qui donne exception?

La raison en est que l'élément auquel vous vous êtes référé est supprimé de la structure DOM

J'étais confronté au même problème en travaillant avec IEDriver. La raison en est que javascript a chargé l'élément une fois de plus après que je me soit référé, donc ma référence de date désignait un objet inexistant, même s'il était correct dans l'interface utilisateur. J'ai utilisé la solution de contournement suivante.

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

Voyez si la même chose peut vous aider!


38
2017-08-14 07:58



utilisez ce code pour attendre que l'élément soit attaché:

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;
        }

    }

5
2018-06-25 22:20



Pour y faire face, j'utilise la méthode clic suivante. Cela tentera de trouver et de cliquer sur l'élément. Si le DOM change entre la recherche et le clic, il essaiera à nouveau. L’idée est que si elle échoue et que je réessaye immédiatement, la deuxième tentative réussira. Si les modifications du DOM sont très rapides, cela ne fonctionnera pas.

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;
}

4
2018-01-09 04:05



Utilisez ce code:

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");
            }
        }
}
}

3
2017-12-24 07:41



La chose ici est que vous utilisez une boucle for en dehors de votre instruction conditionnelle.

Une fois que les conditions de votre instruction IF sont remplies, vous accédez probablement à une autre page. Par conséquent, lorsque la boucle for tente de réitérer une nouvelle fois, vous obtenez l'erreur d'élément obsolète car vous êtes sur une autre page.

Vous pouvez ajouter un Pause à la fin de votre déclaration si cela a fonctionné pour moi.


2
2017-10-16 18:50



Il suffit de casser la boucle lorsque vous trouvez l'élément que vous souhaitez cliquer dessus. par exemple:

  List<WebElement> buttons = getButtonElements();
    for (WebElement b : buttons) {
        if (b.getText().equals("Next"){
            b.click();
            break;
        }

1
2017-10-15 10:04



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

Ce code try / catch a fonctionné pour moi. J'ai eu la même erreur d'élément obsolète.


-1
2018-06-25 15:48