需要注意的一件重要事情是 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 循环运行一次,因为在浏览器实际完全重新加载页面之前,navigate().refresh() 之外的代码不会被执行,但我们已经看到了以下情况:实际上,通过该循环需要几秒钟的时间,因为在浏览器完成加载之前, navigate().refresh() 不会阻塞。