Вышла Selenide 7.14.0

Вышла Selenide 7.14.0

Невероятная концепция исправления загрузки файлов с грида
21.01.26

Привет!

У нас вышел релиз Selenide 7.14.0!

У нас есть практически концепция релиза.

Я думаю, что это будет очень выгодный релиз для Селенида, а также для вас самих.


Исправили скачивание файлов с пробелом в имени

Ну это классика.

Селенидовский метод $.download(), который скачивает файл в браузере, внезапно неправильно обрабатывал пробелы в имени файла.

Ну как же так, Анатолич…

В общем, теперь такие файлы прекрасно скачиваются - как локально, так и с Грида:

File report = $("#report").download(withExtension("pdf"));

assertThat(report.getName())
  .isEqualTo("Отчёт 0 & _ ' `backticks`.pdf");

См. PR 3231.


Исправили скачивание файлов с грида, который отстаёт на 1 секунду

Вот это огонь история! Селенидовский метод $.download(FOLDER) работал так:

  1. Клик по кнопке
  2. Жди, пока в папке появится файл новее, чем момент клика.

А теперь представьте, что браузер запускается на Гриде, у которого системное время отстаёт от настоящего на одну секунду.

Вся беда в том, что на втором шаге мы сравниваем время на тестовой тачке со временем на гриде - а время-то может быть разным. :(

  • Изначально-то этот алгоритм был сделан только для локального запуска. И алгоритм работал.
  • Потом добавили плагин для Грида. Но алгоритм по-прежнему работал, потому что Грид не умел выдавать время изменения файла.
  • А в Selenium 4.39.0 Грид научился возвращать время изменения файла, и вот тогда наш алгоритм сломался. :)

Большое спасибо Mikita Yafimuk за дебаг изначальной проблемы. Без тебя я бы в жизни не допёр, что всё дело в этой секунде!

См. issue 3227 и PR 3240.


increment timeout для грида

Тоже скачивание файлов с грида.

В селениде есть параметр “incrementTimeout”, который полезен при скачивании очень больших файлов. Тогда разумно задать

  • большой таймаут (скажем, если файл реально может скачиваться пару минут), но
  • небольшой “incrementTimeout” (чтобы не ждать слишком долго, а упасть побыстрее, если нет вообще никакого прогресса).
File bigReport = $("#slowReport").download(using(FOLDER)
  .withIncrementTimeout(ofSeconds(5L))
  .withTimeout(ofMinutes(5L))
);

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

Ну, а селенид теперь научился его учитывать для определения прогресса.

См. issue 3233.
Спасибо Aliaksandr Rasolka за PR 3234.


Запретили удалять внутренние прокси-фильтры Селенида

В Селениде есть встроенный прокси-сервер. Позволяет слушать траффик, логировать и мокать ответы сервера и т.п. Этому прокси вы можете добавлять и удалять свои фильтры:

SelenideProxyServer proxy = getSelenideProxy();
proxy.addRequestFilter("proxy-usages.request", () -> ...);
proxy.removeRequestFilter("proxy-usages.request");

Но у Селенида есть и несколько своих собственных фильтров. И метод removeRequestFilter позволял их удалить, что могло привести к непредсказуемым последствиям.

Больше не позволяет:

  proxy.removeResponseFilter("selenide.proxy.filter.download"));

  // throws "The built-in selenide proxy response filter cannot be removed: selenide.proxy.filter.download"

Надеюсь, вы такими грязными делишками и не занимались. ;)

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


Можно удалить все реквест-фильтры (или все респонс-фильтры)

Но зато вы можете одним методом удалить все реквест-фильтры (или все респонс-фильтры). Удобно, чтобы в конце теста подчистить всё, не запоминая, какие тесты какие фильтры добавляют.

@AfterEach void resetProxy() {
  SelenideProxyServer proxy = WebDriverRunner.getSelenideProxy();

  proxy.cleanupRequestFilters(); // All request filters (except Selenide owns)
  proxy.cleanupResponseFilters(); // All response filters (except Selenide owns)

  proxy.cleanupFilters(); // all request and response filters (except Selenide owns)
}

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


Добавили метод для маскировки значений

Есть в Селениде метод type(text("...")). По сути тот же sendKeys(), но с дополнительным опциями:

  • очистка поле перед вводом,
  • эмуляция медленного ввода
  • и т.д.

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

$("#password").type(text("Secure info"));
$("#password").type(text("Secure info").sensitive());
+----------------+----------------------+-------+-------+
| ...
| #password      | type("Secure info")  | PASS  | 2548  |
| #password      | type("***********")  | PASS  | 2533  |
| ...
+----------------+----------------------+-------+-------+

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


Видео рекордер можно использовать без Селенида

Как вы знаете, в Селениде есть козырная фича - видео рекордер. И теперь его можно подключить к любому другому проекту на Selenium, который не использует Селенид.

Может быть очень полезно, чтобы поизучать флейки тесты, запилить демо и т.д.

Или убедить коллег, что им срочно нужно перейти на Селенид. :)

Инструкция в PR 3230.


Сократили формат таймаутов в ошибках и логах

Чтобы текст ошибки было проще читать (особенно когда таймаут фигурирует в середине предложения), мы убрали пробел и точку. Теперь все таймауты в селениде выводятся в едином формате:

Было Стало
Timeout: 2 ms. Timeout: 2ms
incrementTimeout: 1000 incrementTimeout: 1s
Failed to download file in 120000 ms Failed to download file in 120s


См. PR 3235.


Обновили Selenium с 4.39.0 на 4.40.0

И подняли версию CDP с v143 до v144.

См. PR 3237

И снова в этом релизе Selenium было много моих изменений, так что кайф.

Самое смешное - это, конечно, эпичный факап с логированием в тестах самого селениума. Эт прям жыыыр :)



Это лучше, чем просто обычный релиз — этот релиз будет действовать вечно.


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

ru.selenide.org

21.01.26