繁体   English   中英

如何为 Selenium 添加自定义 ExpectedConditions?

[英]How to add custom ExpectedConditions for Selenium?

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

在我目前的情况下,我想等到元素存在、可见、启用并且没有属性“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 选项卡。 我在禁用的选项卡上有一个表单,它会在选项卡变为活动状态之前开始填写该选项卡上的字段。

“预期条件”只不过是使用 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 的未来版本中变得更加流行。

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

由于所有这些答案都指向 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")));

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

爪哇版:

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")));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM