4

我知道就等待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);**不会被忽视。一旦异常被捕获,它将返回 FALSE。另一方面,当找到一个元素时,它将返回 TRUE。

4

4 回答 4

5

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

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

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

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

更新 :

要回复您的评论,您需要在此处定义WebDriverWait实例。接下来,我们必须通过适当的ExpectedConditions子句在您的代码中实现WebDriverWait实例,即wait1 / wait2

于 2017-11-30T14:28:17.697 回答
3

这里是:

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

于 2017-11-30T14:28:43.010 回答
2

您可以WebDriverWait使用pollingignoring

例子:

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>

于 2017-11-30T14:28:30.750 回答
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;
}
于 2017-11-30T14:11:37.593 回答