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

Java 使用for each循环遍历页面时selenium stale元素,java,javascript,selenium,Java,Javascript,Selenium,我一直在尝试制作一个与网站交互的小程序(更准确地说是一个浏览器游戏),从不同的页面获取一些信息并将其打印到GUI上 我得到了打印工作正常,我可以登录没有问题,并浏览该网站。但是,当我尝试获取所需的数据时(这是使用for-each循环完成的),selenium会不断抛出一个“element似乎过时”错误并终止应用程序 我从第一颗行星得到数据,好的,但这就是它的终点。下面是代码片段: public void getResources() { List<WebElemen

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

我得到了打印工作正常,我可以登录没有问题,并浏览该网站。但是,当我尝试获取所需的数据时(这是使用for-each循环完成的),selenium会不断抛出一个“element似乎过时”错误并终止应用程序

我从第一颗行星得到数据,好的,但这就是它的终点。下面是代码片段:

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));
        }
    }
我想可能是因为selenium没有足够的时间加载页面?但是我认为selenium在等待页面下载完成时停止了EDT? 我知道它在我登录时会这样做,因为我的UI目前运行在同一个线程上,并且在selenium加载完页面之前它不会更新

在任何情况下,我都尝试过使用
Thread.sleep()
和driver.wait,它们的长度在50到500之间,但似乎都没有任何效果

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

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

另一编辑:

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


我可能还想补充一点,页面确实是“自我刷新”的。与中一样,我尝试检索的值大约每500毫秒更新一次。

您将获得StaleElementReferenceException。这通常发生在您首次成功定位WebElement,然后

  • 重新加载该页面或导航到其他页面并导航回或
  • 使用Selenium执行了一些操作,导致DOM发生更改
但你还是试着和那个元素互动。后者似乎是你的问题所在。您正在执行
标记。请在代码中单击()。我现在不知道它是做什么的,但我想它会导致一些数据出现?这将导致DOM中的更改,因此在单击之前无法引用所定位的元素。在调用tag.click()之后,您可能每次都需要查找行星列表。(这只是我的猜测,因为您没有写错误发生在哪一行)

WebElement行星;
int size=driver.findElements(By.className(“smallplanet”).size();
对于(int i=0;i
我已经在for循环中使用driver.findElement(By…)的任何一行中指出了错误。每个页面看起来都一样,都有相同的项目,只是值不同。所以这个想法是:-从第一个行星获取资源-去下一个行星-获取资源-去下一个行星-冲洗,重复。因此,实际的行星名称(行星列表中的一个)永远不会改变。但它确实给了我一个想法。页面看起来怎么样并不重要。它们的HTMLs可能完全相同。但它们是不同的页面,不同的DOM。所以你很自然会遇到这个例外。结果证明你一直都是对的。。。更改了代码,现在它会“刷新”每个标记后的行星列表。单击()(基本上如您所说),它就像一个符咒!谢谢你的帮助:)
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
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...
}