如何为Selenium添加自定义的ExpectedConditions?

时间:2014-01-24 18:00:35

标签: c# selenium selenium-webdriver

我正在尝试为Selenium编写自己的ExpectedConditions,但我不知道如何添加新的。有人有例子吗?我在网上找不到任何教程。

在我目前的情况下,我想等到元素存在,可见,启用并且没有attr“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")
    }

编辑:一些额外的信息:我遇到的问题是使用jQuery选项卡。我在禁用的选项卡上有一个表单,它将在选项卡变为活动状态之前开始填写该选项卡上的字段。

4 个答案:

答案 0 :(得分:32)

“预期条件”只不过是使用lambda表达式的匿名方法。自.NET 3.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;
});

如果您对此构造没有经验,我建议您这样做。它很可能在未来的.NET版本中变得更加普遍。

答案 1 :(得分:2)

我理解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的答案中学习:)

答案 2 :(得分:0)

我已将WebDriverWait和ExpectedCondition / s的示例从Java转换为C#。

Java版:

WebElement table = (new WebDriverWait(driver, 20))  
.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("table#tabletable")));

C#版本:

IWebElement table = new WebDriverWait(driver, TimeSpan.FromMilliseconds(20000))
.Until(ExpectedConditions.ElementExists(By.CssSelector("table#tabletable")));

答案 3 :(得分:0)

由于所有这些答案都指向OP使用带有新等待的单独方法并封装函数,而不是实际使用自定义预期条件,因此我将发布答案:

  1. 创建一个类CustomExpectedConditions.cs
  2. 将每个条件创建为静态可访问方法,以后可以从等待中调用
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")));