【发布时间】:2020-05-03 10:57:54
【问题描述】:
似乎在 selenium 中有一个 ExpectedCondition.Or() 方法用于其他语言,但我在 DotNetSeleniumExtras.WaitHelpers 中找不到它用于 .NET
有没有办法使用 Selenium 和 .NET 验证两个元素之一是否存在?
【问题讨论】:
标签: c# .net selenium selenium-webdriver
似乎在 selenium 中有一个 ExpectedCondition.Or() 方法用于其他语言,但我在 DotNetSeleniumExtras.WaitHelpers 中找不到它用于 .NET
有没有办法使用 Selenium 和 .NET 验证两个元素之一是否存在?
【问题讨论】:
标签: c# .net selenium selenium-webdriver
您可以使用自定义条件
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until<bool>((d) =>
{
return d.FindElements(firstBy).Count > 0 || d.FindElements(secondBy).Count > 0;
});
【讨论】:
有几种方法可以做到这一点。
将“或”输入您的定位器。 CSS 选择器的一个例子是在定位器中添加,。如果要查找 ID 为 element1 或 ID 为 element2 的元素,则可以使用 CSS 选择器 #element1, #element2。如果您也需要,XPath 中有一个 OR 运算符。以this 为例。
您可以编写自己的自定义条件,该条件采用一组定位器(以防您要查找的不仅仅是两个)。
public Func<IWebDriver, IWebElement> AnyElementExists(By[] locators)
{
return (driver) =>
{
foreach (By locator in locators)
{
IReadOnlyCollection<IWebElement> e = _driver.FindElements(locator);
if (e.Any())
{
return e.ElementAt(0);
}
}
return null;
};
}
然后像这样称呼它
By[] locators = { By.Id("element1"), By.Id("element2") };
IWebElement foundElement = new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(AnyElementExists(locators));
然后foundElement 是找到与您的定位器匹配的第一个元素。匹配的可能不止一个,但这将是第一个。你可以根据你的场景改变方法来做任何你想做的事情或添加更多等等。
【讨论】: