суббота, 28 апреля 2012 г.

Заставляем браузер ждать пока существует определенный элемент.

Для реализации такой функции в наших тестах нам потребуется класс WebDriverWait и  класс Predicate.

Пишем следующую функцию:

public void waitUntilElementPresent(final String xpath){
        new WebDriverWait(this.driver, 10).until(new Predicate<WebDriver>() {
            public boolean apply(WebDriver arg0) {
                return !arg0.findElement(By.xpath(xpath)).isDisplayed();
            }
        });
    }

При вызове этой функции браузер будет ждать до тех пор пока элемент с xpath, который мы передали, существует.

PS: Небольшая поправка, в данном случае браузер будет ждать 10 секунд.

6 комментариев:

  1. Лучше не привязываться к xpath а использовать тип By для большей гибкости.

    ОтветитьУдалить
    Ответы
    1. Лучше конечно ) Код взят из проекта в котором все атрибуты элементов генерируются динамически. Поэтому и xpath.

      Удалить
  2. http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html#invisibilityOfElementLocated(org.openqa.selenium.By)

    ОтветитьУдалить
  3. Кстати, предложенная реализация слишком проста -- надо ещё перехватывать исключения NoSuchElementException и StaleElementReferenceException, их появление также свидетельствует о том, что элемента нет (ExpectedConditions.invisibilityOfElementLocated делает такие проверки).

    Либо надо использовать не WebDriverWait, а FluentWait и самостоятельно настраивать игнорируемые исключения, в этом случае можно будет использовать предикаты более простого вида.

    ОтветитьУдалить
  4. На проекте попробовал через ExpectedConditions и браузер стал зависать по непонятной причине и не видеть явно видных элементов, как только вернул свой вариант проблема разрешилась. В чем было дело если честно не знаю )

    ОтветитьУдалить