Вышла Selenide 7.12.0

Вышла Selenide 7.12.0

Стоптайм
29.10.25

Остановись, мгновение!

Вышел уже второй релиз в октябре Selenide 7.12.0, успеть бы обновиться!

Мне не передать словами весь спектр чувств…

Когда ты каждый месяц пилишь чего-то там, релизишь, и вдруг видишь, что люди читают релиз ноутсы, обновляются —
это ли не лучшая награда?



Скриншоты с помощью DevTools/BiDi

Теперь Селенид для снятия скриншотов использует не стандартный вебдрайверовский метод, в DevTools (в хроме) или BiDi (в фаерфоксе). Во время работы над видео рекордером мы заметили, что этот способ

  1. намного быстрее, и
  2. не ворует фокус у браузера при параллельном запуске.

Теперь этот механизм распространился из видео рекордера на вообще все скриншоты в селениде.

См. issue 2712 и PR 3153.


Новый локатор byLabel

Есть теория, что веб-элементы в тестах лучше искать не по айдишникам и икспатхам, а так, как настоящий пользователь - по тексту или метке (label). Поиск по тексту был в селениде уже с версии 1.7 (2012 года), а теперь вот добавили поиск по метке:

$(byLabel("Song title")).val("Лебединое озеро");

Вторым параметром можно указать,

  1. хотите ли вы искать полный текст или подстроку;
  2. хотите ли вы чувствительный к регистру поиск или пофигительный к регистру;
  3. хотите ли вы игнорировать пробелы - последовательные или вообще все.
$(byLabel("Song title"), fullText()).val("Лебединое озеро");
$(byLabel("Song"), partialText()).val("Светлая полоса");

$(byLabel("Song    title"), fullText().trimWhitespaces()).val("Ты солдат");
$(byLabel("Songtitle"), fullText().ignoreWhitespaces()).val("Это было в России");

$(byLabel("SONG TITLE"), fullText().caseInsensitive()).val("Папина любовница");

См. PR 3148.


Новые локаторы byPlaceholder, byTitle, byAltText

Накидали ещё новых локаторов - поиск элементов по атрибутам placeholder, title и alt. Честно говоря, вы могли их и раньше использовать (года с 2014, с версии 1.10):

$(by("placeholder", "dovboyob"));
$(by("title", "jobu"));
$(by("alt", "Hloupá kurva"));

Но теперь появились отдельные методы - вдруг это послужит кому-то подсказкой.

  $(byPlaceholder("Укажите статью"))
    .val("Организация массового одновременного пребывания и (или) передвижения граждан в общественных местах, повлекших нарушение общественного порядка");

  $(byTitle("Чёртова картошка по вых"), partialText())
    .hover();

  $(byAltText("Картинка  для   привлечения"), partialText().ignoreWhitespaces())
    .shouldBe(image);

Во всех этих методах, опять же, можно указать вторым параметром

  • полнотекстовость,
  • регистропофигительность и
  • пробелоненавистничество.

См. PR 3151.


Новый локатор byTestId

Очень популярный паттерн - вешать на элементы искусственные айдишники data-test-id, чтобы в тестах именно по ним надёжно искать элементы.

  <div data-test-id="top-quote">Чипсы - чешуйки сатаны</div>

Опять же, и раньше ничто не мешало это делать в селениде: $("[data-test-id='top-quote']"), но теперь есть отдельный метод:

$(byTestId("top-quote"))
  .shouldHave(text("Чипсы - чешуйки сатаны"));

Одна загвоздка - у всех этот атрибут называется по-разному. В селениде по умолчанию он будет data-test-id - просто потому, что мне так нравится. :)

Если хотите его кастомизировать, есть два способа:

  1. Задать System.setProperty("selenide.test-id.attribute", "data-testid")
  2. Добавить строчку в файл selenide.properties:
    selenide.test-id.attribute=data-testid

См. PR 3151.


Переключение эмуляции мобильника

В селениде уже лет 6 есть возможность включить режим эмуляции мобильного браузера. Но чтобы его включить, нужно было открыть новый браузер.

А теперь можно включать-выключать мобильный режим в уже открытом браузере:

emulateDevice(Device.ONEPLUS_7T);
resetEmulation();

emulateDevice(Device.GALAXY_S21);
resetEmulation();

emulateDevice(new Device("Nokia 3210", 240, 320, 0.5));
resetEmulation();

(Это всё мои реальные телефоны. Угадайте, какой любимый?)

См. issue 2094 и PR 3159.


Собираем логи браузера с помощью DevTools/BiDi

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

List<String> webDriverLogs = getWebDriverLogs(BROWSER, Level.ALL);

assertThat(webDriverLogs).hasSize(6);
assertThat(webDriverLogs.get(0))
  .contains("/bank/login 12:18 .*ReferenceError: \\$ is not defined");

Проблема в том, что этот метод не работал в Firefox. Потому, что Firefox не поддерживает стандартный вебдрайверовский метод webdriver.manage().logs().

Теперь же этот метод будет работать во всех нормальных браузерах, ведь отныне мы собираем логи браузера через протокол BiDi. Который типа тоже w3c стандарт и поддерживается как минимум в Chromium и Firefox.

См. issue 1636 и PR 3156.


Можно искать прямо в shadow host byShadowCss

Кароч, теперь можно написать вот такой поиск:

$("#shadow-host")
  .find(shadowCss("p")) // раньше тут требовался второй аргумент
  .shouldHave(text("Inside Shadow-DOM"));

А раньше этот код не компилировался, потому что shadowCss("p") требовал второго аргумента.

См. issue 3142. Спасибо Vivien Tintillier за PR 3143.


Новый метод $.unhighlight()

Есть у нас метод $.highlight(), который давно уже страдал от одиночества. Не хватало ему пары.

Теперь вы можете как подсветить, так и отсветить обратно любой элемент:

$("#naoko").highlight();
$("#naoko").selectOption("13");
$("#naoko").unhighlight();

См. issue 3057 и PR 3155.


Обновили Selenium с 4.36.0 на 4.38.0

И подняли версию CDP с v140 до v142.

См. PR 3147 и PR 3154


Вот такой мясистый релизец получился.

Обновляйтесь, радуйтесь, не теряйте оптимизма. Светлая полоса где-то там не за горами.

И пусть танцуют лебеди!


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

ru.selenide.org

29.10.25