Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Selenium StaleElementReferenceException_Java_Selenium_Web Crawler - Fatal编程技术网

Java Selenium StaleElementReferenceException

Java Selenium StaleElementReferenceException,java,selenium,web-crawler,Java,Selenium,Web Crawler,嗨,我是新来的Selenium 我正在使用Java库,已经尝试了Chrome和Firefox驱动程序 我在循环。有趣的是,循环有时工作3、2次,但在同一次迭代中并不总是失败。我假设这与某种竞争条件有关(比如等待页面加载)。如果我在调试模式下运行,它似乎工作得很好 我已经尝试过其他答案的建议,比如显式等待和隐式等待,但仍然没有帮助。也许如果你看到密码你可以帮我一把 这是一个循环 WebDriverWait wait = new WebDriverWait(driver,20); WebElemen

嗨,我是新来的
Selenium

我正在使用
Java库
,已经尝试了
Chrome
Firefox
驱动程序

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

我已经尝试过其他答案的建议,比如显式等待和隐式等待,但仍然没有帮助。也许如果你看到密码你可以帮我一把

这是一个循环

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
}
表示您正在访问的DOM元素已从DOM中更改或删除。因此,等到元素可见或存在时才有帮助(之后它们仍然可以得到更新)

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

另一个选择是。但它只适用于单个元素。

意味着您正在访问的DOM元素已被更改或从DOM中删除。因此,等到元素可见或存在时才有帮助(之后它们仍然可以得到更新)

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


另一个选择是。但是它只适用于单个元素。

为了避免出现
StaleElementReferenceException
的情况,可以在find元素期间获取属性。下面是一个片段(
n个子项
第一个索引是1):

List List=searchResults.findElements(按.tagName(“a”));
for(int i=1;i
这样,出现异常的唯一机会是元素在
findElement
getAttribute
之间发生变化,这是不可能的(或者表元素发生变化-
searchResults
)。 当然,有更好的方法来实现这一点,比如围绕
findElement
的包装器函数,或者使用页面对象模式,但对于您的情况来说,它应该足够了


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

为了避免出现
StaleElementReferenceException
,您可以在find元素期间获取属性。下面是一个片段(
n个子项
第一个索引是1):

List List=searchResults.findElements(按.tagName(“a”));
for(int i=1;i
这样,出现异常的唯一机会是元素在
findElement
getAttribute
之间发生变化,这是不可能的(或者表元素发生变化-
searchResults
)。 当然,有更好的方法来实现这一点,比如围绕
findElement
的包装器函数,或者使用页面对象模式,但对于您的情况来说,它应该足够了


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

非常感谢您的回答,我接受了您最后的建议。我不知怎的用一些其他的修改(见上文)来修改它。我不是百分之百的高兴,但是这份工作很重要。非常感谢你的回答,我接受了你最后的建议。我不知怎的用一些其他的修改(见上文)来修改它。我不是百分之百的高兴,但我很高兴这份工作。@Altober,看看这个解决方案,它看起来很完美。嗨,非常感谢。我试过了,但出于某种原因,在经过几次迭代后,执行挂起在for循环中。我会继续探索并带来一些更新。谢谢@Grzegorz让我开心;)。至于挂起,我假设这是因为您有很多来自
a
标记的元素,并且它为每个元素轮询DOM。。。因此,如果你可以通过使用更具体的定位器来缩小列表范围,我想这会有所帮助。i、 e.
By.cssSelector(“a.someClass”)
@Altober,看看这个解决方案,它看起来很完美。嗨,非常感谢。我试过了,但出于某种原因,在经过几次迭代后,执行挂起在for循环中。我会继续探索并带来一些更新。谢谢@Grzegorz让我开心;)。至于挂起,我假设这是因为您有很多来自
a
标记的元素,并且它为每个元素轮询DOM。。。因此,如果你可以通过使用更具体的定位器来缩小列表范围,我想这会有所帮助。i、 e.
By.cssSelector(“a.someClass”)
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")));
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"));
}