使用“ExpectedConditions”等待验证不起作用

时间:2017-11-10 10:42:07

标签: c# visual-studio selenium selenium-webdriver wait

更新版本

我正在尝试找到一种更动态的方式来等待元素而不是使用静态等待函数,例如Task.Event(2000).Wait();

解决方法似乎就是这样:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
    wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//div[2]/div/input")));

但是当我使用这个函数时,“ExpectedConditions”总是亮起红色,表示它:“当前上下文中不存在”。

我已将该功能放在我的一个测试用例中:

(我正在使用C#/ Visual Studios,项目类型:Classlibrary)

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

    namespace ClassLibrary1
    {
        public class MyFirstTest
        {
            IWebDriver driver = new FirefoxDriver();

            [Test]
            public void WaitverifyTest()
            {
                driver.Navigate().GoToUrl("https://www.google.se/");
                driver.Manage().Window.Maximize();

                Task.Delay(4000).Wait();

                driver.FindElement(By.XPath("//div[2]/div/input")).SendKeys("Selenium");

                WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//div[2]/div/input")));
                element.Click();

                driver.FindElement(By.XPath("//center/input")).Click();
            }
       }
   }

(xpath是一个位置类型xpath,它是有效的,可以在Selenium IDE和Visual Studios中使用。)

任何人都知道我做错了什么?

我有两个怀疑:

  1. 我的版本的selenium可能太新了(3.6.0.0)
  2. 根据selenium.io,ExpectedCondition最后更新于3.1.0。也许它不再是虚荣的。有没有办法检查这个?

    1. 也许我的项目类型与ExpectedCondition不兼容,因此无法识别它?

4 个答案:

答案 0 :(得分:12)

我之前见过这个。

确保您已为项目安装了Selenium.Webdriver和Selenium.Support NuGet包。您需要Selenium.Support包才能使用ExpectedConditions。

答案 1 :(得分:1)

我喜欢这样:

1:使用 nuget,搜索 DotNetSeleniumExtras.WaitHelpers,

2:将该命名空间导入您的类。

    using SeleniumExtras.WaitHelpers

3:然后运行以下代码:

    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.Id("element ID")));

答案 2 :(得分:0)

我不明白这一行:

IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//div[2]/div/input")));

你怎么能把直到强制转换为bool的IWebElement?我可能会遗漏一些东西。

但如果你不使用ExpectedConditions,你可以绕过错误,如下所示:

wait().Until( foo => driver.FindElement(By.XPath("//div[2]/div/input")).Enabled);

WebDriverWait将一个返回bool的函数作为参数。您可以使用上面的代码在参数中创建一个,在启用元素时将返回true。

答案 3 :(得分:-1)

而不是VisibilityOfAllElementsLocatedBy使用elementTobeClickable方法,它应该可以正常工作

        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));

        driver.Navigate().GoToUrl("https://www.svt.se/");
        driver.Manage().Window.Maximize();

        wait.Until(ExpectedConditions.ElementToBeClickable(
        By.XPath("//li[4]/a")));

        driver.FindElement(By.XPath("//li[4]/a")).Click();