尝试重新标识对象时StaleElementReferenceException

时间:2014-08-05 07:46:13

标签: selenium selenium-webdriver

当我向前移动并回到父页面时,我面临着识别对象的问题。

以下是该方案。我想点击主页上的每个链接并打印页面标题并导航回主页。

以下是我试过的代码。它可以正常点击第一个链接并返回主页。此时,需要识别列表对象,不包括已访问过的链接。怎么做?

在QTP中,我们有RefreshObject和Init来执行此操作。 WebDriver中是否有类似的方法?

WebDriver driver = new FirefoxDriver();
driver.get("http://www.googl.com/");
driver.manage().window().maximize();

List<WebElement> objWEs = driver.findElements(By.tagName("a"));
for(WebElement e:objWEs)
{
    if(!e.getText().isEmpty())
    {
        e.click();
        System.out.println(driver.getTitle());
        driver.navigate().back();
    }
}
driver.close();

2 个答案:

答案 0 :(得分:1)

只要您导航到另一个网页,或者甚至切换到同一网页中的iframe,您在内存中的任何WebElement对象都可能会过时&#34;陈旧& #34;

一个可选的解决方案是列出所有元素ID,然后迭代该列表:

Set<String> linkIds = new HashSet<String>();
List<WebElement> links = driver.findElements(By.tagName("a"));
for (WebElement link : links)
{
    if(!link.getText().isEmpty())
        linkIds.add(link.getAttribute("id"));
}
for (String linkId : linkIds)
{
    driver.findElement(By.id(linkId)).click();
    System.out.println(driver.getTitle());
    driver.navigate().back();
}

但请注意,以上所有内容均假设每个链接都有唯一的ID,并且当您导航回网页时,所有链接都会保留在网页中。如果您访问的特定网页不是这种情况,则需要采用其他方法。

当您导入和导出网页时,假设链接保持相同的顺序,您可以迭代链接ID,而不是迭代链接ID。但这有点效率较低,因为您必须在每次迭代开始时检索所有链接的完整列表。

for (int i=0; true; i++)
{
    List<WebElement> links = driver.findElements(By.tagName("a"));
    if (i >= links.size())
        break;
    links.get(i).click();
    System.out.println(driver.getTitle());
    driver.navigate().back();
}

当您导航回网页时,上面的代码应该,即使链接不按相同的顺序。但是,在这种情况下,你很可能会错过其中一些。

答案 1 :(得分:0)

以下是我上述问题的完整代码。

        WebDriver driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(1, TimeUnit.MINUTES);
        driver.get("http://www.googl.com/");
        driver.manage().window().maximize();

        for (int i=0; true; i++)
        {
            List<WebElement> links = driver.findElements(By.tagName("a"));
            if (i >= links.size())
                break;
            WebElement ele=links.get(i);
            if(!ele.getText().isEmpty())
            {
                ele.click();
                System.out.println(driver.getTitle());
                driver.navigate().back();
            }
        }

        driver.close();