6

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

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

有任何想法吗?

4

2 回答 2

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));
于 2021-07-27T19:45:23.027 回答
0

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

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

^ 这适用于 C#、Python 和其他语言。

可以在 C# 文档中找到使用 lambda 表达式的示例,下面是您尝试实现的示例:

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

我使用 Displayed 和 Enabled 作为示例,因为C# 文档中的元素没有 Visible 属性。

于 2015-08-23T07:32:49.910 回答