0

我面临的问题是 Firefox Webdriver 无法正确确定元素是否可见:这是我正在使用的代码,它返回元素是可见的,尽管它不是

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

现在,如果我正在测试一个网站,其中的元素可以在网站的源中找到但不可见(例如,因为它前面还有另一个元素)。据我所知,该visibilityOfElementLocated方法仅检查元素的宽度和高度是否> 0,不是吗?考虑到糟糕的布局和错误的 z-index 等,有没有办法检查该元素对于在网站上冲浪的用户是否真的可见?这真的会很棒...

谢谢!

4

2 回答 2

3

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

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

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;
}
于 2013-11-15T22:20:27.577 回答
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

于 2013-11-15T11:17:34.807 回答