所以我开始使用这个很棒的功能:
[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)")));
有什么想法吗?
答案 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));