FirefoxDriver webdriver.load.strategy不稳定的findelements从错误的页面获取元素

时间:2014-01-06 16:33:00

标签: selenium selenium-webdriver selenium-firefoxdriver

我在一个快速移动几个相似但不相同的页面的应用程序中使用FirefoxDriver。为了加快执行速度(我需要使用FF),我将webdriver.load.strategy属性设置为'unstable'。这确实通过不完全加载页面来加快速度,但我发现了一个非常奇怪的错误。

在检查包含页面列表及其数据的文件时,我发现某些页面与错误的数据相匹配。当我调试时,一切都在步进时工作正常,但是一旦我让程序运行了几个页面,它就开始从错误的页面再次获取数据。 (要澄清,例如,如果我执行了driver.get(www.google.com),然后是driver.get(www.stackoverflow.com),然后执行driver.findElements()以获取StackOverflow的页面标题,则会返回“Google”。)

当仔细观察浏览器运行时,在我看来,网址框中的网址与实际显示的网页之间存在不匹配。网址的变化速度比网页快得多。我怀疑发生的事情是驱动程序在调用findElements之前没有等待页面完全加载,因此从前一页获取具有相同类名的元素。

考虑到webdriver.load.strategy'stable'应该做什么,这是有道理的,但是我在页面上设置了一个等待元素并且它似乎没有等待。是不是因为每个页面都有相同的元素,所以元素已经可见了?我不能等待其他任何事情,因为所有页面都有相同的设置 - 它只是单独的文本不同,我不知道提前会是什么。

有没有人遇到过这个问题?我的假设是什么导致问题正确?除了去除不稳定的负载策略之外,我能做些什么吗?

谢谢,   BSG 的修改 我正在添加一些代码,即使代码在未设置webdriver.load.strategy'stable'时也能正常工作。

for(String url : urllist)
{
  driver.get(url);
  WebElement header = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.tagName("h1")));
  elements = driver.findElements(By.className(elementclassname));
}

请注意,每页都有一个h1和几个带有class = elementclassname的元素。

1 个答案:

答案 0 :(得分:1)

  

我怀疑发生的事情是驱动程序在调用findElements之前没有等待页面完全加载,因此从前一页获取具有相同类名的元素。

我认为你的假设是正确的。

description of unstable strategy

中写的几乎相同
  

有一个测试版功能可以让firefox在调用.get或.click之后不等待整页加载。这可能导致立即查找中断,所以请务必使用隐式或显式等待。

作为(不太好看)的解决方法,您可以将driver引用到不包含presenceOfElementLocated()中元素的网页(例如,空白页)。

类似的东西:

for(String url : urllist)
{
  driver.get(url);
  WebElement header = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.tagName("h1")));
  elements = driver.findElements(By.className(elementclassname));
  driver.get("about:blank"); // <<<<<<<<<<
}

因此,当driver到达新url时,会有一个空白页面,并且需要等待元素出现在页面上。