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

时间:2014-08-19 01:25:33

标签: c# unit-testing selenium-webdriver wait

我是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帐户需要时间链接。请指教。

6 个答案:

答案 0 :(得分:18)

  

WebDriverWait wait = new WebDriverWait(driver,30);   wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("定位器&#34)));

如果元素在执行之前被找到,它将等待元素定位最多30秒....

答案 1 :(得分:3)

我不得不从@ 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);

答案 2 :(得分:0)

我曾经写过一个函数来检测每秒存在的元素。如果找到继续,否则抛出超时错误。但在该功能中我仍然使用Thread.Sleep。

期待其他好的解决方案。

答案 3 :(得分:0)

我使用ExpectedCondition.visibilityOf(element)而不是thread sleeps

答案 4 :(得分:0)

隐式等待 - 识别对象的最长等待时间,它将每500毫秒识别一次对象。如果它无法在最长时间内识别对象,则会抛出nosuchelement异常。

显式等待 - 用于ajax页面加载用于相同目的。

最长等待时间与thread.sleep

相同

答案 5 :(得分:0)

为项目写了一个方法:

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());
            }
        }

等待应该已经定义。