Вышла Selenide 5.17.0

Вышла Selenide 5.17.0

Ho-ho-ho, Page Objects!
26.12.20

Доброй ночи!

Я трепетно отношусь к Католическому Рождеству.
Потому, что именно в Рождество террористы захватили небоскрёб Накатоми, и Брюс замочил Ханса Грубера. А потом взорвал самолёт зажигалкой.

Поэтому ловите рождественский релиз Selenide 5.17.0.


Добавили метод $.as(“name”)

Чувствую, что открываю ящик пандоры, но что уж поделаешь…

В общем, мы добавили метод as, позволяющий давать элементам читаемые имена.

Чтобы продемонстрировать эффект, давайте сравним эти две строки в тесте:

  $(By.xpath("/long/ugly/xpath[1][2][3]")).shouldNot(exist);
  $(By.xpath("/long/ugly/xpath[1][2][3]")).as("Login button").shouldNot(exist);

Результат в отчёте будет таким:

  +---------------------------------------+--------------------+----------+----------+
  |Element                                |Subject             |Status    |ms.       |
  +---------------------------------------+--------------------+----------+----------+
  |By.xpath: /long/ugly/xpath[1][2][3]    |should not(exist)   |PASS      |13        |
  |Login button                           |should not(exist)   |PASS      |38        |
  +---------------------------------------+--------------------+----------+----------+

В последней строке вместо длинного нечитабельного xpath мы видим понятное имя “Login button”.

NB! Не торопитесь использовать эту возможность. Лично я воспринимаю её как “хак последней надежды”.
В отчёте всегда лучше видеть настоящий локатор, чем кем-то придуманное имя, которое всегда может оказаться:

  • Обманчивым
  • Устаревшим
  • Вводящим в заблуждение

Лучше инвестируйте свои усилия в то, чтобы использовать читаемые локаторы. Ну и грамотно называть переменные и методы. Вот где сила, брат!

См. issue 1200 и PR 1353.


Добавили настроек нашему headless chrome

Мы взяли и добавили нашему безголовому хрому те же настройки, что и в puppeteer.
Ребята из puppeteer же не дураки, знают, что делают. Мы как они.

Спасибо Aliaksandr Rasolka за PR 1329.

P.S. Интересно, если ребята из puppeteer решать с крыши спрыгнуть, мы тоже спрыгнем?


Починили ByShadowCss.findElements

Оказалось, в одном хитром случае он возвращал не все элементы: когда в DOM было несколько inner shadow hosts (как это по-православному, бог ты мой?)

Теперь возвращает все.

См. issue 1346. Спасибо Daniel H. Peger за PR 1347.


Добавили метод $.should* с кастомным таймаутом

Как вы все знаете, в Селениде есть две основных группы методов:

  1. $.shouldHave / $.shouldBe / $.should – используют таймаут по умолчанию
  2. $.waitUntil / $.waitWhile – используют заданный таймаут

Методы $.wait* полезны для ожидания явно долгих действий, которые точно длятся дольше обычного таймаута (который 4 секунды по умолчанию).

Проблема с $.wait* методами чисто грамматическая: встроенные селенидовские проверки не звучат по-английски корректно с глаголом “wait”:

  1. element should have text - звучит
  2. element wait until text - не звучит

Не смертельно, но ухо режет (как говорил Ван Гог, гы-гы).

Поэтому теперь вы можете заменить $.waitUntil(hasText("bob"), 18_000) на $.shouldHave(text("bob"), Duration.ofSeconds(18)).

См. issue 1136, issue 1338 и PR 1340.


Пэдж обжекты

Следующий блок улучшений касается пэдж обжектов. Как вы знаете, в селениде есть возможность объявлять свои пэдж обжекты,

  • а в них объявлять поля с аннотациями @FindBy,
  • а поля эти могут быть как стандартные селениумовские WebElement,
  • так и наши SelenideElement,
  • и даже переиспользуемые компоненты ElementsContainer, из которых можно собирать пэдж обжекты, как из кирпичиков.

И работает всё это в лучших традициях селенида: ленивая загрузка и перезагрузка элементов, вот это всё.


В общем, в этих @FindBy уже давно были шероховатости:

  1. не работала ленивая загрузка для полей ПО с типом List<ElementsContainer> (см. issue 282 и 482)
  2. не поддерживались поля ПО с дженериками (см. issue 694)

И это было сложно исправить. Пришлось погрузиться в этот (старый) код и серьёзно его порефакторить. Пришлось напрячь мозги и применить все свои остатки былого абстрактного мышления.

Так что эти два пулреквеста - предмет моей гордости:


И напоследок пачка технологических улучшений:

  • разбили проект на подпроекты - см. PR 1348
  • исправили тесты селенида, зависящие от ОС - См. issue 1344 и PR 1345, спасибо Daniel H. Peger
  • подчистили код Plugins – спасибо Yuri Orlov за PR 1343
  • Обновились до browserup-proxy:2.1.2 и guava:30.1-jre
  • Добавили поддержку chrome 88, edge 89, opera 73


Известные проблемы:

  • файл selenide-5.17.0-javadoc.jar получился неполным: он содержит javadoc не для всех классов. Надеемся, никто не обидится. Исправим в версии 5.17.1.


Итоги

В общем, заканчиваем год на позитивной ноте:
провели серьёзный рефакторинг и исправили несколько старых болячек.
В новый год мы переходим всего с одним экраном в github issues вместо прежних двух.

И количество скачиваний селенида выросло за год с 102 до 167 тысяч.


С наступающим!

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

ru.selenide.org

26.12.20