使用Selenium使用Webdriver的Timeout的最佳方法是什么

Nic*_*ahn 2 c# selenium webdriver selenium-webdriver

我遇到了一个问题.我的网页有一个DropDownList控件.一旦DropDownList值发生变化(通过选择不同的值),页面将刷新并呈现内容.

然后我必须Thread.Sleep(2000);在它去之前使用FindElement.

我的问题:等待页面加载的最佳方法是什么?

我的Thread.Sleep(2000)代码中有很多实例,我开始认为这不是解决问题的最佳方法.

这是我的代码:

[TestInitialize()]
public void Setup()
{
    if (BaseIntegrationTest.browserType.Equals(BaseIntegrationTest.IE))
    {
        driver = new InternetExplorerDriver();
    }
    else if (BaseIntegrationTest.browserType.Equals(BaseIntegrationTest.CHROME))
    {
        //driver = new ChromeDriver();
    }
    else if (BaseIntegrationTest.browserType.Equals(BaseIntegrationTest.FIREFOX))
    {
        driver = new FirefoxDriver();
    }
}
Run Code Online (Sandbox Code Playgroud)

第二部分:

[TestMethod]
public void testVerifyData()
{
    // ...................
    // ...................
    driver.FindElement(By.XPath("//*[@id='ctl00_NavigationControl1_lnke']")).Click();

    Thread.Sleep(2000);

    //select from the dropdownlist.
    IWebElement catagory = driver.FindElement(By.Id("ctl00_ContentPlaceHolder1_Filter"));
    SelectElement selectCatagory = new SelectElement(catagory);
    selectCatagory.SelectByText("Employee");

    Thread.Sleep(2000);
    // ...................
    // ...................
}
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 7

Thread.Sleep()是一种非常沮丧的实现等待的方法

此代码在selenium文档中列出http://seleniumhq.org/docs/04_webdriver_advanced.html

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement category = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id("ctl00_ContentPlaceHolder1_Filter"));
    });
Run Code Online (Sandbox Code Playgroud)

这是一个显式等待的示例,其中selenium在找到元素之前不会执行任何操作

隐式等待的一个例子是:

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
IWebElement category = driver.FindElement(By.Id("ctl00_ContentPlaceHolder1_Filter"));
Run Code Online (Sandbox Code Playgroud)

在隐式等待中,驱动程序将等待给定的时间并轮询DOM以查找不存在的任何元素.

编辑

public WaitForElement(string el_id)
{
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    IWebElement category = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id(el_id));
    });
}
Run Code Online (Sandbox Code Playgroud)