Как быстро проверить размер?

Как быстро проверить размер?

Selenide Advent Calendar
День 4
04.12.19

Драсьте!

На дворе 4 декабря, перед вами открыт рождественский календарь Selenide, и в сегодняшнем посте я покажу один простой трюк, как сделать некоторые проверки быстрее.

Как быстро проверить размер коллекции?

В Selenide есть удобные методы для проверки коллекций. Например, вот так можно проверить, что в некотором списке книг ровно три книги:

@Test {
 $$("#books .book").shouldHave(size(3));
}

А если страница реализована так, что в HTML книг больше, а ненужные книги просто прячутся, то можно отфильтровать коллекцию перед проверкой:

@Test {
 $$("#books .book").filter(visible).shouldHave(size(3));
}

Проблема

Если таких книг на странице много (скажем, несколько десятков и больше), то такая фильтрация может быть медленной (скажем, от нескольких секунд и выше). Причина в том, что метод filter(visible) должен вызвать метод WebElement.isDisplayed() в цикле для каждого элемента коллекции по отдельности. А каждый вызов - это отдельное обращение к вебдрайверу, отдельный http запрос и т.д. В сумме накапливается.

Может быть, в вашем проекте тесты бегут трое суток, и несколько секунд погоды не делает. Тогда можете дальше не читать.

Но если вы заботитесь об эффективности ваших тестов, если работаете над их ускорением - мой пост для вас.

Первая попытка

Как можно ускорить эту проверку? Напрашивается первое решение: фильтровать видимые элементы на уровне селектора:

@Test {
 $$("#books .book:visible").shouldHave(size(3));
}

Но так не работает.

Проблема в том, что CSS-селектора :visible не существует. Такую штуку умеет делать только JQuery.

Вторая попытка

Что же нас спасёт?

Вера Брежнева ошибалась: мир спасёт не красота, мир спасёт уродство. И имя ему - JavaScript.

Вы можете создать вспомогательный метод, который с помощью JavaScript и JQuery вернёт количество элементов:

private int sizeOf(String cssSelector) {
  Number count = executeJavaScript("return $(arguments[0]).length", cssSelector);
  return count.intValue();
}

(этот код работает только при наличии JQuery на тестируемой странице. Если JQuery нет, наверняка можно написать аналогичный код с использованием любой другой библиотеки.)

И теперь эта проверка будет быстрой, потому что она обратится к браузеру всего один раз. А браузер внутри себя выполняет любые скрипты очень быстро.

@Test {
  assertEquals(1, sizeOf("#books .book:visible"));
}

Что теперь?

Познайте всю мощь JavaScript.
Он позволяет ещё много разных трюков, которые помогут сделать ваши тесты быстрее и надёжнее.



Андрей Солнцев

ru.selenide.org

04.12.19