Всем привет!
Мы выпустили Selenide 7.6.0 с чем-то вкусненьким и интересненьким.
Йоу-йоу, погнали обновляться!
Видосики — вещь серьезная.
Если есть видосики, значит они что-то отражают.
Что нового:
because
для условий вебдрайвера$.scrollIntoCenter()
inNewBrowser
с кастомной конфигурациейSelenide.screenshot(filename)
А вот наконец-то!
У всех бывают нестабильные тесты. Моргающие тесты. Flaky tests.
Если эта тема для вас в новинку, я вам завидую. Вас ждёт увлекательное погружение в
Flaky Tests
Flaky Tests 2
Flaky tests. Порядок имеет значение
Flaky tests. Метод
Так вот, при расследовании моргающих тестов очень помогают видосики. И теперь Селенид умеет их делать из коробки.
Когда-то мы много пользовались библиотекой VideoRecorder от Сергея Пирогова, и она же позволила мне сделать все вышеупомянутые доклады. Но теперь Сергей собирает дроны для ВСУ и опенсорсом временно не занимается.
Такие времена. :(
Как начать записывать видосы?
Просто
selenide:7.6.0
на selenide-video-recorder:7.6.0
org.selenide.videorecorder.junit5.VideoRecorderExtension
(в случае JUnit5)org.selenide.videorecorder.testng.VideoRecorderListener
(в случае, прости господи, TestNG)@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
Как это работает?
В начале каждого помеченного теста Селенид запускает два потока:
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>
,
, <newline>
). Но оказалось, что различных извращённых пробелов гораздо больше (т.н. “En Space”, “Em Space”, “Three-Per-Em Space” и т.д.). Теперь мы их всех умеем игнорировать. :)
Например, для такой вот веб-странички:
<div id="hero">
Аху         ⁠  
      Дарьяи
</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.
Многие селенидовские методы помечены аннотациями @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.
Количество скачиваний побило новый рекорд - 1.3 миллиона за октябрь!
24.11.24