Вышла Selenide 7.0.0

Вышла Selenide 7.0.0

Нам 12, Java 17
25.10.23

С днём рождения!

Да-да, в этот день 12 лет назад был сделан первый коммит в проекте Selenide. Если интересно, здесь видос моего рассказа к 10-летию селенида.

К празднику мы выпустили мажорный релиз Selenide 7.0.0 с обновлением аж сразу на Java 17.


Обновились на Java 17

Чума! Этот день настал!

Чтобы использовать Selenide 7.+, вам придётся компилировать и запускать тесты на Java 17+.

Как же это круто, да?

Я знаю, среди вас найдутся те, кому это решение не понравится. Вы всё ещё вынуждены гонять тесты на Java 8.

Но мы не виноваты. Как вы знаете, Selenium 4.14+ перешёл с Java 8 на Java 11. Так что продолжать жить с Java 8 у вас всё равно не получилось бы. Обновиться на Java 11 всё равно пришлось бы. Ну а дальше простое соображение: самое сложное обновление как раз с Java 8 на Java 11. А вот с Java 11 на Java 17 обновиться намного проще. Там и делать-то ничего не надо.

Так что обновляйтесь смелее!

Жизнь слишком коротка, чтобы продолжать мять титьки с Java 8

См. PR 2522.


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

  • Обновили Selenium с 4.13.0 на 4.14.1 (PR 2505) - требует Java 11+
  • Обновили Appium с 8.6.0 на 9.0.0 (PR 2505) - требует Java 11+
  • Обновили TestNG с 7.4.0 на 7.8.0 (PR 2505) - требует Java 11+


Исправили дедлок при инициализации классов

Это старая болячка в Selenide: класс Condition и любой из его дочерних классов зависели друг от друга. Поэтому при определённых обстоятельствах мог случиться дедлок при одновременной загрузке этих классов. Крайне редко, но теоретически возможно.

Подробнее про static initialization deadlock можно посмотреть в видосе Перформансные войны.

При этом нам пришлось переименовать базовый класс для всех проверок из Condition в WebElementCondition.

  1. Не пугайтесь, все ваши импорты типа Condition.visible останутся без изменений.
  2. А вот если вы написали свои самодельные проверки, то в них надо будет заменить extends Condition на extends WebElementCondition.

См. issue 2372 и PR 2453.


Актуальное значение на момент проверки

Тут идёт речь не о классических проверках веб-элементов, а о проверках “нового поколения”: url, localStorage и т.п.

