Head õhtut!
20 августа у Эстонии второй день рождения - День Восстановления Независимости.
По традиции, в честь праздника мы бахнули релизец Selenide 7.10.0.
Теперь это второй день рождения и у нашего видео рекордера! (его прям сильно переделали)
- Ускорили видео рекордер
- Скриншоты для видео рекордера через BiDi или DevTools
- Скроллинг с опциями
$.scrollIntoView(options)
- Статические методы для создания контейнеров
- Аннотация
@DeepShadow
- Валидация
incrementTimeout
- Обновили Selenium с 4.34.0 на 4.35.0
Ускорили видео рекордер
В первых версиях видео рекордера мы использовали библиотеку org.bytedeco:javacv
, чтобы сливать все снятые скриншоты в видео файл.
Оказалось, что это довольно медленный способ (и нам не удалось его как-то ускорить). Вместо этого гораздо быстрее сохранить все скриншоты в папку и потом дёрнуть команду:
ffmpeg -i screenshot.%d.png
Работает очень быстро (в моих тестах - всегда меньше секунды).
Важно:
- Теперь видео рекордер требует, чтобы на компе был установлен
ffmpeg
. - Расширение видео файла поменялось с
webm
наmp4
.
См. issue 3058, PR 3071 за PR 3079.
Спасибо @Deni_Don и Aliaksandr Rasolka за мозговой штурм и проверку гипотез!
Скриншоты для видео рекордера через BiDi или DevTools
До сих пор видео рекордер делал скриншоты с помощью стандартного метода вебдрайвера TakesScreenshot.getScreenshotAs
.
С ним есть проблема в Хроме: он перехватывает фокус браузера. Что создаёт эффект мелькания при параллельном запуске
несколько браузеров, и теоретически даже может вызвать падение теста.
Полюбуйтесь, как весело это выглядит! :)
БЫЛО:
Теперь мы снимаем скриншоты альтернативным способом:
- в Chromium браузерах через
DevTools
, - а в Firefox через
BiDi
.
Оказалось, что так значительно быстрее, и фокус не теряется.
СТАЛО:
См. PR 3077.
Скроллинг с опциями $.scrollIntoView(options)
Издревле в Selenide есть метод для скроллинга:
$.scrollIntoView("{block: \"end\"}");
$.scrollIntoView("{behavior: \"instant\", block: \"end\", inline: \"nearest\"}");
Проблема в том, что этот параметр в формате json - из мира JavaScript, его синтаксис надо знать или откуда-то копировать, и в нём легко ошибиться.
Теперь аналогичную команду можно написать на Java со всем его блэк-джеком, автокомплитом и подсветкой синтаксиса:
$.scrollIntoView(instant().block(end));
$.scrollIntoView(instant().block(center).inline(nearest));
Кстати,
- Оба старых метода
scrollIntoView
теперь@Deprecated
. - Новый API стимулирует использовать опцию
instant
. Она выключает плавную прокрутку, которая иногда могла провоцировать нестабильные тесты.
См. PR 3078.
Статические методы для создания контейнеров
Это похоже на метод page()
, который позволяет создавать пэдж обжекты.
Новый метод container()
позволяет создавать Container
:
class PopupA implements Container {
PopupB next() {
return container("#popupb", PopupB.class);
}
}
class PopupB implements Container {
PopupA back() {
return container("#popupa", PopupA.class);
}
}
Спасибо Ilya Koshaleu за PR 3053.
Аннотация @DeepShadow
Уже давно у нас есть метод shadowDeepCss для поиска элемента в нескольких вложенных shadow dom.
Теперь такой же поиск можно оформить и в пэдж обжекте с помощью новой аннотации @DeepShadow
:
class PageObject {
@DeepShadow
@FindBy(css = "#myelementid")
private SelenideElement myElement;
@DeepShadow
@FindBy(css = ".my-elements")
private List<SelenideElement> myElements;
}
Спасибо Ilya Koshaleu за PR 3083.
Валидация incrementTimeout
Теперь мы проверяем, что incrementTimeout
не больше, чем общий таймаут для скачивания файла.
Теперь вызов метода только с incrementTimeout
:
$.download(using(FOLDER)
.withTimeout(ofMillis(4000))
.withIncrementTimeout(ofMillis(30_000)))
сразу выдаст ошибку:
IllegalArgumentException:
Timeout (4000 ms) must be greater than increment timeout (30000 ms)
См. PR 3093.
Обновили Selenium с 4.34.0 на 4.35.0
И подняли версию CDP с v138 до v139.
И заодно ещё обновили Appium с 9.5.0 до 10.0.0
Спасибо Aliaksandr Rasolka за PR 3087

ru.selenide.org
20.08.25