C#Selenium'ExpectedConditions已过时'

时间:2018-04-16 21:14:03

标签: c# selenium webdriver

当尝试使用ExpectedConditions显式等待元素变得可见时,Visual Studio警告我它现在已经过时,很快就会从Selenium中删除。

实现相同结果的当前/新方法是什么?

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));

9 个答案:

答案 0 :(得分:64)

我解决了自己的问题,希望为其他人提供答案,想知道如何使用最新版本的Selenium来解决这个问题。

使用nuget,搜索DotNetSeleniumExtras.WaitHelpers,将该命名空间导入您的类。现在你可以这样做:

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.Id("content-section")));

IDE中的警告将消失。

答案 1 :(得分:10)

这很简单,只需更改

Wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));

Wait.Until(c => c.FindElement(By.Id("content-section")));

答案 2 :(得分:9)

如果您不想下载额外的nuget包,则很容易声明自己的函数(或条件),尤其是使用lamda表达式,例如

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(condition =>
{
    try
    {
        var elementToBeDisplayed = driver.FindElement(By.Id("content-section"));
        return elementToBeDisplayed.Displayed;
    }
    catch (StaleElementReferenceException)
    {
        return false;
    }
    catch (NoSuchElementException)
    {
        return false;
    }
});

这也是非常多才多艺,因为现在可以评估任何类型的bool表达。

答案 3 :(得分:1)

更改为匿名功能的答案是最正确的答案。或编写自己的,自己需要的,等待条件的类。在上述显式场景中使用匿名函数的示例可能类似于...

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
wait.IgnoreExceptions(typeof(NoSuchElementException), typeof(ElementNotVisibleException));
var element = wait.Until(() => 
{
    var e = Driver.FindElement(By.Id("content-section"));
    if(e.Displayed)
        return e;
});

此时,函数本身可以在您可以调用的解决方案中的某个类中关闭。这样做的好处是您可以根据需要进行修改;我见过很多情况,那些网站制作得很差的网站最终破坏了ExpectedConditions的工作方式,而这是由团队编写我们自己的函数解决的。

根据C#贡献者:

  

关于ExpectedConditions,同样,这是   是在.NET中创建的,完全是因为“ Java拥有它”。当时   Java中的ExpectedConditions类已创建,用于创建的语法   一个lambda函数(或类似行为的函数)尤其如此   奥秘,难以理解。在这种情况下,   Java绑定很有意思。但是,C#不是Java。在C#中,   创建lambda函数的语法(   C#已很好地理解Microsoft文档的语言)   开发人员多年,并且是他们武器库中的标准工具。

     

在这种情况下,代码冗长性确实有一些优点,但是   由于等待条件很少能一概而论,因此   用户使用更清洁的方法来开发自己的条件类   有他们感兴趣的等待条件。但是,这是   用户讨厌的东西。另外,关于   特定等待条件的实现的“标准”集合   从表面上看似乎是个好主意,但是有很多   用户希望任何给定条件起作用的方式的变化。有一个   收集等待条件可能是一件好事,但硒   项目不是它的地方。

http://jimevansmusic.blogspot.com/2018/03/deprecating-parts-of-seleniums-net.html

答案 4 :(得分:1)

需要Nuget-DotNetSeleniumExtras.WaitHelpers

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("")));

我刚刚演示了元素可点击事件。同样,其他事件也可以与所需参数一起使用。希望对您有帮助

答案 5 :(得分:1)

以下 C# 代码适用于我:

new WebDriverWait(webDriver, TimeSpan.FromSeconds(10)).Until(c => c.FindElement(By.Id("name")));

答案 6 :(得分:0)

基于@Rob F.的回答,我在项目中添加了扩展方法。 (实际上,我添加了两个conkeyWaitUntilVisible(...)

这些返回元素,而不是布尔值,因此更像WaitUntilClickable(...)

Wait.Until(ExpectedConditions...)

答案 7 :(得分:0)

您可以使用 NuGet 包 Gravity.Core - 它由 Gravity API 社区维护,并且包含的​​不仅仅是 ExpectedConditions 类。

如何使用

  1. 使用 NuGet 包管理器下载 NuGet。
  2. 添加using OpenQA.Selenium.Extensions

答案 8 :(得分:-1)

检查您安装了哪个版本的Selenium.Support和Selenium.WebDriver NuGet Package。我现在使用最新版本3.11.2得到同样的问题,我降级到3.10.0并修复了问题。