我试图重构我的旧代码,我的清单上的一件事是将显式等待包装成一个函数,然后调用这个函数。
现在我正在使用lambda而不是预期的条件,因为lambda是c#中的方式,我不想依赖于过时的类/不支持的nuget包。
分解我当前的项目,每次我创建一个方法,我都定义了一个显式的等待,如下所示:
public void someFunc()
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
wait.Until(driver => element.Displayed);
}
我的希望是,而不是必须在每个函数中定义我的等待,我可以调用一个等待方法,从那里开始。
问题是我不确定如何有效地使用WebElements作为参数。
我已经创建了你可以想象的像这样的东西
public void waitForElement(IWebElement element)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
wait.Until(driver => element.Displayed);
}
但是当我在我的测试或其他函数中调用这个方法时,我得到一个异常,感谢另一个用户,我知道为什么。
当我调用
waitForElement(myWebElement);
webdriver失败,因为该元素在页面上还不存在。它没有到达函数内的代码,因为元素不作为参数存在。
我已经尝试了从添加驱动程序作为参数,从使用webdriverwait作为参数并使用lambda作为参数,从将函数更改为bool并使用lambda)
在c#中有什么好的/干净的方法来做到这一点吗?我错过什么了吗?请帮助只是注意,我让它工作使用"By"作为参数,但我不想使用by,因为它会导致难以维护的代码。
您可以为WebDriverWait
类创建一个扩展方法:
namespace OpenQA.Selenium
{
public static class WebDriverWaitExtensions
{
public static void UntilElementIsDisplayed(this WebDriverWait wait, IWebElement element)
{
wait.Until(driver => element.Displayed);
}
}
}
现在任何地方你有一个WebDriverWait
对象,你可以调用wait.UntilElementIsDisplayed(element);
var element = driver.FindElement(By.XPath("..."));
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.UntilElementIsDisplayed(element);
一定要把using OpenQA.Selenium;
添加到你的c#文件的顶部。
这是我用来替换过时的ExpectedConditions类中的几乎所有内容的模式。扩展方法和lambda表达式是可行的方法。