> · 7 мин

Expect — CLI, который читает твой git diff и сам тестирует изменения в реальном браузере

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 -> отчёт с записью

  1. Expect сканирует твои незакоммиченные изменения (или diff ветки)
  2. Отправляет diff AI-агенту (Claude Code, Codex, Copilot — на выбор)
  3. Агент генерирует тест-план
  4. Ты ревьюишь план в интерактивном TUI (или пропускаешь с флагом -y)
  5. 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 зрелее и быстрее.

Как попробовать

  1. Установи CLI: npx expect-cli@latest init
  2. Запусти первый тест: npx expect-cli -m "Открой главную страницу и проверь, что заголовок и навигация отображаются корректно"
  3. Попробуй из Claude Code: /expect
  4. Для CI: npx expect-cli add github-action
  5. Отключи телеметрию: NO_TELEMTRY=1 npx expect-cli -m "your test"

Репозиторий: github.com/millionco/expect Сайт: expect.dev

$ ls ./related/

Похожие статьи

subscribe.sh

$ cat /dev/blog/updates

> Свежие заметки о программировании,

> DevOps и AI — прямо в мессенджер

./subscribe