Вышла Selenide 4.12.3

Вышла Selenide 4.12.3

Поддержка JUnit 5 и обновляемые коллекции
17.07.18

Всем привет! Наконец-то чемпионат закончился, и мы можем вернуться к своим любимым опен-сорсным проектам.

Сегодня мы выкатили Selenide 4.12.3

Пробежимся по изменениям?


Добавили поддержку JUnit 5

Как вы знаете, в Selenide есть специальная поддержка для двух самых распространённых тестовых фреймворков JUnit4 и TestNG. Это специальные “правила” или “Listeners”, которые позволяют периодически переоткрывать браузер, делать скриншоты и т.д.

Теперь мы добавили аналогичную поддержку и для JUnit 5:

  • BrowserStrategyExtension
  • ScreenShooterExtension
  • SoftAssertsExtension
  • TextReportExtension

Спасибо Aliaksandr Rasolka за PR 757

Кстати, мы заодно переписали собственные тесты Селенида на JUnit5 и AssertJ. Так что можете оттуда подсматривать примеры на JUnit5, если понадобится.


Таймаут для скачивания файлов

Как вы знаете, в Selenide есть метод $.download() для скачивания файла. Он использует стандартный Configuration.timeout для ограничения скачивания по времени.

Но иногда скачивание некоторых файлов может быть очень долгим (например, генерация какого-то сложного отчёта). Для этих случаев мы добавили новый метод для скачивания с заданным таймаутом:

File hugeReport = $("#huge-report").download(100500);

См. issue 758 - спасибо Yuri Ivanov за PR 761


Обновление коллекций при каждом обращении

Это изменение вызвало больше всего споров. Коллекции - это метод $$ - он возвращает список найденных элементов. Иногда список большой. Иногда это может ощутимо замедлить тест.

Было раньше

До версии 4.10.1 Selenide всегда загружал весь список заново при вызове любого метода коллекции. Поэтому простое итерирование большой коллекции (несколько сотен элементов) могло быть медленным:

$$("span").forEach(item -> item.is(visible));

Стало потом

В версии Selenide 4.10.1 мы стали кэшировать коллекции. Итерирование стало быстрее, но начались жалобы от других товарищей, которые кладут коллекцию один раз в переменную и как раз ожидают, что она будет всё время обновляться:

ElementsCollection movieTitles = $$(".film");
assertEquals("Black Panther", movieTitles.get(0).getText());
$(By.name("sort")).selectOption("Release Date");
assertEquals("The Irishman", movieTitles.get(0).getText());

На мой взгляд, такой код скорее неестественный: если уж ты ожидаешь, что страница перегрузится и содержимое коллекции изменится, то естественно было бы вызвать метод $$ заново. Поэтому я некоторое время не соглашался отменять кэширование ради “неправильных” тестов. Но в итоге победил аргумент за “единообразность”: ведь метод $ перегружает элемент при каждом обращении (хоть это и полу-случайно получилось), значит, и $$ тоже должен. Чтобы в Селениде всё вело себя одинаково.

Что теперь

В общем, мы выбрали некий компромиссный вариант: $$ загружает коллекцию заново при вызове любых методов, кроме $$.iterator() и $$.listIterator(). Таким образом, и итерирование будет быстрым, и элементы будут перегружаться. Правильное ли это было решение - посмотрим. Ведь и такое решение может вызвать неожиданные эффекты и бурные батхёрты.

$$.snapshot()

Кстати, на случай если вам захочется настоящего кэширования: в коллекциях есть теперь метод $$.snapshot(), который возвращает “снимок” коллекции, т.е. объект, отражающий текущее состояние и не перегружающий элементы коллекции. Любые итерации и проверки на нём будут быстрее. Можно использовать для оптимизации тестов, когда вы точно знаете, что содержимое коллекции на этой странице не меняется динамически.

См. issue 696

Новости

Следите за обновлениями!

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

ru.selenide.org

17.07.18