有没有办法在Selenium的C#端口中使用WebDriverWait的FindsBy注释?

时间:2013-10-24 20:46:16

标签: c# selenium

所以我开始使用这个很棒的功能:

[FindsBy(How = How.CssSelector, Using = "div.location:nth-child(1) > div:nth-child(3)")]
public IWebElement FirstLocationTile { get; set; }

但问题是它似乎不适用于我的WebDriverWait代码!

具体示例,我无法重复使用我的FirstLocationTile。它坚持要有一个By。:

 var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(BaseTest.defaultSeleniumWait));
 wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div.location:nth-child(1) > div:nth-child(3)")));

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果使用ExpectedConditions,则只能通过locator识别,因为ExpectedConditions只接受locator作为参数。

但是,ExpectedConditions不是您可以在wait.until()中使用的唯一参数。您可以在lambda表达式中使用元素。

^对于C#,Python和其他语言都是如此。

An example lambda expression use can be found in the C# documentation,以下是您要实现的目标的示例:

wait.Until(FirstLocationTile => FirstLocationTile.Displayed && FirstLocationTile.Enabled);

我使用了Displayed和Enabled作为示例,因为元素in the C# documentation没有Visible属性。

答案 1 :(得分:0)

您可以创建自己的等待方法。以下示例:

    public static Func<IWebDriver, bool> ElementIsVisible(IWebElement element)
{
    return (driver) =>
    {
        try
        {
            return element.Displayed;
        }
        catch (Exception)
        {
            // If element is null, stale or if it cannot be located
            return false;
        }
    };
}



public static Func<IWebDriver, IWebElement> ElementIsClickable(IWebElement element)
{
    return driver =>
    {
        return (element != null && element.Displayed && element.Enabled) ? element : null;
    };
}

这些将类似于您的标准等待。

 WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(10));
 wait.Until(ElementIsClickable(FirstLocationTile));