Доброй ночи!
У меня к вам предложение, от которого лучше не отказываться.
Обновляйтесь на Selenide 6.16.0!
date(...)
и datetime(...)
$.doubleClick()
в AppiumВот это крутизна!
Как вы знаете, одна из базовых возможностей в Селениде - это проверки коллекций. Одной строчкой можно проверить сразу кучу элементов:
$$("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:
open("/basic-auth/hello", "", "admin", "Казкова діброва");
До сих пор было две реализации BasicAuth.
Authorization
(Basic YWRtaW460JrQsNC30LrQvtCy0LAg0LTRltCx0YDQvtCy0LA=
).https://admin:Казкова+діброва@localhost:42220/basic-auth/hello
).Теперь к ним добавился третий вариант: Если вебдрайвер реализует интерфейс org.openqa.selenium.HasAuthentication
, Селенид добавляет логин+пароль через него. Фактически это означает браузеры семейства Chromium (Chrome, Chromium, Edge).
См. issue 2336 и PR 2358.
До сих пор можно было прописать только один домен для 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.
Ну что, нормальный результат, я считаю.
ВСЕХ ВЗБОДРИЛИ!!!
Счастливо!
02.07.23