Вышла Selenide 6.16.0

Вышла Selenide 6.16.0

Фарш справедливости
02.07.23

Доброй ночи!

У меня к вам предложение, от которого лучше не отказываться.

Обновляйтесь на Selenide 6.16.0!

Ускорили проверки коллекций

Вот это крутизна!

Как вы знаете, одна из базовых возможностей в Селениде - это проверки коллекций. Одной строчкой можно проверить сразу кучу элементов:

$$("option").shouldHave(texts("Шмякино", "Шебекино", "Шелебякино", "Шлёпкино"))

Однако такая проверка занимает время, если коллекция достаточно большая.

Например, если на странице 1000 элементов <option>, на моём компе она занимает почти 3 секунды.
Медленность обусловлена тем, что Селенид спрашивает у браузера текст каждого элемента по отдельности. 1000 вызовов вебдрайвера, даже очень быстрых - это долго.

Пришло время ускорить эти проверки.

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

Теперь та проверка вместо 3 секунд занимает 200 мс.
В 15 раз быстрее.
Ну очуметь же!

P.S. Для Appium и других возможных вебдрайверов, которые не поддерживают JS, остаётся старый вариант (который запрашивает тексты по одному). Что поделать. Хотя бы не стало хуже.

См. PR 2362.


Улучшили сообщение об ошибках в коллекциях

В рамках предыдущей переделки проверок для коллекций мы чутка дополнили и сообщения об ошибках. Теперь Селенид точнее говорит, какой именно элемент коллекции не совпал.

Например, вот такая проверка:

$$(".direction").shouldHave(texts(
  "На Ростов", "На Москву", "В полевые лагеря согласно плану"));

Раньше выдавала просто "Texts mismatch":

Texts mismatch
Actual: [На Ростов, На Москву, В Беларусь]
Expected: [На Ростов, На Москву, В полевые лагеря согласно плану]

А теперь первая строка содержит более точное указание, что именно не совпало:

Text #2 mismatch (expected: "В полевые лагеря согласно плану", actual: "В Беларусь")

См. PR 2362.


Новые проверки для дат date(...) и datetime(...)

import static com.codeborne.selenide.conditions.datetime.DateConditionOptions.*;

LocalDate theDay = LocalDate.of(2023, 6, 23);
$("#funParty").shouldHave(date(theDay));
$("#funParty").shouldHave(date(theDay, "yyyy-MM-dd"));
$("#funParty").shouldHave(dateBetween(parse("2023-06-22"), parse("2023-06-24")));
$("#funParty").shouldHave(dateFormat("yyyy-MM-dd"));

См. issue 2268. Спасибо Maksim @Au6ojlut за PR 2281.


Новые методы для установки времени

В селениде уже был метод для установки даты (withDate):

LocalDate theDay = LocalDate.of(2023, 6, 23);
$("#euphoriaDay").setValue(withDate(theDay));
// для <input type="date">

Теперь же мы добавили похожие методы для установки даты с временем (withDateTime):

$("#epicFail").setValue(withDateTime(LocalDateTime.parse("2023-06-23 20:29")));
// для <input type="datetime-local">

либо только времени (withTime):

$("#rostov").setValue(withTime(LocalTime.parse("07:00")));
$("#voronezh").setValue(withTime(LocalTime.parse("14:00")));
$("#lipetsk").setValue(withTime(LocalTime.parse("16:00")));
$("#moskva-reka").setValue(withTime(LocalTime.parse("20:20")));
// для <input type="time">

См. PR 2357.


Полный стектрейс в софт ассертах

В Селениде уже давно есть софт ассерты. Когда вы включаете этот режим, при падении нескольких проверок Селенид кидает ошибку не сразу, а лишь в конце теста. И в этой ошибке перечисляются все Assertion error.

Вопрос в том, что для этих ошибок Селенид показывал неполный стектрейс, и там не была видна часть “Caused by:”. Теперь будет видна. Будьте готовы к тому, что длина стектрейсов резко вырастет :).

См. issue 2350 и PR 2354.


Улучшили BasicAuth в браузерах семейства Chromium

В Селениде есть методы для авторизации на странице через BasicAuth:

open("/basic-auth/hello", "", "admin", "Казкова діброва");

До сих пор было две реализации BasicAuth.

  1. При включённом прокси: Селенид добавляет к запросу заголовок Authorization (Basic YWRtaW460JrQsNC30LrQvtCy0LAg0LTRltCx0YDQvtCy0LA=).
  2. При выключенном прокси: Селенид добавляет логин и пароль в URL (https://admin:Казкова+діброва@localhost:42220/basic-auth/hello).

Теперь к ним добавился третий вариант: Если вебдрайвер реализует интерфейс org.openqa.selenium.HasAuthentication, Селенид добавляет логин+пароль через него. Фактически это означает браузеры семейства Chromium (Chrome, Chromium, Edge).

См. issue 2336 и PR 2358.


Несколько доменов в BasicAuth

До сих пор можно было прописать только один домен для BasicAuth:

open("/basic-auth/hello", "mister-cider.ru", "luka", "картофельный спас");

Это не помогает, если в тестируемом приложении задействовано несколько доменов - например, оно открывает фреймы с адресом auth.mister-cider.ru или там api.mister-cider.ru. Всегда можно прописать пустую строку вместо домена, но у этого варианта есть очевидные минусы.

Теперь можно прописать несколько доменов через запятую или “|”:

open("/basic-auth/hello", "mister-cider.ru|auth.mister-cider.ru|api.mister-cider.ru", 
          "luka", "картофельный спас");

См. PR 2358.

P.S. Естественно, имя домена не используется, когда Селенид добавляет логин+пароль просто в URL.


Исправили $.doubleClick() в Appium

В предыдущем релизе мы сломали, а теперь починили двойной клик в мобильниках:

$(AppiumBy.xpath(".//android.widget.CheckBox")).doubleClick();

См. issue 2346 и PR 2347.


Снимаем скриншот чуть раньше

Обычно Селенид автоматически делает скриншот в случае падения теста. НО Если вы закрывали браузер в методе @AfterEach, то Селенид уже не мог сделать скриншот:

@AfterEach
void tearDown() {
  Selenide.closeWebDriver();
}

Теперь Селенид будет делать скриншот чуть раньше - ДО методов @AfterEach.

См. issue 2352 и PR 2356.


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

  • 2319 use latest version of geckodriver for FF 102+
  • 2328 bump Selenium from 4.9.1 to 4.10.0
  • 2324 Bump io.appium:java-client from 8.5.0 to 8.5.1
  • 2349 Bump Netty from 4.1.93.Final to 4.1.94.Final
  • bump WebDriverManager from 5.3.3 to 5.4.0


Новости


Ну что, нормальный результат, я считаю.
ВСЕХ ВЗБОДРИЛИ!!!
Счастливо!

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

ru.selenide.org

02.07.23