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

硒StaleElementReferenceException
EN

Stack Overflow用户
提问于 2017-01-22 14:50:11
回答 2查看 169关注 0票数 1

嗨,我是Selenium的新手

我正在使用Java library,已经尝试了ChromeFirefox驱动程序。

我在运行一个循环。有趣的是,循环有时工作3,2次,但在同一次迭代中并不总是失败。我认为这与某种竞争条件有关(比如等待页面加载)。如果我在调试模式下运行,它似乎工作得很好。

我已经尝试过来自其他答案的建议,比如wait explicitlyimplicitly,但仍然没有帮助。如果你看到密码你可以帮我一把。

这是一个循环。

代码语言:javascript
复制
WebDriverWait wait = new WebDriverWait(driver,20);
WebElement searchResults = driver.findElement(new By.ById("searchresults"));
searchResults = searchResults.findElement(new By.ByClassName("table"));
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.tagName("a")));
List<WebElement> list=searchResults.findElements(By.tagName("a"));
for(WebElement w: list) {
  result.add(w.getAttribute("href")); //EXCEPTION HAPPENS ALWAYS HERE
}

溶液

解决办法是一次彻底的攻击。我还是不明白,但这是我的工作。如果有人知道为什么请告诉我。

我只是移动所有的等待,它表现得更好。如果异常随数据检查抛出,我还建议@Cyril重新运行迭代,以确保我得到了我想要的所有东西。

代码语言:javascript
复制
WebDriverWait wait = new WebDriverWait(driver,20);
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(new By.ById("searchresults")));
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(new By.ByClassName("table"))); 
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.tagName("a")));
EN

回答 2

Stack Overflow用户

发布于 2017-01-22 15:49:26

StaleElementReferenceException意味着您访问的DOM元素被更改或从DOM中删除。因此,等到元素可见或出现都没有帮助(它们仍然可以在那之后得到更新)。

在查找任何DOM元素之前,您可能可以通过Thread.sleep显式地等待5秒来修复异常。

另一种选择是如果抛出异常,请再次查找元素。。但它只适用于单一元素。

票数 2
EN

Stack Overflow用户

发布于 2017-01-22 17:24:10

为了避免StaleElementReferenceException,您可以在查找元素期间获得属性。下面是一个片段(nth-child第一个索引是1):

代码语言:javascript
复制
List<WebElement> list=searchResults.findElements(By.tagName("a"));
for(int i = 1; i < list.length; i++) {
   result.add(searchResults.findElement(By.cssSelector("a:nth-child(" + i + ")")).getAttribute("href"));
}

这样,异常的唯一机会是如果元素在findElementgetAttribute之间发生变化,这是不可能的(或者表元素更改- searchResults)。当然,有更好的方法来实现这一点,比如围绕findElement的包装函数或使用Page模式,但就您的情况而言,它就足够了。

编辑:您的解决方案可能有效,因为它使脚本等待页面完全加载,然后元素不再更改。

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

https://stackoverflow.com/questions/41792341

复制
相关文章

相似问题

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