嗨,我是Selenium的新手
我正在使用Java library,已经尝试了Chrome和Firefox驱动程序。
我在运行一个循环。有趣的是,循环有时工作3,2次,但在同一次迭代中并不总是失败。我认为这与某种竞争条件有关(比如等待页面加载)。如果我在调试模式下运行,它似乎工作得很好。
我已经尝试过来自其他答案的建议,比如wait explicitly和implicitly,但仍然没有帮助。如果你看到密码你可以帮我一把。
这是一个循环。
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重新运行迭代,以确保我得到了我想要的所有东西。
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")));发布于 2017-01-22 15:49:26
StaleElementReferenceException意味着您访问的DOM元素被更改或从DOM中删除。因此,等到元素可见或出现都没有帮助(它们仍然可以在那之后得到更新)。
在查找任何DOM元素之前,您可能可以通过Thread.sleep显式地等待5秒来修复异常。
另一种选择是如果抛出异常,请再次查找元素。。但它只适用于单一元素。
发布于 2017-01-22 17:24:10
为了避免StaleElementReferenceException,您可以在查找元素期间获得属性。下面是一个片段(nth-child第一个索引是1):
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"));
}这样,异常的唯一机会是如果元素在findElement和getAttribute之间发生变化,这是不可能的(或者表元素更改- searchResults)。当然,有更好的方法来实现这一点,比如围绕findElement的包装函数或使用Page模式,但就您的情况而言,它就足够了。
编辑:您的解决方案可能有效,因为它使脚本等待页面完全加载,然后元素不再更改。
https://stackoverflow.com/questions/41792341
复制相似问题