如何编写链接以等待元素显示?

时间:2017-11-20 14:55:53

标签: c# linq selenium

我在尝试使用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));
    }

1 个答案:

答案 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