Вышла Selenide 7.6.0

Вышла Selenide 7.6.0

Видео рекордер
24.11.24

Всем привет!
Мы выпустили Selenide 7.6.0 с чем-то вкусненьким и интересненьким.
Йоу-йоу, погнали обновляться!

Видосики — вещь серьезная.
Если есть видосики, значит они что-то отражают.

Что нового:


Добавили видео рекордер

А вот наконец-то!

У всех бывают нестабильные тесты. Моргающие тесты. Flaky tests.

Если эта тема для вас в новинку, я вам завидую. Вас ждёт увлекательное погружение в
Flaky Tests
Flaky Tests 2
Flaky tests. Порядок имеет значение
Flaky tests. Метод

Так вот, при расследовании моргающих тестов очень помогают видосики. И теперь Селенид умеет их делать из коробки.

Когда-то мы много пользовались библиотекой VideoRecorder от Сергея Пирогова, и она же позволила мне сделать все вышеупомянутые доклады. Но теперь Сергей собирает дроны для ВСУ и опенсорсом временно не занимается.
Такие времена. :(

Как начать записывать видосы?

Просто

  1. Замените зависимость selenide:7.6.0 на selenide-video-recorder:7.6.0
  2. Повесьте на ваши тесты расширение org.selenide.videorecorder.junit5.VideoRecorderExtension (в случае JUnit5)
  3. Повесьте на ваши тесты листенер org.selenide.videorecorder.testng.VideoRecorderListener (в случае, прости господи, TestNG)
  4. Повесьте аннотацию @Video на нестабильные тесты (их ведь немного?)

Теперь селенид начнёт записывать видосы для всех помеченных тестов.
НО
сохранять видос будет только в том случае, если тест упал. Ссылка на видео будет автоматически добавлена к сообщению об ошибке - так же, как ссылка на скриншот.

Element should have text "Орешник"
Actual value: text="Кокошник"

Screenshot: file:/.../build/reports/tests/1732761758509.0.png
Page source: file:/.../build/reports/tests/1732761758509.0.html
Video: file:/.../build/reports/tests/1732761754743.0.webm

Как это работает?

В начале каждого помеченного теста Селенид запускает два потока:

  1. Регулярно снимает скриншоты браузера и складывает в очередь (пока в памяти)
  2. Сливает скриншоты из очереди в видео (используя библиотеку org.bytedeco:javacv)

В конце теста видео либо удаляется, либо сохраняется в файл и прикрепляется к сообщению об ошибке.


P.S. Это поведение и некоторые параметры можно настраивать в файле selenide.properties, см. VideoConfiguration.


NB! Имейте в виду, что запись видео жрёт ресурсы и замедляет работу компьютера. Используйте точечно.


См. issue 2145. Спасибо Sergey Brit за PR 2768,
Также см. PR 2890 с аннотациями-конфигурациями.


Добавили because для условий вебдрайвера

Теперь можно написать не просто:

webdriver().shouldHave(numberOfWindows(2)));
webdriver().shouldHave(url("https://dictionary.cambridge.org")));

а с пояснением:

webdriver().shouldHave(
  numberOfWindows(2).because("Логин должен открыться в новом окне"));

webdriver().shouldHave(
  url("https://dictionary.cambridge.org/").because("WTF is Oreshnik?"));

Спасибо Daniil Moiseev за PR 2853.


Добавили метод $.scrollIntoCenter()

По сути это то же самое, что $.scrollIntoView("{block: 'center'}"), просто короче.
Ведь в большинстве случаев, когда мы скроллим, мы хотим именно этого.

  $("#logout")
    .scrollIntoCenter()
    .shouldHave(text("Мутная кнопка где-то внизу экрана"))
    .click();

См. PR 2842.


Поддержка специальных пробелов

Когда мы ищем веб-элемент по тексту или проверяем текст элемента, нам надо игнорировать пробелы (как правило). Ведь по спецификации html, несколько идущих подряд пробелов (а также символов  , табов и т.п.) считаются за один.

До сих пор Селенид трактовал таким образом несколько пробельных символов (<space>, <tab>, &nbsp;, <newline>). Но оказалось, что различных извращённых пробелов гораздо больше (т.н. “En Space”, “Em Space”, “Three-Per-Em Space” и т.д.). Теперь мы их всех умеем игнорировать. :)

