需要注意的重要一件事是,driver.navigate()。refresh()调用有时似乎是异步的,这意味着它不等待刷新完成,而只是“开始刷新”并且不阻止进一步执行当浏览器重新加载页面时。
虽然这似乎仅在少数情况下发生,但我们认为最好通过添加手动检查页面是否真正开始重新加载来确保其100%有效。
这是我在基页对象类中为此编写的代码:
public void reload() {
// remember reference to current html root element
final WebElement htmlRoot = getDriver().findElement(By.tagName("html"));
// the refresh seems to sometimes be asynchronous, so this sometimes just kicks off the refresh,
// but doesn't actually wait for the fresh to finish
getDriver().navigate().refresh();
// verify page started reloading by checking that the html root is not present anymore
final long startTime = System.currentTimeMillis();
final long maxLoadTime = TimeUnit.SECONDS.toMillis(getMaximumLoadTime());
boolean startedReloading = false;
do {
try {
startedReloading = !htmlRoot.isDisplayed();
} catch (ElementNotVisibleException | StaleElementReferenceException ex) {
startedReloading = true;
}
} while (!startedReloading && (System.currentTimeMillis() - startTime < maxLoadTime));
if (!startedReloading) {
throw new IllegalStateException("Page " + getName() + " did not start reloading in " + maxLoadTime + "ms");
}
// verify page finished reloading
verify();
}
一些注意事项:
- 由于您正在重新加载页面,因此不能仅检查给定元素的存在,因为该元素将在重新加载开始之前和完成之后存在。因此有时您可能会成真,但页面甚至尚未开始加载。
- 重新加载页面时,检查WebElement.isDisplayed()将引发StaleElementReferenceException。剩下的只是覆盖所有基地
- getName():获取页面名称的内部方法
- getMaximumLoadTime():内部方法,该方法返回应允许在几秒钟内加载多长时间的页面
- verify():内部方法确保页面实际加载
同样,在大多数情况下,do / while循环只运行一次,因为在浏览器实际完全重载页面之前,不会执行navigation()。refresh()之外的代码,但是我们已经看到了其中实际上需要花费几秒钟来完成该循环,因为navigation()。refresh()直到浏览器完成加载才被阻塞。