我正在尝试使用Selenium Webdriver自动执行涉及JavaServer Page的任务。我已经构建了一个大约90%的时间都可以运行的测试,这意味着Webdriver可以完成所有任务而不会出现任何错误。在测试期间,浏览器执行以下操作:
不幸的是,有些时候Webdriver会在其中一个步骤中随机失败。这是因为它无法找到某些内容,例如“找不到帧”,“无法找到带链接文本的元素......”以及其他类似错误。我不确定为什么有时会发生这种情况,并且它似乎在测试的不同阶段随机发生。我搜索了一个解决方案,我能做的最好的事情就是在程序的各个阶段使用thread.sleep减慢Webdriver的速度。这似乎是解决问题的一种非常随意的方式,我甚至不确定问题是驱动程序移动得太快。即使我放慢了半秒钟,我仍然有时会出错。我是Selenium的新用户,我不知道这通常是个问题。有没有人有更好的方法来解决这个问题?我忽略了一些简单的事情吗?
答案 0 :(得分:1)
这是一个常见问题,而不是使用Thread.sleep(duration)
,您应该更好地创建一些实用工具方法,例如
public WebElement waitForElementPresent(By by, int timeout) {
WebDriverWait wait = new WebDriverWait(driver, timeout);
WebElement element = null;
try {
element = wait.until(ExpectedConditions.presenceOfElementLocated(by));
} catch (TimeoutException e) {
e.printStackTrace();
}
return element;
}
这样一来,如果元素已经存在,你就不会等待,如果它正在加载它会等到它找到它或者直到超时被触发
答案 1 :(得分:1)
我最初使用线程休眠来开发我的脚本。但是,尽管脚本在开发过程中起作用,但在生产运行中不可实现,因为它不一致地失败 - 这增加了挫败感。这是因为线程休眠利用固定的等待时间,如果元素没有及时附加,它将无法通过测试。 singe31 已经提供了有效的解决方案。另一种解决方案是使用 fluentWait :
public void fluentWait(final By by)
{
FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(60, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(by);
}
});
}
在这里,Selenium Webdriver将等待至少60秒才能找到一个元素,直到它抛出TimeOutException。否则,它将轮询DOM以每5秒找到一个元素,如果找不到该元素,将忽略“NoSuchElementException”异常。
您必须面对的另一个问题是StaleStateReference或NoSuchElementException。您可以查看this link以解决该问题。
希望它有所帮助。