Satu hal penting yang perlu diperhatikan adalah bahwa panggilan driver.navigate (). Refresh () kadang-kadang tampaknya tidak sinkron, artinya tidak menunggu refresh selesai, itu hanya "memulai refresh" dan tidak memblokir eksekusi lebih lanjut saat browser memuat ulang halaman.
Walaupun ini hanya terjadi pada sebagian kecil kasus, kami memperkirakan bahwa lebih baik memastikan ini berfungsi 100% dengan menambahkan pemeriksaan manual apakah halaman tersebut benar-benar mulai memuat ulang.
Berikut kode yang saya tulis untuk itu di kelas objek halaman dasar kami:
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();
}
Beberapa catatan:
- Karena Anda memuat ulang halaman, Anda tidak bisa begitu saja memeriksa keberadaan elemen yang diberikan, karena elemen itu akan ada sebelum mulai ulang dan setelah selesai juga. Jadi kadang-kadang Anda mungkin benar, tetapi halaman tersebut belum mulai memuat.
- Saat halaman dimuat ulang, memeriksa WebElement.isDisplayed () akan melempar StaleElementReferenceException. Sisanya hanya untuk menutupi semua pangkalan
- getName (): metode internal yang mendapatkan nama halaman
- getMaximumLoadTime (): metode internal yang mengembalikan berapa lama halaman harus diizinkan memuat dalam hitungan detik
- memverifikasi (): metode internal memastikan halaman benar-benar dimuat
Sekali lagi, dalam sebagian besar kasus, loop do / while berjalan satu kali karena kode di luar navigasi (). Refresh () tidak dijalankan sampai browser benar-benar memuat ulang halaman sepenuhnya, tetapi kami telah melihat kasus di mana sebenarnya butuh beberapa detik untuk melewati loop itu karena navigasi (). refresh () tidak memblokir sampai browser selesai memuat.