Привет!
Кому пятничный релиз Selenide 7.16.0?
Целая цивилизация олдскульных ручных тестописцев погибнет сегодня вечером и больше никогда не возродится. Я не хочу, чтобы это произошло, и мне жаль этих медленных парней, но, вероятно, так и будет.
$.ancestor() с несколькими классамиДожили!
Я откладывал этот день как мог. Я не верил в AI. Я сопротивлялся. В моей голове всё ещё свежи воспоминания о 29 августа 1997 года.
Но я сдался. Хрен с ним. Пусть.
По сути, MCP даёт ИИ доступ к селенидовским методам.
Зачем? Да хрен его знает. Ну, типа он позволит ИИ запускать селенидовские методы и писать за вас тесты (как будто с селенидом это как-то сложно было!)
Или исправлять локаторы. Или искать элементы без хороших локаторов. Или пробовать новый дизайн для веб-страничек. Чёрт его знает, для чего кожаные мешки используют MCP.
Теперь вы можете в любой папке, в любом проекте создать вот такой файлик .mcp.json:
{
"mcpServers": {
"selenide": {
"command": "npx",
"args": [
"seleni...@7.16.0"
]
}
}
И запустив какой-нибудь ИИ (я вот пробовал Claude), сказать ему:
> claude
> /mcp enable selenide
> Раб, нахреначь мне тестов для https://todomvc.com/examples/react/dist/
И он нахреначит.
Спасибо моему коллеге Aleksei Krassilnikov за то, что посидел со мной рядом и показал, как всё это ИИ-шаманство делается.
Мы вдвоём с помощью нашего ИИ навайбкодили Selenide MCP для вашего ИИ. Чо делается…
См. issue 3091 и PR 3291.
Ну всё, потёк вайбкод по трубам. Эту штуку я бы без ИИ вряд ли когда-нибудь сделал.
В общем. В селениде есть встроенный прокси, который умеет слушать (и даже модицифировать) трафик между браузером и бекендом. Полезно для скачивания файлов, авторизации, логирования, моков и много чего ещё.
Но этот прокси до сих пор не поддерживал вебсокеты. Если в вашем веб-приложении какие-то сообщения шлются через веб-сокеты, то при включённом прокси они не доходят.
А теперь доходят! И их даже можно слушать (и например, логировать или проверять). Вот так:
Configuration.proxyEnabled = true;
open("https://test.mybank.com");
getSelenideProxy().getProxy().addWebSocketListener((frame, message) -> {
log.info("WebSocket opCode: {}, text: '{}', url: {}", frame.getOpcode(), frame.getTextContent(), message.getUrl());
});
Для этого нам с моим ИИ-рабом пришлось кое-что подправить и в LittleProxy, и в BrowserUpProxy.
Спасибо Valery Yatsynovich за поддержку проекта BrowserUpProxy и быстрые релизы.
Уже полгода в селениде есть поиск элемента по label:
$(byLabel("Song title")).val("Лебединое озеро");
Там была крошечная бага, если элемент с нужным текстом находился, но это был не <label>, а какой-нибудь вшивый <div>. Ну вот, типа исправили. Даже без ИИ справились.
См. issue 3280 и PR 3282.
Селенид умеет скачивать файлы разными способами, в том числе слушая CDP ивенты. Но если тест успел открыть в браузере несколько вкладок, то иногда селенид начинал слушать ивенты не в той вкладке - и поэтому не получал сигнал о завершении загрузки файла.
В общем, и это подправили.
См. issue 3283 и PR 3284.
Я толком не понял, что случилось, но похоже, в новой версии FireFox поменялось поведение касательно алертов. Тех убогих модальных окошек, которые олдскульные разрабы до сих пор иногда пихают на странички. В общем, мы поменяли настройку “behavior for unhandled alerts” для Firefox с “accept” на “ignore”.
Кажется, это особо ничего не изменит, но имейте в виду. Вдруг все ваши тесты посыпятся из-за алертов. :)
См. PR 3285.
В продолжение предыдущией темы. Мы по умолчанию выключили “form resubmission confirmation dialog” в Firefox. Это один из тех модальных диаложков. Как будто он раньше не выскакивал, а теперь почему-то начал выскакивать (например, при рефреше страницы) и ломать тесты, и пришлось его вырубить.
См. PR 3285.
$.ancestor() с несколькими классамиВ селениде давно уже есть метод $.ancestor(".container") (также известный как $.closest(".container")), который умеет находить ближайшего предка по имени класса, тэгу или атрибуту.
А теперь можно найти предка и по нескольким классам:
SelenideElement parent = `$.ancestor(".container.table.active")`;
См. PR 3286.
Следующая пачка фиксов будет про наш видео рекордер. Да уж, видосы - непростая тема.
Изначально видео рекордер работал только с селенидовским встроенным вебдрайвером (который мы и рекомендуем всем использовать). А если вы задали свой кастомный вебдрайвер через WebDriverRunner.setWebDriver(), то его видео рекордер не видел. И видос получался пустым.
При этом ещё и Селенид писал ложное сообщение “Video recorded”, а никакого видео-то и не было. :)
Теперь эти проблемы исправлены.
WebDriverRunner.setWebDriver() видео рекордер теперь тоже видит.См. issue 3278.
Спасибо Kamil Pająk за PR 3279.
Эту проблему я заметил только недавно, хотя по идее она должны была существовать уже полгода. Когда вы запускаете тест в Хроме с включёнными видео рекордером, то в этом видео иногда появляются 4-секундые разрывы.
Мы с моим ИИ-рабом хорошенько это дело подебажили и выяснили, что это происходит в те моменты, когда Хром обновляет страницу или переходит на другую страницу.
Дело было так:
Это похоже на багу хрома, и какого-то простого хорошего решения здесь не видно. Поэтому мы просто уменьшили таймаут для скриншотов до 300мс. Разрывы в видео останутся, но будут почти незаметны ¯¯_(ツ)_/¯¯
См. PR 3297.
И подняли версию CDP с v145 до v147.
СДЕЛАЕМ ДЖАВА ТЕСТЫ
СНОВА ВЕЛИКИМИ!
10.04.26