簡體   English   中英

如何在selenium webdriver中等待元素加載?

[英]How to wait for element to load in selenium webdriver?

我是selenium webdriver的新手,正在測試一個應用程序。 在我的應用程序中,我必須測試關於Facebook帳戶的鏈接。 每當我點擊鏈接時,彈出窗口都會顯示在我必須輸入憑據的位置。 我有時能夠鏈接,有時測試失敗。 我知道原因是因為加載彈出窗口需要時間並且執行下一個命令因此無法找到該元素。 我使用過Thread.Sleep,但是我想使用隱式等待或顯式等待,這總是一個很好的做法,而不是Thread.Sleep。 如何使用隱式等待以及在哪里使用該命令? 請指教。 謝謝。

 public void SocialFaceBook()
    {           
        string currentWindow = driver.CurrentWindowHandle;
        PopupWindowFinder finder = new PopupWindowFinder(driver);
        string facebookWindow = finder.Click(driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[3]/a")));
        // Switch To FaceBook Window
        driver.SwitchTo().Window(facebookWindow);
        System.Threading.Thread.Sleep(3000);

        // Link
        // Email Address
        IWebElement faceBookLinkEmail = driver.FindElement(By.Id("email"));
        faceBookLinkEmail.SendKeys(SocialFaceBookEmail);

        // Password
        IWebElement faceBookLinkPass = driver.FindElement(By.Id("pass"));
        faceBookLinkPass.SendKeys(SocialFaceBookPass);

        // Log In Button
        IWebElement faceBookLinkLogin = driver.FindElement(By.XPath("//input[@id='u_0_1']"));
        faceBookLinkLogin.Click();

        // Switch To Main Window
        driver.SwitchTo().Window(currentWindow);
        System.Threading.Thread.Sleep(3000);

        // Sync            
        IWebElement faceBookSync = driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[2]/a"));
        faceBookSync.Click();

        // Unlink
        IWebElement faceBookUnLink = driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[1]/a"));
        faceBookUnLink.Click();
    }

有時它無法找到登錄詳細信息,因為彈出窗口未正確加載,有時無法找到同步按鈕,因為Facebook帳戶需要時間鏈接。 請指教。

WebDriverWait wait = new WebDriverWait(driver,30); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id( “定位器”)));

如果在執行之前找到該元素,它將等待元素定位最多30秒....

我不得不從@ Vicky的答案中改變一些小東西,但這就是我所能得到的一種方法。

public static void WaitForElementLoad(By by, int timeoutInSeconds)
    {
        if (timeoutInSeconds > 0)
        {
            WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(timeoutInSeconds));
            wait.Until(ExpectedConditions.ElementIsVisible(by));
        }
    }

我稱之為:

MyClass.WaitForElementLoad(By.CssSelector("div#div1 div strong a"), 10);

我曾經寫過一個函數來檢測每秒存在的元素。 如果找到繼續,否則拋出超時錯誤。 但在該功能中我仍然使用Thread.Sleep。

期待其他好的解決方案。

我使用ExpectedCondition.visibilityOf(元素)而不是線程休眠

隱式等待 - 最大等待識別對象的時間,它將每500毫秒識別一次對象。 如果它無法在最大時間內識別對象,則會拋出nosuchelement異常。

顯式等待 - 用於ajax頁面加載用於相同目的。

最長等待時間與thread.sleep相同

為項目寫了一個方法:

public static void WaitForElementPresentBy(By by)
        {
            try
            {
                Wait.Until(ExpectedConditions.ElementIsVisible(by));
            }
            catch (TimeoutException te)
            {

                Assert.Fail("The element with selector {0} didn't appear. The exception was:\n {1}", by, te.ToString());
            }
        }

等待應該已經定義了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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