Tere õhtust!
20 августа у нас в Эстонии День Восстановления Независимости, и по сему случаю выпускаем праздничный Selenide 7.18.0!
- Selenide CLI - командная строка для ИИ-агентов
- Переименовали npm-модуль
selenide-mcpв@selenide/mcp - Переключение между фреймами в MCP и CLI
- Сохраняем страницу как MHTML в Chromium-браузерах
ORдля объектных условий- Настройка размера и позиции окна браузера через аргументы
- Пофиксили скриншот всей страницы, когда вебдрайвер переключён во фрейм
- Бесхозный браузер после
inNewBrowser StackOverflowErrorвusing(...)- Пофиксили long press и double tap в Appium
- Обновили Selenium с 4.46.0 на 4.47.0
Selenide CLI - командная строка для ИИ-агентов
Не успели мы запустить Selenide MCP, как оказалось, что MCP уже прошлый век. :( И теперь агенты, видите ли, хотят CLI.
Да они зажрались там совсем, эти ваши агенты!
Теперь есть Selenide CLI - консольная тулза, которая по сути запускает команды Selenide. А в конце может вывалить готовый кусок Selenide-кода на Java.
Говорят, для ИИ-агента запускать команды гораздо дешевле, чем MCP сервер.
Инсталляция очень простая:
npm install -g @selenide/cli # нужен JDK 17+
selenide install --skills # для Claude: положит скилл в .claude/skills/
selenide install --skills=agents # для остальных агентов: в .agents/skills/
После этого ИИ-агент сам знает, как вертеть браузера. А можно и без ИИ - просто потыкать команды руками:
selenide open --headless --browser=chrome https://the-internet.herokuapp.com/login
selenide setValue "#username" tomsmith
selenide setValue "#password" "SuperSecretPassword!"
selenide click "button[type=submit]"
selenide should "text=You logged into a secure area!" visible
selenide code # печатает сгенерированный Selenide-код
selenide close
На выходе - чистенький рабочий Java-сниппет с импортами, который можно сразу тащить в тест.
Заодно поддерживаются именованные параллельные сессии (selenide -s <name> open <url>, свои печеньки и
хранилища у каждой), список открытых сессий (selenide list) и сохранение сгенерированного кода прямо в файл
(selenide save build/Flow.java).
Спасибо sbielievitniev-xm за реализацию!
См. PR 3380, PR 3409 и PR 3419.
Переименовали npm-модуль selenide-mcp в @selenide/mcp
Поскольку у нас теперь как минимум два NPM-модуля, мы зарезервировали себе неймспейс @selenide/* в npm, и все
селенидовские модули будут теперь тусить там.
MCP-сервер теперь публикуется как @selenide/mcp. Старый
пакет selenide-mcp помечен как deprecated - он просто переадресовывает на новый.
Если у вас уже настроен старый - можете не торопиться, но при случае лучше переехать на новое имя.
См. PR 3383.
Переключение между фреймами в MCP и CLI
В обычном Selenide переключаться внутрь <iframe> можно уже давно (switchTo().frame(...)), но ваш
ИИ-агент через MCP или CLI такой возможности не имел - застревал снаружи фрейма и не мог дотянуться до
элементов внутри.
Теперь это исправили - добавили симметричные команды в оба интерфейса:
# CLI
selenide frame "#payment-iframe"
selenide defaultcontent
# MCP-тулзы
browser_frame_select
browser_frame_resetОбе команды - обёртки над тем же самым SelenideDriver.switchTo().frame(...) / .defaultContent(), так что
ведут себя ровно так же, как в обычном Java-коде.
См. issue 3371 и PR 3417.
Сохраняем страницу как MHTML в Chromium-браузерах
Когда тест падает, Selenide по умолчанию сохраняет два файла: скриншот и исходник страницы типа 123455.html. Но это голый HTML без картинок и
стилей, смотреть на него уныло: разметка есть, а страница выглядит как после ядерной зимы.
Теперь в Chromium-браузерах (Chrome, Edge) можно сохранять страницу целиком, вместе со стилями и картинками,
в формате .mhtml - как обычный “Сохранить как…” в браузере, только автоматически при падении теста:
Включить легко:
Configuration.savePageSourceWithResources = true;
// или -Dselenide.savePageSourceWithResources=true
Сравним размеры файлов для https://selenide.org:
# Было:
-rw-r--r-- 1 andrei staff 12042 Aug 11 22:47 1786477661496.0.html
-rw-r--r-- 1 andrei staff 244198 Aug 11 22:47 1786477661496.0.png
# Стало:
-rw-r--r-- 1 andrei staff 190104 Aug 11 22:48 1786477680222.0.mhtml
-rw-r--r-- 1 andrei staff 244198 Aug 11 22:48 1786477680222.0.png
Файл “.mhtml” побольше, чем “.html”, но зато открыл - и увидел страницу такой, какой её видел браузер, а не голый скелет разметки.
Под капотом дёргается CDP-команда Page.captureSnapshot. Если браузер не Chromium, CDP недоступен или что-то
пошло не так - Selenide тихонько откатывается на старый добрый .html, ничего не сломав.
Спасибо Stanislav Vasenkov!
См. issue 2757, PR 3363, PR 3399 и PR 3406.
OR для объектных условий
Иногда в тесте допустимо не одно конкретное значение, а любое из нескольких - например, URL может быть
таким или таким, в зависимости от браузера. Теперь написать это легче через or:
webdriver().shouldHave(url("a").or(url("b")));
clipboard().shouldHave(content("a").or(content("b")));
См. PR 3388.
Настройка размера и позиции окна браузера через аргументы
Раньше, чтобы задать размер окна браузера, Selenide сначала открывал браузер в дефолтном размере, а потом ресайзил его через WebDriver-методы. Работало, но лишний шаг - лишнее время.
Теперь размер и позиция задаются прямо аргументами запуска браузера - он сразу открывается нужного размера и в нужном месте экрана, без дополнительного ресайза:
# Firefox: размер окна
-width 1980 -height 1080
# Chromium (Chrome, Edge): позиция окна
-window-position=100,200Работает из тех же настроек Configuration.browserSize и Configuration.browserPosition, как и раньше -
просто теперь чуть быстрее.
См. PR 3387.
Пофиксили скриншот всей страницы, когда вебдрайвер переключён во фрейм
Вот уже 4 года в Селениде есть плагин full-screenshot, который
снимает скриншот всей страницы, а не только видимой части.
И только сейчас выяснилось, что в нём была бага с фреймами. Если тест переключился внутрь <iframe> и там упал -
плагин делает скриншот не той области экрана. Размером с фрейм, но в левом верхнем углу страницы.

Починили - теперь размеры страницы берутся через CDP-команду Page.getLayoutMetrics, которая всегда
возвращает размеры страницы верхнего уровня, независимо от того, в какой фрейм вы сейчас переключены.
См. issue 3414 и PR 3420.
Бесхозный браузер после inNewBrowser с кастомным конфигом
Если вызвать inNewBrowser(...) с кастомным конфигом, Selenide временно открывает отдельный браузер под эту
конфигурацию, а потом должен его прибить. Но в одном случае браузер оставался висеть открытым.
Течь заткнули: теперь после inNewBrowser(...) с кастомным конфигом браузер гарантированно закрывается -
и не остаётся зомби-инстансов Chrome, копящихся в фоне на CI.
См. PR 3389.
StackOverflowError в using(...)
Если вызвать два этих метода подряд:
WebDriverRunner.setWebDriver(driver1);
WebDriverRunner.using(driver2, ...);
можно поймать StackOverflowError. Было. Теперь починили.
Спасибо Francisco Gonzalez за находку и фикс!
См. PR 3407.
Пофиксили long press и double tap в Appium
В мобильных тестах методы longPress/doubleTap со смещением (offset) считали координаты не от центра
элемента, а от его левого верхнего угла. Из-за этого тап с offset мог промазать мимо нужного элемента -
особенно на маленьких элементах, где разница между центром и углом критична.
Теперь long press и double tap с offset честно считаются от центра элемента - так же, как обычный tap.
Спасибо qwez за фикс!
См. issue 3413, PR 3415 и PR 3416.
Обновили Selenium с 4.46.0 на 4.47.0
И подняли версию CDP с v150 до v151.
Заметные изменения в самом Selenium:
- добавили BiDi-транспорт для генерируемых BiDi-модулей и починили баг, из-за которого BiDi не
инициализировался у
RemoteWebDriver, собранного через builder; - починили экранирование в
By.className(),By.id()иBy.name(); - починили GeckoDriver, который зря отбраковывал системный доступ, переданный через capabilities;
- выкинули поддержку легаси FTP-прокси.
См. PR 3404 и ченджлог селениума.
Пока сентябрь не бахнул, обновляйтесь!
ru.selenide.org
20.08.26
