需要注意的重要一點是,driver.navigate()。刷新()調用有時似乎是異步的,這意味着它不會等待更新完成,它只是「啓動刷新」並且不會在瀏覽器重新加載頁面時阻止進一步的執行。
雖然這似乎只發生在少數情況下,但我們認爲最好通過手動檢查頁面是否確實開始重新加載來確保此項工作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()的名稱:內部方法,返回頁面多久應該被允許以秒爲
- 驗證加載( ):內部方法確保頁面實際加載
再次,在絕大多數情況下,do/while循環運行一次,因爲超出navigate()。refresh()的代碼不會執行直到瀏覽器實際上完全重新加載頁面,但是我們已經看到了實際需要幾秒鐘才能通過該循環的情況,因爲navigate()。refresh()沒有bl直到瀏覽器完成加載。
來源
2016-06-09 20:33:21
mac
很高興!它幫助你。或者,如果你使用純硒或者WebDriverBackedSelenium,你也可以使用:selenium.refresh(); – 2012-04-23 18:32:21
雖然它不完全等同於按F5。 ''driver.navigate()。refresh()'在它的請求標題中寫明「no-cache」,並因此無條件地重新加載所有內容。而按F5可能會導致「If-Modified-Since」請求,這可能會得到「304未修改」響應。如果你做負載測試,你必須記住這種差異。 – 2013-02-16 15:49:53
非常感謝你的回答:) Upvote – WEshruth 2015-04-16 07:02:57