Selenium Webdriver: visibilityOfElementLocated, хотя элемент не виден

0

Я столкнулся с проблемой, которую Firefox Webdriver не определяет правильно, если элемент виден или нет: это код, который я использую, который возвращает элемент, видимый, хотя он не

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

Теперь, что, если я тестирую веб-сайт, где элемент можно найти в источнике сайта, но не видно (например, потому что перед ним есть другой элемент). Из того, что я мог собрать, метод visibilityOfElementLocated проверяет только, имеет ли ширина и высота элемента> 0, не так ли? Есть ли способ проверить, является ли элемент ДЕЙСТВИТЕЛЬНО видимым для пользователя, занимающегося серфингом на сайте, учитывая плохой макет и неправильные z-индексы и т.д.? Это было бы здорово...

Спасибо!

Теги:
selenium
selenium-webdriver

2 ответа

3
Лучший ответ

Вы уверены, что не пытаетесь фактически проверить наличиеOfElementLocated вместо visibilityOfElementLocated? ВидимостьOfElementLocated работает только в том случае, если локатор, который вы ищете, имеет атрибут CSS отображения. Некоторые люди проверяют "elementExists", используя ".findElements(By).size()> 0", но вот альтернативный метод, требующий обработки исключений.

Это может быть излишним, но вы можете написать свою собственную функцию видимости. В этом примере я называю это "elementExists()". Он проверяет "присутствиеOf", но затем обрабатывает исключение "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;
}
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); - если вы знаете theres больше чем одно но не знаете точное число.

С наилучшими пожеланиями, Michał Felicjańczuk

Ещё вопросы

Сообщество Overcoder
Наверх
Меню