之前学习显示等待的时候觉得这两个方法很像,以为只是传入值的区别而已,今天用到后才领会真正的区别,特此记录一下。

    ChromeDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");
    WebDriverWait wait = new WebDriverWait(driver,10);
    wait.ignoring(NoSuchElementException.class).until(ExpectedConditions.invisibilityOf(driver.findElement(By.id("notFound"))));
}

根据报错信息可以看到 invisibilityOf 是不会忽略 NoSuchElementException 的

然后我们换成 invisibilityOfElementLocated

ChromeDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
        WebDriverWait wait = new WebDriverWait(driver,10);
        System.out.println(new Date());
        wait.ignoring(NoSuchElementException.class).until(ExpectedConditions.invisibilityOfElementLocated(By.id("notFound")));

可以看到是忽略了 NoSuchElementException

所以得到简单的结论就是:
invisibilityOf 由于传的是 WebElement 需要先定位到元素,所以 ignoring 不会捕获异常
invisibilityOfElementLocated 会捕获 NoSuchElement 异常,然后瞄了眼源码发现

所以即使我们这样写也能处理掉异常

wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("notFound")));

但是为什么没有报超时的错呢?下班了回去再瞅瞅


↙↙↙阅读原文可查看相关链接,并与作者交流