Dikkat edilmesi gereken önemli bir nokta, driver.navigate (). Refresh () çağrısının bazen eşzamansız olduğu anlamına gelir, yani yenilemenin bitmesini beklemez, sadece "yenilemeyi başlatır" ve daha fazla yürütmeyi engellemez tarayıcı sayfayı yeniden yüklerken.
Bu sadece az bir vakada gerçekleşmiş gibi görünse de, sayfanın gerçekten yeniden yüklenmeye başlayıp başlamadığını manuel olarak kontrol ederek, bunun% 100 çalıştığından emin olmanın daha iyi olduğunu düşündük.
Temel sayfa nesne sınıfımızda bunun için yazdığım kod:
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();
}
Bazı notlar:
- Sayfayı yeniden yüklediğiniz için, belirli bir öğenin varlığını kontrol edemezsiniz, çünkü öğe yeniden yükleme başlamadan önce ve bittikten sonra orada olacaktır. Bazen doğru olabilirsiniz, ancak sayfa henüz yüklenmeye başlamamıştır.
- Sayfa yeniden yüklendiğinde, WebElement.isDisplayed () öğesinin işaretlenmesi bir StaleElementReferenceException özel durumu oluşturur. Gerisi sadece tüm üsleri kapsamak
- getName (): sayfanın adını alan dahili yöntem
- getMaximumLoadTime (): sayfanın saniye olarak yüklenmesine izin verilmesi gereken süreyi döndüren dahili yöntem
- verify (): dahili yöntem sayfanın gerçekten yüklendiğinden emin olur
Yine, vakaların büyük çoğunluğunda, do / while döngüsü tek bir kez çalışır, çünkü navigate (). Ötesinde kod tarayıcı gerçekten sayfayı tamamen yeniden yükleyene kadar yürütülmez, ancak navigate (). refresh (), tarayıcının yüklenmesi tamamlanana kadar engellenmediğinden, bu döngüden geçmesi birkaç saniye alır.