当找不到元素时,如何避免/忽略OpenQA.Selenium.NoSuchElementException?

时间:2019-12-10 08:45:13

标签: .net selenium exception webdriverwait

我想确保给定元素不在DOM中,或者如果它存在于DOM中,则不再显示。

为此,我将WebDriverWait配置为忽略NoSuchElementException并且:

public static void WaitForElementToDisappear(IWebDriver driver)
{
     var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
     wait.IgnoreExceptionTypes(typeof(OpenQA.Selenium.NoSuchElementException));
     wait.Until(d => d.FindElement(By.ClassName("ClassName")).Displayed == false);
}

不幸的是,这种兴奋并没有被忽略,一旦抛出,测试就会失败。

如何处理?

编辑:我发现不幸的是,这是期望的等待行为,直到超时都不会引发异常,所以我的方法是绝对错误的。

1 个答案:

答案 0 :(得分:1)

为什么不使用现有的ExpectedConditions

wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.ClassName("ClassName")));

没有一个现有元素被认为是不可见的,您可以在source code中看到它,注意catch (NoSuchElementException)块中的注释

public static Func<IWebDriver, bool> InvisibilityOfElementLocated(By locator)
{
    return (driver) =>
    {
        try
        {
            var element = driver.FindElement(locator);
            return !element.Displayed;
        }
        catch (NoSuchElementException)
        {
            // Returns true because the element is not present in DOM. The
            // try block checks if the element is present but is invisible.
            return true;
        }
        catch (StaleElementReferenceException)
        {
            // Returns true because stale element reference implies that element
            // is no longer visible.
            return true;
        }
    };
}

docs

中也提到了
  

期望检查元素是否不可见   出现在DOM上。