Expect — CLI, который читает твой git diff и сам тестирует изменения в реальном браузере
Expect — CLI, который читает твой git diff и сам тестирует изменения в реальном браузере
Ты написал фичу. Claude Code сгенерировал 200 строк. Всё компилируется. Линтер молчит. Тесты зелёные. Открываешь браузер — кнопка не кликается, форма уехала за экран, логин-страница отдаёт 403.
Знакомо? Юнит-тесты ловят логику, но не ловят то, что видит пользователь. А писать Playwright-скрипты руками на каждый PR — занятие для тех, у кого бесконечное терпение и бесконечный спринт.
Expect решает это иначе: сканирует git diff, генерирует тест-план на человеческом языке, запускает его в реальном Chromium и отчитывается — сломалось или нет. Без единого CSS-селектора.
TL;DR: Expect — open-source CLI от создателей Million.js (YC W24, $14.1M). Читает git diff, генерирует тест-план через AI, гоняет его в настоящем браузере с твоими cookies. 3K звёзд за месяц. Работает с Claude Code, Codex, Copilot, Gemini CLI и Cursor. Один тест стоит $0.05-0.20 и занимает 30-90 секунд.
Зачем это нужно, если есть Playwright
Playwright — отличный фреймворк. Проблема не в нём, а в том, что происходит вокруг.
Ты пишешь page.click с data-testid селектором. Через шесть недель фронтендер переименовывает атрибут. Тест падает. Никто не чинит. Тест отключают. Покрытие деградирует тихо.
По данным Google Testing Blog, selector-based E2E тесты — одни из самых дорогих в обслуживании артефактов в проекте. Команды либо тратят спринты на их поддержку, либо гасят flaky-тесты и теряют покрытие.
Expect работает по другому принципу. Он не привязывается к DOM-структуре. Вместо селекторов агент читает accessibility tree и визуальное состояние страницы — как это делает живой тестировщик. Если кнопка Отправить переехала из div.form-actions в footer, агенту всё равно — он видит кнопку с текстом Отправить и кликает.
Как это работает
Архитектура простая — пять шагов:
git diff -> AI тест-план -> Playwright браузер -> pass/fail -> отчёт с записью
- Expect сканирует твои незакоммиченные изменения (или diff ветки)
- Отправляет diff AI-агенту (Claude Code, Codex, Copilot — на выбор)
- Агент генерирует тест-план
- Ты ревьюишь план в интерактивном TUI (или пропускаешь с флагом -y)
- Playwright исполняет план в реальном Chromium, снимает видео, возвращает pass/fail
Ключевой момент — Expect использует Playwright под капотом для DOM-автоматизации, но сверху добавляет AI-слой, который убирает необходимость в ручных скриптах.
Установка за 2 минуты
Запусти в терминале:
npx expect-cli@latest init
Команда проведёт через setup: выбор агента, настройка cookies, базовый URL. После установки — одна команда:
npx expect-cli -m "Залогинься, открой настройки профиля, поменяй имя на Test User и проверь, что изменение сохранилось"
Или внутри Claude Code — просто /expect как skill.
Поддерживаемые агенты:
- Claude Code — -a claude
- Codex CLI — -a codex
- GitHub Copilot — -a copilot
- Gemini CLI — -a gemini
- Cursor — -a cursor
- OpenCode — -a opencode
- Factory Droid — -a droid
Если установлено несколько — Expect автоматически выберет первый из PATH.
Cookie injection — тестирование с реальной авторизацией
Самый хитрый трюк Expect — он достаёт cookies из твоего локального браузера.
Для Chrome запускает headless-инстанс с твоим профилем и вытаскивает все cookies через CDP (Network.getAllCookies). Для Firefox читает cookies.sqlite. Для Safari парсит бинарный cookie-файл.
Эти cookies инжектятся в Playwright-сессию. Результат: когда агент открывает localhost:3000, он уже залогинен как ты. Никаких тестовых аккаунтов, никаких фикстур, никакого ручного логина.
Перед инъекцией CLI спрашивает подтверждение — cookie sync opt-in.
SDK для продвинутых
Кроме CLI есть SDK на TypeScript. Можно создать ExpectSkill с настройками браузера и LLM-провайдера, затем вызвать skill.run с URL и assertion на человеческом языке. SDK возвращает result.passed (boolean) и result.steps (пошаговый лог).
Это значит, что Expect можно встроить в любой оркестратор — деплой-пайплайн, мониторинг, CI/CD.
GitHub Actions из коробки
npx expect-cli add github-action
Тест-кейсы описываются в YAML на человеческом языке — name и assertion для каждого теста. В CI-режиме (--ci): headless, без cookies, auto-approve плана, таймаут 30 минут, exit code 0/1.
Числа
- 3 068 звёзд на GitHub (на 9 апреля 2026)
- Создан 12 марта 2026 — меньше месяца назад
- 8 контрибьюторов, 7 релизов, активные ежедневные коммиты
- Стоимость одного теста: $0.05-0.20 (5-15 вызовов LLM за тест)
- Время одного теста: 30-90 секунд (против 3-10 секунд у чистого Playwright)
- Консистентность: >99% на простых флоу, ~95% на сложных — по заявлению авторов
- Команда: Million Software (YC W24, $14.1M), основатель Aiden Bai (создал Million.js в 16 лет, потом React Scan)
- Инвесторы: Scott Wu (CEO Cognition/Devin), Amjad Masad (CEO Replit), Evan You (Vue.js), David Cramer (CEO Sentry)
Подводные камни
Телеметрия без предупреждения. Аудит безопасности обнаружил две системы телеметрии, включённые по умолчанию и не упомянутые в README. PostHog отправляет machine ID, session times, pass/fail. Axiom шлёт OpenTelemetry traces с таймингами операций. Контент кода не передаётся, но hardcoded-токены в исходниках — плохая практика. Отключение: NO_TELEMTRY=1 (да, с опечаткой в имени переменной).
Cookies = доступ ко всему. Cookie extraction читает и расшифровывает cookies из всех твоих браузеров — не только от localhost, а от всех сайтов: банки, почта, соцсети. Cookies остаются локально и не уходят на серверы, но AI-агент управляет браузером, в который они инжектятся.
Лицензия — не MIT. FSL-1.1-MIT запрещает использование в конкурирующих коммерческих продуктах в течение 2 лет, потом конвертируется в MIT. Source-available, но не OSI-approved open source.
Зависания на localhost. Issue 80: версии 0.0.24 и 0.0.25 зависают с ошибкой Agent produced no output for 180s при тестировании локальных приложений.
Cookie injection не всегда работает. Issue 89: cookies не инжектятся в Playwright-браузер. Проблема открыта на момент написания.
Компания пивотилась 5 раз. Million.js, React Scan, Same.new, Ami, Expect. Каждый продукт набирал звёзды и переставал быть основным.
Альтернативы
-
Vercel Agent Browser — browser automation CLI на Rust, 28K звёзд. Общего назначения: навигация, клики, скриншоты. Не читает git diff и не генерирует тест-планы автоматически, но быстрее и легче.
-
Playwright MCP — официальный MCP-сервер от Microsoft, 30K звёзд. Даёт Claude Code и другим агентам доступ к Playwright через MCP-протокол. Мощный, но нужно описывать действия вручную.
-
TestDriver.ai — автономный AI-агент для e2e-тестирования веба и десктопа. Видит экран как пользователь, управляет мышкой и клавиатурой. Покрывает десктопные приложения, которые Expect не может.
Вердикт
Если ты пишешь фронтенд и уже используешь Claude Code или Codex, поставь Expect и попробуй на двух самых flaky-тестах. Установка занимает 2 минуты, первый тест ещё 2. Для smoke-тестов на staging перед деплоем это уже рабочий инструмент.
Но для основного CI пока рано. Зависания на localhost, проблемы с cookie injection и возраст проекта в один месяц — это не та стабильность, на которую ставишь блокирующий гейт. Подожди пару релизов.
А если тебе нужен browser tool для агента без привязки к тестированию, Vercel Agent Browser зрелее и быстрее.
Как попробовать
- Установи CLI: npx expect-cli@latest init
- Запусти первый тест: npx expect-cli -m "Открой главную страницу и проверь, что заголовок и навигация отображаются корректно"
- Попробуй из Claude Code: /expect
- Для CI: npx expect-cli add github-action
- Отключи телеметрию: NO_TELEMTRY=1 npx expect-cli -m "your test"
Репозиторий: github.com/millionco/expect Сайт: expect.dev