java - 使用 for-each 循环遍历页面时的 Selenium 陈旧元素

标签 java javascript 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));
        }
    }

这是错误:

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

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

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

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

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

另一个编辑:

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

我可能还想补充一点,该页面确实是“ self 刷新”的。正如我尝试检索的值每 500 毫秒左右更新一次。

最佳答案

您收到 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...
}

关于java - 使用 for-each 循环遍历页面时的 Selenium 陈旧元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552311/

相关文章:

java - 如何将json解析为对象

java - 在你的macbook上,显示你的IDEA scala插件版本可以工作吗?

java - 为什么 Spring Boot 中使用 ExecutorCompletionService 的线程不并行启动?

javascript - 增加数组的属性/方法?

java - 无法在原始类型 void 上调用 sendKeys(String)

python - MAC 上的 Selenium,消息 : 'chromedriver' executable may have wrong permissions

java - Neo4j Wildfly OGM 。在本地单元测试中工作正常,但在部署后因资源异常而失败

javascript - Mongoose 获取字段总和

java - if 条件在 selenium webdriver 中出现错误

javascript - 随内容增加元素宽度,否则宽度相等 - CSS