在 Fluent Wait 中处理 NoSuchElementException

Handle the NoSuchElementException in Fluent Wait

我知道就等待 DOM 中不存在的 Web 元素而言,最有效的是流畅的等待。所以我的问题是:

有没有办法处理和捕获 NoSuchElementException 或任何由于元素不存在而可能引发的异常?

我需要一个布尔方法,无论是否找到元素,它都会给我结果。

这种方法在网络上很流行。

public void waitForElement(WebDriver driver, final By locator){
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(60, TimeUnit.SECONDS)
            .pollingEvery(2, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);

   wait.until(new Function<WebDriver, WebElement>() {
        public WebElement apply(WebDriver driver) {
            return driver.findElement(locator);
        }
    });
}

我需要的是,**.ignoring(NoSuchElementException.class);**不会被忽略。一旦捕获到异常,它将 return FALSE。另一方面,当找到一个元素时,它将 return TRUE。

您可以尝试使用下面的代码片段

    /*
 * wait until expected element is visible
 */
public boolean waitForElement(WebDriver driver, By expectedElement) {
    boolean isFound = true;
    try {
        WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds , 300);
        wait.until(ExpectedConditions.visibilityOfElementLocated(expectedElement));
        makeWait(1);
    } catch (Exception e) {
        //System.out.println(e.getMessage());
        isFound = false;
    }
    return isFound;
}

作为替代方案,因为您希望通过轮询查看 WebDriverWait 的实现,这里是构造函数的详细信息:

  • WebDriverWait(WebDriver driver, long timeOutInSeconds):Wait 将忽略在 'until' 条件下默认遇到(抛出)的 NotFoundException 实例,并立即传播所有其他实例。

    WebDriverWait wait1 = new WebDriverWait(driver, 10);
    
  • WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis):Wait 将忽略在 'until' 条件下默认遇到(抛出)的 NotFoundException 实例,并立即传播所有其他实例。

    WebDriverWait wait2 = new WebDriverWait(driver, 10, 500);
    

更新:

要回答您的评论,您需要在此处定义 WebDriverWait 实例。接下来我们必须实现 instance i.e. wait1 / wait2 within your code through proper ExpectedConditions 子句。

您可以将 WebDriverWaitpollingignoring

一起使用

示例:

public boolean isElementPresentWithWait(WebDriver driver, WebElement element) {
    try {
        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.pollingEvery(3, TimeUnit.SECONDS).ignoring(NoSuchElementException.class).until(ExpectedConditions.visibilityOf(element);
        return true;
    } catch (TimeoutException e) {
        return false;
    }
}

方法 ignoringpollingEvery return FluentWait<WebDriver>

的实例

这里是:

public boolean waitForElementBoolean(WebDriver driver, By object){
    try {
        WebDriverWait wait = new WebDriverWait(driver,60);
        wait.pollingEvery(2, TimeUnit.SECONDS);
        wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(object));
        return true;
    } catch (Exception e) {
        System.out.println(e.getMessage()); 
        return false;
    }
}

我将流畅等待与显式等待结合起来。 :D 谢谢你们! :)