Вышла Selenide 7.18.0

Вышла Selenide 7.18.0

Я твой браузер в терминале вертел!
20.08.26

Tere õhtust!

20 августа у нас в Эстонии День Восстановления Независимости, и по сему случаю выпускаем праздничный Selenide 7.18.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