Java Selenium 判断元素节点是否存在的正确方法

516人浏览 / 0人评论

在使用 Java + Selenium 处理一些操作的时候,有的元素、节点可能只有在特殊情况下才会出现,而且当这些元素、节点出现的时候,会影响我们的正常操作。所以要判断这个元素、节点是否存在,如果存在,则要进行一些特殊的处理。一般我们都会使用 driver.findElement 来处理:

public boolean elementExists(WebDriver driver, By locator) {
    try {
        driver.findElement(locator);
        return true;
    } catch (NoSuchElementException e) {
        System.out.println("Element:" + locator.toString() + " is not exists!");
    }

    return false;
}

或者使用 显示等待或隐式等待来 来处理 :

    /**
     * 判断元素是否存在
     * 
     * @param driver
     * @param locator
     * @param timeOutInSeconds
     *            最多等待的时间,单位 : 秒
     * @return
     */
    public static boolean elementExists(WebDriver driver, By locator, int timeOutInSeconds) {
        try {
            new WebDriverWait(driver, timeOutInSeconds).until(ExpectedConditions.elementToBeClickable(locator));
            return true;
        } catch (Exception e) {
            return false;
        } finally {
            
        }
    }

 

但是这样即要花费一些时间等待,而且还会抛出异常信息。下面介绍正确的方法:

使用 findElement 如果没有找到元素节点,会抛出1个异常。

而使用 findElements 如果没有找到匹配的元素,将返回一个空列表,而不是一个异常。

Boolean isPresent = driver.findElements(By.yourLocator).size() > 0;

进一步封装:

    /**
     * 返回匹配的第1个元素,匹配不到则返回 null
     * @param locator
     * @return
     */
    private static WebElement findElement(By locator) {
        List<WebElement> elements = findElements(locator);
        if (elements != null) {
            return elements.get(0);
        }

        return null;
    }

    /**
     * 返回匹配的所有元素,匹配不到则返回 null
     * @param locator
     * @return
     */
    private static List<WebElement> findElements(By locator) {
        if (locator != null) {
            List<WebElement> elements = driver.findElements(locator);
            if (elements.size() > 0) {
                return elements;
            }
        }

        return null;
    }

这样 调用 findElement 和 findElements ,判断返回是否为空,不为空就可以其它操作了。

全部评论