webdriver().shouldHave(url("https://some.com/page.html"));
localStorage().shouldHave(item("mouse", "Jerry”));
sessionStorage().shouldHave(itemWithValue("mouse", "Jerry));
clipboard().shouldHave(content("Лох, Антилохово, Шалава, Мусорка, Пуково, Попки и Бухалово"));

В общем, мы сделали сообщение об ошибке более корректным. За деталями можно сгонять в issue 2500 и PR 2501.


Удалили старые методы в Condition

Удалили методы apply() и actualValue() в классе Condition. Они уже давно были помечены как @Deprecated.

Вас это коснётся, только если вы писали свои самодельные проверки. Теперь вместо двух методов apply() и actualValue() вам нужно будет реализовывать лишь один метод check.

См. PR 2512.


Удалили старые методы в CollectionCondition

Аналогично предыдущему пункту, если у вас есть самодельные проверки для коллекций (extends CollectionCondition), то в них вместо методов test и fail надо будет реализовать один метод check.

См. PR 2520.


Удалили старые методы в ElementsCollection

Боюсь, тут будет много чего подгорать. :) В общем, теперь ElementsCollection больше не наследует java.util.List. Изначально это наследование случайно привнесло в ElementsCollection кучу ненужных методов (таких, как remove(), removeRange, clear, subList или listIterator()), которые никогда не планировалось реализовывать. Но пользователи иногда использовали. И даже иногда жаловались на хабре, что они не так работают.

Ну вот, теперь нет методов - нет проблем.
В $$ остались только те методы, которые мы считаем нужными. Аминь.

P.S. Если у вас есть цикл по элементам коллекции:

  for (SelenideElement el : $$("#selenide-users .user")) {
    el.shouldBe(visible);
  }

то он перестанет компилироваться.

Быстрое решение - добавить к нему asFixedIterable():

  for (SelenideElement el : $$("#selenide-users .user").asFixedIterable()) {
    el.shouldBe(visible);
  }

Но правильное решение - переписать код и избавиться от цикла. Скорее всего вам стоит написать свой collection condition.

См. PR 2513.

UPD С версии 7.0.1 снова компилируется.


Заменили ElementsContainer на Container

Если вы вычленяли куски ваших пэдж обжектов в отдельные переиспользуемые компоненты (или “виджеты”), то они обычно наследовали класс ElementsContainer:

class WeatherWidget extends ElementsContainer {
  @FindBy(id = "air")
  private SelenideElement airTemperature;
}

Теперь надо будет заменить ElementsContainer на просто Container:

class WeatherWidget implements Container {
  @FindBy(id = "air")
  private SelenideElement airTemperature;
}

При этом пропадает метод getSelf(), который очень давно уже был @Deprecated. Но если он вам всё ещё нужен, в Selenide 7.0.1 ему изобрели замену в виде аннотации @Self.

См. PR 2523.


Заменили FileNotFoundException на FileNotDownloadedError

Раньше многие методы типа $.download() были объявлены как throws FileNotFoundException. И вам приходилось страдать, добавляя этот бессмысленный throws FileNotFoundException и в свои тесты. Теперь можно будет подчистить этот хлам и убрать ненужные catch (FileNotFoundException), если они у вас были.

Теперь методы типа $.download() будут кидать FileNotDownloadedError, который является AssertionError, и его не надо ни объявлять, ни ловить. Если тест не смог скачать файл - тест должен упасть. Никакой дополнительной обработки не требуется.

См. PR 2526.


Переименовали некоторые *Exception классы в *Error

Лично я не думаю, что это хоть сколько-нибудь важно.
Но религия некоторых пользователей запрещает им называть класс *Exception, если он не наследует класс java.lang.Exception.

Ну что ж, вы уважаем все религии. Теперь селенидовские классы, наследующие java.lang.Error, будут называться *Error.

В Украине. Блогерка. Молдова. Беларусь. Таллинн.

Нам несложно.

См. issue 2485 и PR 2530.


Удалили поддержку устаревшего WebDriverEventListener

Мы удалили все методы типа addListener() с параметром типа org.openqa.selenium.support.events.WebDriverEventListener.

Этот класс уже давно был помечен как @Deprecated в селениуме.

Используйте вместо него addListener() с параметром org.openqa.selenium.support.events.WebDriverListener.

См. PR 2516.


Удалили старые методы для Drag’n’drop

Очередная чистка. Просто замените

$("#what").dragAndDropTo(where);

на

$("#what").dragAndDrop(to(where));

См. PR 2519.


Удалили устаревшие методы $.getSelectedValue() и $.getSelectedText()

И ещё чистка.

  1. Замените $.getSelectedValue() на $.getSelectedOptionValue()
  2. Замените $.getSelectedText() на $.getSelectedOptionText()

См. PR 2521.


Удалили старые аннотации для TestNG @Report и @GlobalTextReport

Эти аннотации были не нужны, начиная с Selenide 6.7.0. Просто удалите их. Да и TestNG удалите, чего уж там. ;)

См. PR 2517.


Остальное

  1. Замените
    new BearerTokenCredentials("pwd")
    

    на

    new BearerTokenCredentials("domain", "pwd")
    
  2. Замените
    $.should(appears);
    

    на

    $.should(appear);   //  или просто $.shouldBe(visible)
    
  3. Замените
    Selenide.open(url, BASIC, "username", "password");
    

    на

    Selenide.open(url, BASIC, new BasicAuthCredentials("username", "password"));
    

См. PR 2518.


Навстречу прогрессу!


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

ru.selenide.org

25.10.23