我研究这个错误已经有一段时间了,我尝试过很多事情,但似乎没有什么效果.
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‘时,它离开了页面--当它返回时,元素就不合适了,所以我必须再次找到它们。但它还是抛出了例外。
有什么想法吗?
谢谢。
发布于 2016-03-08 07:09:11
这个问题可能会发生,因为您正在循环中间更改elements。即使没有StaleElementReferenceException,它也会给您带来麻烦。使用for循环而不是for each循环
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);
}发布于 2016-03-08 12:54:47
显式地处理异常,因为元素不再附加到DOM,或者在调用"check_visitor_profile“时发生了更改
请参阅下面的链接可能会有所帮助
catch(StateElementException e){
System.out.println("StaleElement dealt with since you successfully left page ");
}reference.jsp
https://stackoverflow.com/questions/35860520
复制相似问题