簡體   English   中英

Selenium 在進入下一頁之前需要睡眠

[英]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,但由於JavaScriptAJAX 調用的存在,我們想要與之交互的元素可能不可見、可點擊或可交互,這反過來可能會引發關聯異常

因此,解決方案是引入ExplicitWaitWebDriverWait 我們將為要與之交互的元素引入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM