Драсьте!
На дворе 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