1

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

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

仔细观察浏览器的运行情况,我发现 url 框中的 url 与实际显示的页面不匹配。网址的变化比页面快得多。我怀疑正在发生的事情是驱动程序在调用 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 的元素。

4

1 回答 1

1

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

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

在strategy的描述中unstable写的几乎相同:

有一个 beta 功能可以让 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,会有一个空白页面,它需要等待一个元素出现在页面上。

于 2014-01-06T22:37:00.840 回答