ImplicitWait似乎无法在Selenium Webdriver中等待元素

时间:2017-09-17 15:25:17

标签: c# internet-explorer selenium-webdriver

我正在尝试使用selenium-webdriver在c#中自动化Internet Explorer以填充外部网站上的公式。 有时代码会随机抛出错误(无法找到名称== xxx的元素),因为它无法找到搜索到的元素。它不会每次都发生,也不一定在同一个地方。

我已经尝试使用以下代码设置implicitWait,这样可以减少错误次数。

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);

从另一个下拉菜单中选择一个选项后,外部网页会从下拉列表中更改选择选项(通过重新加载)。 为了进一步拦截这些关键点,我等待2秒才能找到下拉选项ByName()

    System.Threading.Thread.Sleep(2000);

网页只需不到半秒即可重新加载此下拉菜单,因此2秒就足够了。

你能告诉我我做错了什么,或者为什么webdriver看起来如此不稳定地找到元素。 我还注意到,只要程序正在运行,我就不允许在计算机上做任何其他事情,否则会更频繁地发生同样的错误。

我的Internet Explorer 8的驱动程序选项

        var options = new InternetExplorerOptions()
        {
            InitialBrowserUrl = "ExternalPage",
            IntroduceInstabilityByIgnoringProtectedModeSettings = true,
            IgnoreZoomLevel = true,
            EnableNativeEvents = false,
            RequireWindowFocus = false                
        };

        IWebDriver driver = new InternetExplorerDriver(options);
        driver.Manage().Window.Maximize();

我的最终解决方案在20多项测试中完美运行而没有出现任何错误!

在课程中添加了以下内容

     enum type
     {
        Name,
        Id,
        XPath
     };

在我的驱动程序后面添加了这个

    driver.Manage().Window.Maximize();
    wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

Methode等待元素

    private static void waitForElement(type typeVar, String name)
    {
            if( type.Id)wait.Until(ExpectedConditions.ElementToBeClickable(driver.FindElement(By.Id(name)))); 
            else if(type.Name)wait.Until(ExpectedConditions.ElementToBeClickable(driver.FindElement(By.Name(name))));
            else if(type.XPath)wait.Until(ExpectedConditions.ElementToBeClickable(driver.FindElement(By.XPath(name))));                   
    }

在使用元素

调用任何事件之前调用该方法
    waitForElement(type.Id, "ifOfElement");

2 个答案:

答案 0 :(得分:1)

在Selenium中还有两个选项:

您可以通过Selenium中的 WebDriverWait 对象使用显式等待。通过这种方式,您可以等待元素出现在页面上。当它们出现时代码仍在继续。

一个例子:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    .withTimeout(30, SECONDS)
    .pollingEvery(5, SECONDS)
    .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() 
        {
            public WebElement apply(WebDriver driver) {
            return driver.findElement(By.id("foo"));
        }
});

此外,您可以使用 FluentWait 选项。通过这种方式,您可以定义等待条件的最长时间,以及检查条件的频率。

var speed: CGFloat = 0.3 // speed in seconds

UIView.animate(withDuration: speed, animations: {

theTextView.contentOffset = .zero

}, completion: nil)

答案 1 :(得分:1)

您可以使用明确等待,如下例所示:

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("your locator")));