如何在不引发异常的情况下使用Selenium'Until'函数?

时间:2018-12-14 21:32:44

标签: c# selenium webdriverwait

我正在尝试使用可能与元素交互的硒创建测试脚本,但是如果元素不存在,它将不会。我需要补充一点,该元素可能需要一些时间才能显示。问题是,如果我使用FindElement,则会出现异常。如果我使用FindElements,则需要花费太长时间。因此,我尝试使用“ until”功能,该功能可以很好地等待元素出现,但是...如果没有出现,则会抛出异常,我想避免这种情况。

我知道我可以使用try catch。但是,还有什么更好的方法吗? 我现在有这个:

IWebElement button;
try{
    string x = "search query";
    button = this.WaitDriver.Until(d => d.FindElement(By.XPath(x)));
}catch{
    button = null;
}

1 个答案:

答案 0 :(得分:-1)

如果您要在没有try-catch的情况下测试存在性,则必须使用.FindElements()。使用相同的等待时间,不应该超过.FindElement()的时间,但是如果元素不存在,则等待将超时……这很痛苦。解决此问题的一种方法是执行以下操作。基本上就是您所做的一些调整。

public bool ElementExists(By locator)
{
    try
    {
        new WebDriverWait(driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementExists(locator));
        return true;
    }
    catch (Exception e) when (e is NoSuchElementException || e is WebDriverTimeoutException)
    {
        return false;
    }
}

我更喜欢检查是否存在而不是返回null,因为那样的话,您还必须检查null。通过将此函数放入函数中,您可以在任何时候调用它,并且测试保持整洁。您将使用它

By locator = By.Id("someId");
if (ElementExists(locator))
{
    IWebElement e = driver.FindElement(locator);
    // do something with e
}