使用for-each循环遍历页面时的selenium stale元素

kil*_*erd 3 javascript java selenium

我一直在尝试制作一个与网站互动的小程序(更精确的浏览器游戏),从不同页面获取一些信息并将其打印到GUI.

我打印工作正常,我可以登录没有问题,并导航网站.但是当我尝试获取我需要的数据时(使用for-each循环完成),selenium不断抛出"元素似乎过时"错误并终止应用程序.

我从第一个星球上得到了数据,但这就是它结束的地方.这是代码片段:

public void getResources()
    {
        List<WebElement> planets = driver.findElements(By.className("smallplanet"));
        String name;
        int metal;
        int crystal;
        int deuterium;
        int energy;
        boolean firstPlanet = true;

        for(WebElement planet : planets)
        {       
            if(!firstPlanet)
            {
                WebElement tag = planet.findElement(By.tagName("a"));
                tag.click();
            } else
            {
                firstPlanet = false;
            }

            name = planet.findElement(By.className("planet-name")).getText();
            System.out.println(name);
            metal = Integer.parseInt(driver.findElement(By.id("resources_metal")).getText().replace(".", ""));
            crystal = Integer.parseInt(driver.findElement(By.id("resources_crystal")).getText().replace(".", ""));
            deuterium = Integer.parseInt(driver.findElement(By.id("resources_deuterium")).getText().replace(".", ""));
            energy = Integer.parseInt(driver.findElement(By.id("resources_energy")).getText().replace(".", ""));        

            resources.add(new ResourceLine(name, metal, crystal, deuterium, energy));
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是错误:

Element appears to be stale. Did you navigate away from the page that contained it?  And is the current window focussed the same as the one holding this element?
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '2.35.0', revision: 'c916b9d', time: '2013-08-12 15:42:01'
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_03'
Driver info: driver.version: HtmlUnitDriver
Run Code Online (Sandbox Code Playgroud)

我想这可能是因为硒没有足够的时间加载页面?但我认为selenium在等待页面下载完成时停止了EDT?我知道它在我登录时这样做是因为我的UI现在在同一个线程上运行,并且在selenium完成加载页面之前它不会更新.

在任何情况下,我都尝试使用Thread.sleep()和driver.wait不同的长度在50到500之间,但似乎都没有任何影响.

(注意:我已为HtmlUnitDriver启用了javascript)

编辑:我已经调试了一些,我现在可以确认它不是因为没有足够的时间来加载页面.该程序确实等待新页面加载,但由于一些奇怪的原因它仍然抛出该异常...

另一个编辑:

我现在将每个findElement语句包装在一个while循环中,只要抛出异常,它就会一直执行相同的try-catch块.但它只是一个无限循环,不断抛出相同的陈旧元素异常.

我可能还想补充说,页面确实是"自我刷新".就像在,我试图检索的值每500ms左右更新一次.

Jac*_*ekM 5

您正在获取StaleElementReferenceException.这通常发生在您第一次成功找到WebElement然后您

  • 重新加载页面或导航到不同的页面并导航回来或
  • 用Selenium执行了一些操作,导致了DOM的变化

你仍然试图与那个元素进行交互.后者似乎是你的问题.您正在执行tag.click()代码.我现在不知道它做了什么,但我想它会导致一些数据出现?这会导致DOM发生更改,因此您无法在单击之前引用您找到的元素.在调用tag.click()之后,您可能需要每次都查找行星列表.(这只是我的猜测,因为你没有写出错误发生在哪一行)

WebElement planet;
int size = driver.findElements(By.className("smallplanet")).size();
for(int i=0; i < size; i++)
{           
    if(!firstPlanet)
    {
        planet = driver.findElements(By.className("smallplanet")).get(i);
        WebElement tag = planet.findElement(By.tagName("a"));
        tag.click();
        planet = driver.findElements(By.className("smallplanet")).get(i);

    } else
    {
        firstPlanet = false;
        planet = driver.findElements(By.className("smallplanet")).get(i);
    }
    //rest of the code...
}
Run Code Online (Sandbox Code Playgroud)