当尝试使用ExpectedConditions显式等待元素变得可见时,Visual Studio警告我它现在已经过时,很快就会从Selenium中删除。
实现相同结果的当前/新方法是什么?
var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));
答案 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.的回答,我在项目中添加了扩展方法。 (实际上,我添加了两个conkey
和WaitUntilVisible(...)
这些返回元素,而不是布尔值,因此更像WaitUntilClickable(...)
Wait.Until(ExpectedConditions...)
答案 7 :(得分:0)
您可以使用 NuGet 包 Gravity.Core - 它由 Gravity API 社区维护,并且包含的不仅仅是 ExpectedConditions 类。
如何使用
using OpenQA.Selenium.Extensions
答案 8 :(得分:-1)
检查您安装了哪个版本的Selenium.Support和Selenium.WebDriver NuGet Package。我现在使用最新版本3.11.2得到同样的问题,我降级到3.10.0并修复了问题。