C# 如何为硒添加自定义预期条件?

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

我试图为Selenium编写我自己的预期条件,但我不知道如何添加新条件。有人举个例子吗?我在网上找不到这方面的任何教程

在我当前的例子中,我希望等待元素存在、可见、启用并且没有属性“aria disabled”。我知道这个代码不起作用:

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使用带有新等待的单独方法并封装函数,而不是实际使用自定义预期条件,因此我将发布我的答案:

  • 创建CustomExpectedConditions.cs类
  • 将每个条件创建为静态可访问的方法,以后可以从等待中调用这些方法

  • 不应该?因为这个答案在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")));