当前位置: 首页 > 知识库问答 >
问题:

在selenium-Java中获取错误“Stale element reference:元素未附加到页面文档”

童琪
2023-03-14

我必须通过Foreach循环迭代List,并需要单击项目。列表的第一项正在被点击,但从第二项开始我得到

组织。openqa。硒。StaleElementReferenceException:stale元素引用:元素未附加到页面文档

public void checkFlightAvailabilityToSelectOutBound() throws InterruptedException {

    boolean enabledFound=BookDateFlight();
    System.out.println("checkFlightAvailabilityToSelectOutBound  "+enabledFound);

    if(enabledFound==false)
    {
        List<WebElement> nextAvailableDateList = driver
                .findElements(By.xpath("somexpath"));
        System.out.println("date list lenth "+nextAvailableDateList.size());
        **for (WebElement nxtAvlDate : nextAvailableDateList) 
        {
            try {
            System.out.println("------"+nxtAvlDate);
            System.out.println("Trying to click on the nxt avl date "+nxtAvlDate.getAttribute("id"));
            //wait.until(ExpectedConditions.elementToBeClickable(nxtAvlDate));
            //driver.navigate().refresh();
            Thread.sleep(3000);
            nxtAvlDate.click();
            Thread.sleep(5000);**
            //wait.until(ExpectedConditions.visibilityOfAllElements(flightInfoOutBoundTravelClassBtnList));
            }catch(Exception e) {
                e.printStackTrace();
                System.out.println("message catch"+e.getMessage());

            }

            enabledFound=BookDateFlight();
            System.out.println("After clicking nxt avil date "+enabledFound);
            if(enabledFound==true)
            {
                break;
            }
        }
        if(enabledFound==false)
        {
            System.out.println("inside next 7 day");
            driver.findElement(By.xpath("//p[@class='next']")).click();
            System.out.println("inside next 7 day clicked");
            Thread.sleep(10000);
            checkFlightAvailabilityToSelectOutBound();

            }

    }

}

共有2个答案

轩辕啸
2023-03-14

它通常发生在dom刷新时。在执行单击之前,请尝试以下显式等待

wait.until(ExpectedConditions.stalenessOf(nxtAvlDate));
刘高峯
2023-03-14

在stalleelement异常的情况下,问题通常是由于这样一个事实,即请求对已更新或新元素的引用(即使它可能具有相同的id),因此我们对它的引用无效。它可以通过要求项目的干净引用或在工作流中添加等待来解决

你可以试试这样:

WebDriverWait wait = (WebDriverWait)new WebDriverWait(driver,timeout)
                  .ignoring(StaleElementReferenceException.class); 
  wait.until(new ExpectedCondition<Boolean>(){ 
    @Override 
    public Boolean apply(WebDriver webDriver) { 
      WebElement element = webDriver.findElement(by); 
      return element != null && element.isDisplayed(); 
    } 
  }); 

使其适应您的代码

 类似资料:
  • 我正在尝试访问一系列的网页和递归。访问一个页面,然后返回,然后移动到下一个页面,依此类推。用我的代码,我可以访问第一页,然后返回到上一页,但我不能访问下一页,并得到一个陈旧的元素引用错误。我通读了关于这个错误的答案,但仍然不知道我的代码在哪里更改了状态... 下面是我的代码

  • 我正在网页上做分页。其中20个帐户已经加载到页面上,在再次单击该按钮后,又加载了20个帐户。第三次点击后,按钮从网页上消失,所有帐户都已加载。但我得到以下错误: “org.openqa.selenium.staleElementReferenceException:过时元素引用:元素未附加到页面文档”

  • 我得到了这个错误,当我试图点击一个下拉ID: 我想用这个代码: 有没有什么方法可以防止无限循环,或者更好的方法在我得到这个异常后点击id?

  • 我正在构建一个刮网站的c#应用程序。我认为这个问题是因为页面在一次又一次提交表单后被重新加载而导致的。我必须从选择列表中选择一个选项,然后按回车键,等待页面重新加载新结果。但是重新加载后会导致此错误; 我的代码是这样的; 我也尝试过类似的东西; 时间不多了,我有个例外,时间不多了。

  • 我知道这是一个重复的问题,但我没有得到解决方案,因此再问一次。 我正在使用selenium C#,并在同一页面上的同一个操作中得到上述错误。我的测试在本地机器上运行良好,但当我通过TFS在服务器上执行时,相同的测试不一致。 我在测试中做了一些更改,因为它在单击操作后重新加载DOM,现在我在本地机器上重新加载对象后检查它是否正常工作,但在服务器上不一致。如果选中了复选框,我需要取消选中。我在包含此复

  • 所以我正在尝试制作一个在flickr上运行的程序,我已经准备好了所有的东西,直到cookies弹出,它打败了我。 我正在尝试切换到这个iframe,这样我就可以使用“全部接受”按钮。然而,iframe的ID是动态的,所以为了避免这个问题,我尝试以标题为目标。 但是我现在收到了这个错误消息。 我已经尝试添加了10秒的等待时间来给它加载时间,我知道错误的原因是元素不再连接到DOM,但我不知道要使用什么