Вышла Selenide 7.10.0

Вышла Selenide 7.10.0

Второй день рождения видео рекордера
20.08.25

Head õhtut!

20 августа у Эстонии второй день рождения - День Восстановления Независимости.

По традиции, в честь праздника мы бахнули релизец Selenide 7.10.0.

Теперь это второй день рождения и у нашего видео рекордера! (его прям сильно переделали)


Ускорили видео рекордер

В первых версиях видео рекордера мы использовали библиотеку org.bytedeco:javacv, чтобы сливать все снятые скриншоты в видео файл.

Оказалось, что это довольно медленный способ (и нам не удалось его как-то ускорить). Вместо этого гораздо быстрее сохранить все скриншоты в папку и потом дёрнуть команду:

ffmpeg -i screenshot.%d.png

Работает очень быстро (в моих тестах - всегда меньше секунды).

Важно:

  1. Теперь видео рекордер требует, чтобы на компе был установлен ffmpeg.
  2. Расширение видео файла поменялось с 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