![](/img/trans.png)
[英]How to wait a page before going to another page in Selenium WebDriver using Java?
[英]Selenium needs a sleep before going to the next page
我目前正在學習Selenium,我學到了很多東西。 社區說的一件事; 是你需要盡可能避免 thread.sleep 。 Selenium 在替換中使用隱式和顯式等待。 是的,我理解這個概念。
最近我遇到了一個問題。 這是沒有采取某種行動; 從登錄頁面轉到另一個頁面,不使用 Thread.sleep(1000)。 Selenium 似乎太崩潰了:它找不到某個元素。 我覺得這種行為很奇怪。 所以我在想會發生這種沖突,因為登錄頁面首先要重定向到網站的主頁並且沒有 Thread.sleep(1000); 它想轉到第二頁,但登錄頁面拒絕它,因為它想先轉到主頁。 話雖如此,這就是為什么 Selenium 會崩潰,或者你們是否在下面的示例中看到了代碼的奇怪用法?
// Currently on a webpage
WebElement ui_login_button = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("account-login-button")));
ui_login_button.click();
//After the click it logs in and redirects to a webpage
Thread.sleep(1000); // why sleep here? (without this Selenium crashes)
// Go to second page and perform actions
waitForLoad(driver);
driver.navigate().to(URL + "/mymp/verkopen/index.html");
/* -------------------------------------------------------------------
public void waitForLoad(WebDriver driver) {
ExpectedCondition<Boolean> pageLoadCondition = new
ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
}
};
//WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(pageLoadCondition);
}
對不起,我盡力解釋清楚了。 英語不是我的母語。 謝謝你的幫助。
親切的問候。
根據您的問題和更新的評論,它引發了一個異常,即它無法在網頁上找到該元素,這很有可能。 此外,當您提到在兩者之間放置睡眠不是解決問題的優雅解決方案時,這與誘導Thread.sleep(1000);
一樣非常正確。 降低整體測試執行性能。
現在,我在您的注釋代碼塊中觀察到比較document.readyState
complete
是一個更明智的步驟。 但有時可能會發生這種情況,盡管 Web 瀏覽器會將document.readyState
作為complete
發送給 Selenium,但由於JavaScript和AJAX 調用的存在,我們想要與之交互的元素可能不可見、可點擊或可交互,這反過來可能會引發關聯異常。
因此,解決方案是引入ExplicitWait即WebDriverWait 。 我們將為要與之交互的元素引入ExplicitWait ,並設置適當的ExpectedConditions 。 您可以在此處找到有關 ExplicitWait 的文檔。
如果你想等待一個按鈕被點擊,預期的代碼塊可能是以下格式以及導入:
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
// Go to second page and wait for the element
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.id("id_of_the_element")));
//perform actions
driver.navigate().to(URL + "/mymp/verkopen/index.html");
我猜測在您導航到 URL + "/mymp/verkopen/index.html" 並開始采取一些行動后會引發異常。
我推測這里的主要問題是您的 waitForLoad() 方法沒有等待某些 Javascript 或其他后台任務在登錄首先進入的頁面上完成。 因此,當您導航到下一頁時,某些事情尚未完成,從而使您的用戶身份驗證處於錯誤狀態。 也許您需要在登錄后等待一些 AJAX 完成,然后才能繼續進行進一步的導航? 還是單擊該頁面上的鏈接以觸發到目標頁面的導航(就像真實用戶那樣)而不是直接輸入 URL 會更好? 您可能會發現與開發人員討論 Web 應用程序的實際行為很有幫助。
正如 DebanjanB 所指出的,一旦您進入目標頁面,您就可以對頁面上您正在執行操作的元素使用 WebDriverWait。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.