注意すべき重要な点の 1 つは、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 ループは 1 回実行されます。これは、ブラウザーが実際にページを完全にリロードするまで、navigate().refresh() を超えるコードが実行されないためです。ブラウザの読み込みが完了するまで、navigate().refresh() がブロックされなかったため、実際にはそのループを通過するのに数秒かかります。