首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >硒: StaleElementReferenceException

硒: StaleElementReferenceException
EN

Stack Overflow用户
提问于 2016-03-08 06:29:12
回答 2查看 154关注 0票数 1

我研究这个错误已经有一段时间了,我尝试过很多事情,但似乎没有什么效果.

代码语言:javascript
复制
        while(!driver.findElements(By.className("next")).isEmpty()) { 
            //elements = driver.findElements(By.xpath("//a[@class='name']"));
            elements = findDynamicElements("//a[@class='name']");
            for (WebElement e : elements) {
                userName = e.getText(); //<--EXCEPTION HERE
                check_visitor_profile(userName);//<--WE LEAVE THE PAGE HERE
                Thread.sleep(3000); //<--NO TRY/CATCH BLOCK FOR READABILITY
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                elements = findDynamicElements("//a[@class='name']");

            }
            driver.findElement(By.xpath("VisitsNext")).click();
        }       



protected List<WebElement> findDynamicElements(String path) {
        List<WebElement> result;
        String xPath = path;
        new WebDriverWait(driver, 25).until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(xPath)));
        //new WebDriverWait(driver, 25).until(elementIdentified(By.id(path)));

        try {
            result = driver.findElements(By.xpath(xPath));
            return result;
        }
        catch(WebDriverException e) {
            return null;
        }
    );
    }

我的代码显示在分配userName的for循环的第一行。我在这个论坛上看到,您应该使用'presenceOfElementLocated‘,并显式地等待元素返回,但这也不起作用。我在列表中使用了'presenceOfAllElementsLocatedBy‘,但是我有一个使用'presenceOfElementLocated’的方法,这个方法也不起作用。

我知道像Thread.sleep和implicitlyWait行这样的东西在这一点上可能是不必要的,但是我已经尝试了所有的东西,但是它不起作用.

出现错误是因为当我调用'check_visitor_profile‘时,它离开了页面--当它返回时,元素就不合适了,所以我必须再次找到它们。但它还是抛出了例外。

有什么想法吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-08 07:09:11

这个问题可能会发生,因为您正在循环中间更改elements。即使没有StaleElementReferenceException,它也会给您带来麻烦。使用for循环而不是for each循环

代码语言:javascript
复制
elements = findDynamicElements("//a[@class='name']");
int size = elements.size();
for (int i = 0 ; i < size ; ++i) {
    elements = findDynamicElements("//a[@class='name']");
    userName = elements.get(i).getText();
    check_visitor_profile(userName);
}
票数 1
EN

Stack Overflow用户

发布于 2016-03-08 12:54:47

显式地处理异常,因为元素不再附加到DOM,或者在调用"check_visitor_profile“时发生了更改

请参阅下面的链接可能会有所帮助

代码语言:javascript
复制
            catch(StateElementException e){
             System.out.println("StaleElement dealt with since you successfully left page "); 
              }

reference.jsp

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35860520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档