Selenium Webdriver:visibilityOfElementLocated尽管元素不可见

时间:2013-11-15 09:26:04

标签: html css selenium selenium-webdriver

我遇到的问题是Firefox Webdriver无法正确判断元素是否可见:这是我正在使用的代码,它返回该元素是可见的,尽管它不是

wait.ignoring(UnhandledAlertException.class).until(ExpectedConditions.visibilityOfElementLocated(By.id("ad")));

现在,如果我正在测试一个网站,该网站可以在网站的源代码中找到但是不可见(例如,因为它前面有另一个元素)。从我可以收集的visibilityOfElementLocated方法只检查元素的宽度和高度是否> 0,不是吗? 有没有办法检查在网站上冲浪的用户是否真的可见,考虑到错误的布局和错误的z索引等?这真的很棒......

谢谢!

2 个答案:

答案 0 :(得分:3)

您确定您没有尝试实际测试presenceOfElementLocated而不是visibilityOfElementLocated吗?只有在您搜索的定位器设置了显示CSS属性时,visibilityOfElementLocated才有效。有些人使用“.findElements(By).size()> 0”来测试“elementExists”,但这里有一种需要处理异常的替代方法。

这可能有点矫枉过正,但您可以编写自己的可见性功能。在这个例子中,我称之为“elementExists()”。它测试“presenceOf”,但如果有的话,则处理“visiblity”异常:

public boolean elementExists( By locator ) {   
    WebElement foo = null;
    try {
        foo = this.getElementByLocator( locator, 10 );
     } catch ( TimeoutException te) {
        System.out.println("There was a timeout looking for element: " + 
            locator.toString() );
        //Swallow exception: ExceptionUtils.getMessage(te);
        return false;
    } catch ( ElementNotVisibleException env ) {
        System.out.println("The element was found but is invisible: " +
            locator.toString() );
        //Swallow exception: ExceptionUtils.getMessage(env);
        return false;
    }
    if ( foo == null ) {
        return false;
    } else {
        return true;
    }
}

public WebElement getElementByLocator( By locator, int timeout ) {
    System.out.println("Calling method 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>( se.myDriver )
        .withTimeout(timeout, TimeUnit.SECONDS)
        .pollingEvery(interval, TimeUnit.SECONDS)
        .ignoring( NoSuchElementException.class, 
                       StaleElementReferenceException.class );
    WebElement we = wait.until( ExpectedConditions
           .presenceOfElementLocated( locator ) );
    return we;
}

答案 1 :(得分:0)

protected void asChk(By what, int presence) {
        asChk(what, presence, false);
}

protected void asChk(By what, int presence, boolean isGreater) {
    List<WebElement> boxesHeader  = driver.findElements(what);
    if(isGreater) 
    assertTrue(boxesHeader.size() >= presence);
    else 
    assertTrue(boxesHeader.size() == presence);
    }   

试试这段代码。

如何使用它:

asChk(By。 localizator (* localizatorDomValue *),1);

或:

asChk(By。 localizator (* localizatorDomValue *),1,true); - 如果你知道不止一个,但不知道确切的数字。

最诚挚的问候, MichałFelicjańczuk