C# 如何为硒添加自定义预期条件?
我试图为Selenium编写我自己的预期条件,但我不知道如何添加新条件。有人举个例子吗?我在网上找不到这方面的任何教程 在我当前的例子中,我希望等待元素存在、可见、启用并且没有属性“aria disabled”。我知道这个代码不起作用:C# 如何为硒添加自定义预期条件?,c#,selenium,selenium-webdriver,C#,Selenium,Selenium Webdriver,我试图为Selenium编写我自己的预期条件,但我不知道如何添加新条件。有人举个例子吗?我在网上找不到这方面的任何教程 在我当前的例子中,我希望等待元素存在、可见、启用并且没有属性“aria disabled”。我知道这个代码不起作用: var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(seconds)); return wait.Until<IWebElement>((d) => { r
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(seconds));
return wait.Until<IWebElement>((d) =>
{
return ExpectedConditions.ElementExists(locator)
&& ExpectedConditions.ElementIsVisible
&& d.FindElement(locator).Enabled
&& !d.FindElement(locator).GetAttribute("aria-disabled")
}
var wait=new-WebDriverWait(驱动程序,TimeSpan.FromSeconds(秒));
返回等待时间((d)=>
{
返回ExpectedConditions.ElementExists(定位器)
&&ExpectedConditions.Element可见
&&d.FindElement(定位器)。已启用
&&!d.FindElement(locator).GetAttribute(“aria已禁用”)
}
编辑:一点附加信息:我遇到的问题是jQuery选项卡。我在一个禁用的选项卡上有一个表单,它将在该选项卡变为活动状态之前开始填写该选项卡上的字段。我理解
ExpectedConditions
(我想)背后的理论,但我经常发现它们很麻烦,很难在实践中使用
我会采用这种方法:
public void WaitForElementPresentAndEnabled(By locator, int secondsToWait = 30)
{
new WebDriverWait(driver, new TimeSpan(0, 0, secondsToWait))
.Until(d => d.FindElement(locator).Enabled
&& d.FindElement(locator).Displayed
&& d.FindElement(locator).GetAttribute("aria-disabled") == null
);
}
我很乐意从一个使用所有ExpectedConditions
的答案中学到:)一个“expectedcondition”不过是一个使用lambda表达式的匿名方法。自.NET3.0以来,这些已经成为.NET开发的主要内容,特别是随着LINQ的发布。由于绝大多数.NET开发人员都熟悉C#lambda语法,因此WebDriver.NET绑定的ExpectedConditions
实现只有几个方法
像您要求的那样创建等待将如下所示:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until<IWebElement>((d) =>
{
IWebElement element = d.FindElement(By.Id("myid"));
if (element.Displayed &&
element.Enabled &&
element.GetAttribute("aria-disabled") == null)
{
return element;
}
return null;
});
WebDriverWait wait=new-WebDriverWait(驱动程序,TimeSpan.FromSeconds(10));
等待。直到((d)=>
{
IWebElement元素=d.FindElement(By.Id(“myid”);
如果(元素)已显示&&
元素。已启用&&
element.GetAttribute(“aria已禁用”)==null)
{
返回元素;
}
返回null;
});
如果你对这种构造没有经验,我建议你这样做。它只会在未来的.NET版本中更加流行。我已经将WebDriverWait和ExpectedCondition/s的一个示例从Java转换为C Java版本:
WebElement table = (new WebDriverWait(driver, 20))
.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("table#tabletable")));
C版本:
由于所有这些答案都指向OP使用带有新等待的单独方法并封装函数,而不是实际使用自定义预期条件,因此我将发布我的答案:
不应该?因为这个答案在IRC中已经链接了好几次,我还将指出它应该使用d.FindElement,因为这是driverso的lambda变量。这样,我们可以在需要的地方调用这个方法?因为在另一种方法中,我们必须把它作为一种表达,在我们需要的任何地方。如果我错了,请纠正我。
IWebElement table = new WebDriverWait(driver, TimeSpan.FromMilliseconds(20000))
.Until(ExpectedConditions.ElementExists(By.CssSelector("table#tabletable")));
public class CustomExpectedConditions
{
public static Func<IWebDriver, IWebElement> ElementExistsIsVisibleIsEnabledNoAttribute(By locator)
{
return (driver) =>
{
IWebElement element = driver.FindElement(locator);
if (element.Displayed
&& element.Enabled
&& element.GetAttribute("aria-disabled").Equals(null))
{
return element;
}
return null;
};
}
}
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(TIMEOUT));
wait.Until(CustomExpectedConditions.ElementExistsIsVisibleIsEnabledNoAttribute(By.Id("someId")));