如何在selenium c#中创建一个自定义的显式等待函数,传递webelement而不是By &g



我试图重构我的旧代码,我的清单上的一件事是将显式等待包装成一个函数,然后调用这个函数。

现在我正在使用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表达式是可行的方法。

最新更新