selenium ElementNotVisibleException无法捕获隐藏的元素

时间:2013-11-26 11:50:14

标签: javascript selenium

我目前正在尝试使用selenium进行一些用户界面测试,我遇到了这个不错的方法(不知道我从哪里得到它...),这假设要照顾不存在的元素和隐藏的元素... < / p>

问题在于第二个问题:即使元素未显示/隐藏(可见性:隐藏),该方法仍会返回'true'

public boolean elementExists(By locator, WebDriver driver) {
    WebElement foo = null;
    try {
        foo = this.getElementByLocator(locator, 10, driver);
    } catch (TimeoutException te) {
        System.out
                .println("Timeout - Dieses Element konnte nicht gefunden werden: "
                        + locator.toString());
        return false;
    } 
    catch (ElementNotVisibleException env) {
        System.out
                .println("Dieses Element wurde gefunden, ist aber nicht sichtbar: "
                        + locator.toString());
        return false;
    }
    if (foo == null ) {
        return false;
    } else {
        return true;
    }
}

public WebElement getElementByLocator(By locator, int timeout,
        WebDriver driver) {
    System.out.println("Rufe Methode getElementByLocator: "
            + locator.toString());
    int interval = 5;
    if (timeout <= 20)
        interval = 3;
    if (timeout <= 10)
        interval = 2;
    if (timeout <= 4)
        interval = 1;
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(timeout, TimeUnit.SECONDS)
            .pollingEvery(interval, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class,
                    StaleElementReferenceException.class);
    WebElement we = wait.until(ExpectedConditions
            .presenceOfElementLocated(locator));
    return we;
}

任何人都可以告诉我如何修改它以便能够识别出隐藏的现有元素?提前谢谢!

1 个答案:

答案 0 :(得分:1)

ExpectedConditions.presenceOfElementLocated

检查页面的DOM上是否存在元素。这并不一定意味着该元素是可见的。

尝试使用visibilityOfElementLocated代替。这将检查页面的DOM上是否存在元素并且可见。可见性意味着不仅要显示元素,还要使其高度和宽度大于0。

更多here

catch (ElementNotVisibleException env) {

我不认为这是你的情况。无论如何,如果你要与它进行交互并且元素将被隐藏 - 这将被抛出,但不会被查找。

编辑: 为什么这么多代码的利益如此之少?这也是一样的:

   public boolean elementExists(By locator, WebDriver driver){
        return  (new WebDriverWait(driver, 60)
                .ignoring(NoSuchElementException.class)
                .ignoring(StaleElementReferenceException.class)
                .until(ExpectedConditions.visibilityOfElementLocated(locator))) != null;
    }