在selenium WebDriver中导航时出现StaleElementReferenceException

时间:2014-02-25 08:51:03

标签: java javascript selenium selenium-webdriver

我正在尝试使用Selenium WebDriver在网页中抓取一些锚点。我能想到的方法是将锚点放在一个列表中,然后点击每个锚点并在每次点击后向后导航。这是我的代码:

        WebDriver webDriver=new FirefoxDriver();
        webDriver.get(SEARCH_URL);
        WebElement form2=webDriver.findElement(By.id("frmMain"));
        form2.submit();
        System.out.println(webDriver.getCurrentUrl());
        List<WebElement>doctorAnchors=webDriver.findElements(By.xpath("//td[@class='data']/a"));
        int count=0;
        for(WebElement anchr:doctorAnchors){
            anchr.click();
            System.out.println((count++)+" : "+webDriver.getPageSource().toString());
            Thread.sleep(10000);
            webDriver.navigate().back();
        }

代码只是通过Anchors中的第一个元素,执行click,获取页面,但是当我向后导航时,它会给出:

Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up
Command duration or timeout: 169 milliseconds

我在相同的异常中经历了各种stackoverflow帖子,并意识到它可能是由页面中的一些javascript内容引起的,似乎也是正确的,因为页面网址是:http://www.somepage.com/dispatch我是否去任何锚点。我可以像往常一样在驱动程序打开的Web浏览器中导航回来。但为什么webDriver.navigate().back()失败了?点击链接后如何导航回来?有没有办法可以保存驱动程序的状态,点击后单击并恢复该状态?

3 个答案:

答案 0 :(得分:3)

我在下面给出的是您的解决方案的示例。在这里,我已经调用了一个方法,getElementWithIndex这样做..这有效!!

在此示例中,它捕获特定frame | class | id下的所有链接并逐个导航

driver.get("www.xyz.com");  
WebElement element = driver.findElement(By.id(Value));
List<WebElement> elements = element.findElements(By.tagName("a"));
int sizeOfAllLinks = elements.size();
System.out.println(sizeOfAllLinks);

for(int i=0; i<sizeOfAllLinks ;i++)
{
     System.out.println(elements.get(i).getAttribute("href"));
}

for (int index=0; index<sizeOfAllLinks; index++ )
{
     getElementWithIndex(By.tagName("a"), index).click();
     driver.navigate().back();
}

public WebElement getElementWithIndex(By by, int index)
{
     WebElement element = driver.findElement(By.id(Value));
     List<WebElement> elements = element.findElements(By.tagName("a")); 
     return elements.get(index);
}

答案 1 :(得分:3)

当您更改页面时,您将失去对该元素的引用,因为它不再位于DOM中。一个简单的方法是在返回页面后再次获得锚点。基本上得到锚的数量并做一段时间。在那段时间里,总是得到锚列表,并从该列表中获得所需的锚点。

答案 2 :(得分:0)

        WebDriver webDriver=new FirefoxDriver();
            webDriver.get(SEARCH_URL);
            WebElement form2=webDriver.findElement(By.id("frmMain"));
            form2.submit();
            System.out.println(webDriver.getCurrentUrl());
            List<WebElement>doctorAnchors=webDriver.findElements(By.xpath("//td[@class='data']/a"));
            boolean x = false;
            int c = doctorAnchors.size();
            for(int i=0; i<c; I++){
                 if(x){

List<WebElement>doctorAnchors=webDriver.findElements(By.xpath("//td[@class='data']/a"));
                  }
            curElement = doctorAnchors.get(i);

            curElement .click();
            System.out.println((count++)+" : "+webDriver.getPageSource().toString());
            Thread.sleep(10000);
            webDriver.navigate().back();
            x = true;
            doctorAnchors = new ArrayList<WebElement>();
             }

我是这样实现的。 :)