在selenium

时间:2016-07-14 05:40:15

标签: java selenium selenium-webdriver selenium-chromedriver

我有以下代码,它获取元素列表,然后在使用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();是否可以在循环中使用?

2 个答案:

答案 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);
} 
相关问题