在Fluent Wait中处理NoSuchElementException

时间:2017-11-30 14:04:28

标签: java selenium-webdriver selenium-chromedriver nosuchelementexception fluentwait

我知道在等待DOM中尚未包含的网络元素方面,效率最高的是流畅的等待。所以我的问题是:

有没有办法处理和捕获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);**不会被忽视。一旦捕获到异常,它将返回FALSE。另一方面,当找到元素时,它将返回TRUE。

4 个答案:

答案 0 :(得分:5)

作为替代方案,您希望通过轮询查看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 实例。接下来,我们必须在代码中通过适当的方式实现 WebDriverWait 实例,即 wait1 / wait2 ExpectedCondition 条款。 ExpectedConditionJavaDocs就在这里。

答案 1 :(得分:2)

您可以将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返回FluentWait<WebDriver>

的实例

答案 2 :(得分:2)

这是:

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谢谢你们! :)

答案 3 :(得分:1)

您可以尝试使用以下代码段

    /*
 * 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;
}