Например, для такой вот веб-странички:

<div id="hero">
  Аху &#32; &nbsp; &ensp; &emsp; &numsp; &NoBreak; &puncsp; 
  &ThinSpace; &VeryThinSpace; &MediumSpace; Дарьяи
</div>

Будет работать такой тест:

  $("#hero").shouldHave(text("Аху Дарьяи"));

  $(byText("Аху Дарьяи")).ancestor().shouldHave(
    text("Произнесите её имя и расскажите её историю."));

Спасибо Daniil Moiseev за PR 2858.
Также см. PR 2884.


Исправили inNewBrowser с кастомной конфигурацией

Это редко используется, так что не заморачивайтесь. Но для отчётности надо упомянуть.

Во-первых, добавили метод inNewBrowser с возможностью открытия браузера с кастомной конфигурацией:

inNewBrowser(Config config, Runnable lambda)

Во-вторых, исправили старый метод inNewBrowser(Runnable lambda), если внутри него использовалась кастомная конфигурация (в этом случае при закрытии браузера предыдущая конфигурация не восстанавливалась).

См. issue 2859 и PR 2902.


Исправили аппиумскую пэдж фактори

Исправили багу в selenide-appium, когда тест пытался создать не мобильный, а обычный вебовский пэдж обжект. Причём до того, как веб-браузер открыт.

Спасибо Petro Ovcharenko за PR 2879.


Уменьшили количество селенидовских логов

Мы пересмотрели логи, которые пишет Selenide, и превратили некоторые “info” логи в “debug”.
Другими словами, теперь в логах должно быть меньше спама.
Если понадобится отлаживать какую-то сложную проблему, включайте уровень “debug”. ;)

См. PR 2892.


Подправили поведение Selenide.screenshot(filename)

У него в javadoc было написано, что он сохраняет оба файла - “.html” и “.png”. А на самом деле сохранял только “*.png”. Теперь поведение соответствует описанию.

См. issue 2896 и PR 2901.


JSR305 -> JSpecify

Многие селенидовские методы помечены аннотациями @Nullable, @Nonnull, @CheckReturnValue, @ParametersAreNonnullByDefault.
Это чтобы вам их легче было использовать, и IDE подсказывала вам какие-то типичные косяки:

  $("h1");   // Упс, кто-то забыл проверку: .shouldBe(visible)

Так вот, до сих пор эти аннотации мы брали из библиотеки “JSR 305” (соответственно, аннотации импортировали из пакета javax.annotation).
Но эта библиотека уже давно не поддерживается. А недавно ей на замену выпустили новую библиотеку JSpecify. И Селенид перешёл на неё. Теперь аннотации импортируются из пакетов org.jspecify.annotations и com.google.errorprone.annotations.

См. PR 2889.


Упростили кастомные команды

Если вы создавали свой подкласс от Click, SetValue или других селенидовских команд, то мы вам случайно поломали обратную совместимость. Прастите. :)

Теперь вместо метода

public SelenideElement execute(SelenideElement proxy, WebElementSource locator, Object [] args) { ... }

вам нужно будет имплементировать метод

protected void execute(WebElementSource locator, Object @Nullable [] args) { ... }

Но так ведь короче и проще, правда же?

Но в целом, если у вас проект компилируется, то не парьтесь, вас это не касается. :)

См. issue 2906 и PR 2889.


Обновили зависимости

  • bump Selenium from 4.25.0 to 4.26.0 (incl. CDP 129 -> 130)
  • Bumps BrowserUpProxy from 2.2.19 to 3.0.0.
  • Bump LittleProxy from 2.3.0 to 2.3.2
  • Bump Netty from 4.1.113.Final to 4.1.115.Final
  • Bump Guava from 33.3.0-jre to 33.3.1-jre
  • Bump JUnit from 5.11.0 to 5.11.3
  • Bump Jackson from 2.17.2 to 2.18.1
  • Bump HttpClient from 5.4 to 5.4.1


Новости


Статистика

Количество скачиваний побило новый рекорд - 1.3 миллиона за октябрь!


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

ru.selenide.org

24.11.24