注意すべき重要な点の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();
}
いくつかのメモ:
- ページを再読み込みしているため、特定の要素の存在を確認することはできません。要素は、再読み込みの開始前と終了後に存在するためです。したがって、場合によってはtrueになることもありますが、ページはまだロードを開始していません。
- ページが再読み込みされるときに、WebElement.isDisplayed()をチェックすると、StaleElementReferenceExceptionがスローされます。残りはすべての拠点をカバーすることです
- getName():ページの名前を取得する内部メソッド
- getMaximumLoadTime():ページのロードを許可する時間を秒単位で返す内部メソッド
- verify():内部メソッドは、ページが実際にロードされていることを確認します
この場合も、ほとんどの場合、do / whileループは1回実行されます。navigate()。refresh()を超えるコードは、ブラウザーが実際にページを完全に再ロードするまで実行されないためですが、ブラウザがロードを完了するまで、navigate()。refresh()がブロックしなかったため、実際にはそのループを通過するのに数秒かかります。