C#Selenium隐含等待

时间:2016-04-13 16:11:20

标签: c# selenium-webdriver wait

我正在使用selenium / firefox / c#将数据输入网页的多个字段,然后点击提交按钮将其提交到网站。我尝试使用ImplicitlyWait,以便程序等待结果页面加载最多45秒,然后从该页面获取结果。我现在把它编码为

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(45));
driver.FindElement(By.Id("dnn_ctr1734_Professional_btnSubmit")).Click();

我在单击提交按钮之前进行隐式等待,但即使页面加载时它只需要15秒,但最终加载时不会抓取结果。我是否按正确的顺序排列了ImplicitWait

3 个答案:

答案 0 :(得分:4)

初始化驱动程序后,通常可以正确放置隐式等待的位置。它基本上作为操作完成的默认等待时间。

有几种方法可以解决您的问题...

  1. 使用具有预期条件的显式等待,等待忙碌的微调器消失。

    var wait = new WebDriverWait(Driver.Instance,TimeSpan.FromSeconds(10)); wait.Until(driver =>!driver.FindElement(By.Id(“busySpinnerID”))。显示);

  2. 等到页面上显示特定元素

    var wait = new WebDriverWait(Driver.Instance,TimeSpan.FromSeconds(10)); wait.Until(driver => driver.FindElement(By.Id(“knownElementId”))。显示);

  3. 使用JavaScript等待页面加载

    var wait = new WebDriverWait(driver,TimeSpan.FromSeconds(30)); wait.Until(driver1 =>((IJavaScriptExecutor)驱动程序).ExecuteScript(“return document.readyState”)。Equals(“complete”));

答案 1 :(得分:0)

您应该使用显式等待,使用如下代码:

>>> test = "Byggår"
>>> key = raw_dict.keys()[7]
>>> print(test)
Byggår
>>> print(key)
Byggår
>>> test
'Bygg\xc3\xa5r'
>>> key
u'Bygg\xe5r'
>>> raw_dict[test]
Traceback (most recent call last):
  File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd_exec.py", line 3, in Exec
  File "<input>", line 1, in <module>
KeyError: 'Bygg\xc3\xa5r'

答案 2 :(得分:0)

我同意Dmitry的观点,处理等待的最佳方法是使用显式等待函数。为了让您的生活更轻松,您可以将其添加到扩展方法中,这样您就可以在点击之前等待元素存在。例如:

Class Actions {

        public static IWebDriver ClickOn(IWebDriver driver, string button) 
        {
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
            wait.Until(ExpectedConditions.ElementExists(By.XPath(button)));
            driver.FindElement(By.XPath(button)).Click();
            return driver;
        }
}

然后您的代码可以像

一样简单
Actions.ClickOn(d, SignInButton);

在点击之前,您的代码仍将等待元素存在。