我在尝试使用Linq时遇到语法问题。我只想检查一个元素是否包含一段文本,然后等待显示该文本,然后单击它。这是因为我要查找的元素位于滑块中,因此我需要等待滑块显示之前的相关文本才能选择它。
我如何写这个,因为以下是不正确的,因为acannot conver bool到OpenQA.selenium.By
public void SelectReasonsToBookWithUsLinks(string itemName, string linkText)
{
var ReasonsBookWithUsLinks = _driver.FindElements(HomepageResponsiveElements.BookWithUsLinks);
if (ReasonsBookWithUsLinks.Any(x => x.Text == linkText))
{
_driver.WaitForElementToExist(ReasonsBookWithUsLinks.SingleOrDefault(x => x.Text == linkText).Displayed, 120);
ReasonsBookWithUsLinks.Single(x => x.Text ==linkText).Click();
}
}
更新
WaitForElementToExist方法:
public static IWebElement WaitForElementToExist(this IWebDriver driver, By locator, int waitSeconds)
{
return new WebDriverWait(driver, TimeSpan.FromSeconds((double) waitSeconds)).Until<IWebElement>(ExpectedConditions.ElementExists(locator));
}
答案 0 :(得分:0)
Single
方法会引发异常,因为目标元素未显示或无法互动,System.InvalidOperationException
如果没有匹配则会public void SelectReasonsToBookWithUsLinks(string itemName, string linkText) {
var wait = new DefaultWait<IWebDriver>(_driver);
wait.IgnoreExceptionTypes(
typeof(System.InvalidOperationException),
typeof(InvalidElementStateException),
typeof(ElementNotVisibleException),
typeof(StaleElementReferenceException)
);
wait.Until(drv => {
drv.FindElements(HomepageResponsiveElements.BookWithUsLinks)
.Single(elm => elm.Text == linkText)
.Click();
return true;
});
}
。{/ p>
所以你可以简单地将动作包裹在服务员中,该服务员将重试,直到没有预期类型的例外:
style