在测试C#硒中隐式到显式等待

时间:2018-06-20 15:37:05

标签: c# selenium selenium-webdriver

我编写了一个包含5秒隐式等待的测试。我一直在寻找向代码中引入显式等待的方法,这样执行就不会花很长时间。

我已经看到有很多不同的方法可以将显式方式引入代码。我将如何进行如下操作,但我不确定对我来说正确的方法

     WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    IWebElement myDynamicElement = wait.Until<IWebElement>(d => d.FindElement(By.Id("someDynamicElement")));
}

/

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Interactions;
using System.Threading;

namespace Exercise1
{
    class Program
    {
        static void Main(string[] args)
        {
            IWebDriver webDriver = new ChromeDriver();
            webDriver.Navigate().GoToUrl("http://www.asos.com/men/");
            webDriver.Manage().Window.Maximize();
            webDriver.FindElement(By.XPath(".//button[@data-testid='country-selector-btn']")).Click();


            webDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
            IWebElement country = webDriver.FindElement(By.Id("country"));
            SelectElementFromDropDown(country, "India");
            webDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);



            IWebElement currency = webDriver.FindElement(By.Id("currency"));
            SelectElementFromDropDown(currency, "$ USD");
            webDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);




            webDriver.FindElement(By.XPath(".//button[@data-testid='save-country-button']")).Click();

            webDriver.Quit();

        }

        private static void SelectElementFromDropDown(IWebElement ele, string text)
        {
            SelectElement select = new SelectElement(ele);
            select.SelectByText(text);
        }
    }

}

1 个答案:

答案 0 :(得分:0)

您误解了ImplicitWait的工作方式。您一直在打电话,就像您希望它每次等待5秒一样。 ImplicitWait超时在驱动程序的生命周期内设置一次。如果要删除所有设置超时的实例(第一个实例除外),则脚本将完全相同。

在进入显式等待之前的快速注释... Selenium文档state not to mix them

  

警告:请勿混合使用隐式和显式等待。这样做可能导致无法预测的等待时间。

对于显式等待,您将等待特定的东西……元素存在,可见,可点击等。您可以查看WebDriverWait和{{ 3}}。

一个简单的例子

// create a new instance of WebDriverWait that can be reused
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
IWebElement button = wait.Until(ExpectedConditions.ElementExists(By.Id("someId"));
// do something with button

ExpectedConditions中已经存在很多可以等待的不同条件,因此请确保您熟悉它们。通常,您很少需要那里没有提供的东西,因此请在编写自定义条件之前进行检查。