我有以下代码,它获取元素列表,然后在使用driver.navigate().back();
List<WebElement> listingWebElementList = driver.findElements(By.xpath("(//span[@id='titletextonly'])"));
for (WebElement listingElement : listingWebElementList)
{
Thread.sleep(5000);
listingElement.click();
Thread.sleep(5000);
driver.navigate().back();
}
在第二轮循环中,使用chromedriver时出现以下错误
org.openqa.selenium.StaleElementReferenceException:陈旧元素 reference:元素未附加到页面文档
我在FirefoxDriver中遇到以下错误
org.openqa.selenium.StaleElementReferenceException:找不到元素 在缓存中 - 也许页面自查找以来已经发生了变化
driver.navigate().back();
是否可以在循环中使用?
答案 0 :(得分:4)
当DOM发生变化或刷新时,“驱动程序”会丢失之前找到的所有WebElements
。您需要在循环的每次迭代中重新定位列表
int size = 1;
for (int i = 0 ; i < size ; ++i) {
List<WebElement> listingWebElementList = driver.findElements(By.xpath("(//span[@id='titletextonly'])"));
size = listingWebElementList.size();
Thread.sleep(5000);
listingWebElementList.get(i).click();
Thread.sleep(5000);
driver.navigate().back();
}
您可以使用索引跟踪列表中的位置。
答案 1 :(得分:1)
您的问题发生了,因为当您再次导航回来时,该元素不再有效。要避免这种情况,请使用以下代码:
List<WebElement> listingWebElementList = driver.findElements(By.xpath("(//span[@id='titletextonly'])"));
int size = listingWebElementList.size();
for (int i=0;i<size;i++)
{
List<WebElement> listingWebElementListInLoop = driver.findElements(By.xpath("(//span[@id='titletextonly'])"));
Thread.sleep(5000);//don't use this kind of wait. wait using until.
listingWebElementListInLoop.get(i).click();
Thread.sleep(5000);
driver.navigate().back();
Thread.sleep(2000);
}