2013-08-31 89 views
3

我一直在尝试制作一个小程序,它将与网站(浏览器游戏更精确)进行交互,从不同页面获取一些信息并将其打印到一个GUI。当遍历页面使用for-each循环时硒元素陈旧元素

我得到了印刷工作正常,我可以登录没有问题,并导航网站。但是当我尝试获取我需要的数据(这是使用for-each循环完成的)硒继续抛出一个“元素似乎是陈旧”的错误并终止应用程序。

我从第一个星球得到的数据没问题,但这就是它结束的地方。下面的代码片段:

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 

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

在任何情况下,我已经尝试使用Thread.sleep()和driver.wait不同长度在50和500之间,但都没有任何效果。

(注:我支持JavaScript的HtmlUnitDriver)

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

另一个编辑:

我现在包裹在一个while循环,保持执行相同的尝试每个findElement声明只要抛出异常就可以捕获块。 但它只是一个无限循环,不断抛出相同的陈旧元素异常。

我可能还想补充说,页面确实是“自我刷新”。如在,我试图检索每500毫秒左右更新一次的值。

回答

5

您正在获取StaleElementReferenceException。这通常发生在你第一次成功定位WebElement然后你

  • 重新加载页面或导航到不同的页面和导航背部或
  • 执行某些动作与硒导致的变化在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... 
} 
+0

我在使用了driver.findElement(通过...)的换内的任何线精确定位错误循环。 每页*看起来相同,具有相同的项目只是不同的值。 这样的想法是: - 获取资源形成第一行星 - 去下一个星球 - 获取资源 - 去下一个星球 - 漂洗,重复。 所以实际的星球名称(行星列表里面的那个)永远不会改变。但它确实给了我一个主意。 – killernerd

+0

页面的外观如何并不重要。他们的HTML可能完全一样。但它们是不同的页面,不同的DOM。所以很自然你会得到这个例外。 – JacekM

+0

原来你一直都是...... 改变了代码,所以它现在每刷新一次tag.click()后刷新行星列表(基本上就像你说的),它就像一个魅力! 感谢您的帮助:) – killernerd

相关问题