Паттерны тестирования для ИИ-управляемой автоматизации браузера
Updated Jul 2026
Паттерн 1: Navigate-Act-Verify (NAV)
Фундаментальный паттерн тестирования. Каждый браузерный тест следует этой структуре:
Navigate → Act → Verify
Пример: Тест авторизации
# NAVIGATE
vibe-check navigate https://app.example.com/login
# ACT
vibe-check type "input[name=email]" "user@test.com"
vibe-check type "input[name=password]" "secret123"
vibe-check click "button[type=submit]"
# VERIFY
vibe-check wait "h1.dashboard-title"
vibe-check text "h1.dashboard-title"
# → Агент проверяет: написано ли "Dashboard"? ПРОШЁЛ
Роль агента
Агент решает:
- На какой URL перейти
- Какой селектор использовать (из подсказок или обнаружения)
- Какой текст ввести
- Как проверить успех (текстовое содержимое, изменение URL, наличие элемента)
Паттерн 2: Тестирование валидации форм
Проверить, что формы корректно отклоняют невалидный ввод.
Пример: Форма регистрации
# Тест: отправка пустой формы
vibe-check navigate https://app.example.com/register
vibe-check click "button[type=submit]" # Отправить пустую форму
vibe-check text ".error" # Прочитать все сообщения об ошибках
# → Агент проверяет: "Email is required", "Password is required"
# Тест: невалидный email
vibe-check type "input[name=email]" "not-an-email"
vibe-check click "button[type=submit]"
vibe-check text ".error[data-field=email]"
# → Агент проверяет: "Please enter a valid email"
# Тест: слабый пароль
vibe-check type "input[name=email]" "valid@test.com"
vibe-check type "input[name=password]" "123"
vibe-check click "button[type=submit]"
vibe-check text ".error[data-field=password]"
# → Агент проверяет: "Password must be at least 8 characters"
# Тест: валидная отправка
vibe-check type "input[name=email]" "valid@test.com"
vibe-check type "input[name=password]" "StrongP@ss123"
vibe-check click "button[type=submit]"
vibe-check wait ".success-message"
vibe-check text ".success-message"
# → Агент проверяет: "Registration successful"
Добавленная ценность агента
Агент может генерировать тестовые случаи из структуры формы:
- Прочитать все элементы
<input>и их атрибуты валидации - Автоматически генерировать тесты граничных значений
- Проверить, что сообщения об ошибках соответствуют ожидаемому UX-тексту
Паттерн 3: Многостраничный поток
Тесты, охватывающие несколько страничных переходов.
Пример: Оформление заказа в интернет-магазине
# Просмотр товаров
vibe-check navigate https://shop.example.com
vibe-check click ".product-card:first-child a"
vibe-check text ".product-name"
# → Агент отмечает: "Blue Widget, $29.99"
# Добавить в корзину
vibe-check click "#add-to-cart"
vibe-check wait ".cart-badge"
vibe-check text ".cart-badge"
# → Агент проверяет: бейдж показывает "1"
# Перейти в корзину
vibe-check navigate https://shop.example.com/cart
vibe-check text ".cart-item-name"
# → Агент проверяет: "Blue Widget"
vibe-check text ".cart-total"
# → Агент проверяет: "$29.99"
# Оформление заказа
vibe-check click "#checkout"
vibe-check type "#card-number" "4111111111111111"
vibe-check type "#expiry" "12/28"
vibe-check type "#cvv" "123"
vibe-check click "#pay-now"
vibe-check wait ".order-confirmation"
vibe-check text ".order-number"
# → Агент фиксирует: "Order #12345"
Ключевые соображения
- Состояние переносится между страницами (содержимое корзины, куки сессии)
- Использовать режим daemon для многостраничных потоков (браузер сохраняется)
- Скриншот на каждой странице для следа отладки
Паттерн 4: Извлечение и верификация данных
Извлечь структурированные данные со страницы и проверить их на соответствие ожидаемым значениям.
Пример: Метрики дашборда
vibe-check navigate https://app.example.com/dashboard
vibe-check eval "JSON.stringify({
revenue: document.querySelector('.metric-revenue').textContent,
users: document.querySelector('.metric-users').textContent,
orders: document.querySelector('.metric-orders').textContent
})"
# → {"revenue": "$45,230", "users": "1,234", "orders": "567"}
Пример: Табличные данные
vibe-check navigate https://app.example.com/users
vibe-check eval "JSON.stringify(
[...document.querySelectorAll('table tbody tr')].map(row => ({
name: row.cells[0].textContent,
email: row.cells[1].textContent,
role: row.cells[2].textContent
}))
)"
# → [{"name": "Alice", "email": "alice@test.com", "role": "Admin"}, ...]
Добавленная ценность агента
Агент может:
- Разобрать JSON-вывод
- Сравнить с ожидаемыми значениями из базы данных или API
- Выявить расхождения и осмысленно сообщить о них
Паттерн 5: Wait-and-Verify (асинхронные операции)
Для операций, которые не завершаются мгновенно (AJAX-вызовы, загрузка файлов и т.д.).
Пример: Загрузка файла
vibe-check navigate https://app.example.com/upload
# Примечание: взаимодействие с полем file input может потребовать eval
vibe-check eval "document.querySelector('input[type=file]').value"
# После инициации загрузки
vibe-check wait ".upload-progress" --state visible
vibe-check wait ".upload-progress" --state hidden --timeout 60000 # Ожидание завершения
vibe-check text ".upload-status"
# → Агент проверяет: "Upload complete"
Пример: Поиск с задержкой (debounce)
vibe-check navigate https://app.example.com/search
vibe-check type "#search-box" "test query"
# Ожидание debounce + API-вызова + отрисовки
vibe-check wait ".search-results"
vibe-check text ".result-count"
# → Агент проверяет: "15 results found"
Паттерн 6: Тестирование с вкладками
Тесты, требующие нескольких вкладок или окон.
Пример: Открытие ссылки в новой вкладке
vibe-check navigate https://app.example.com
vibe-check tab-new https://docs.example.com/api # Открыть документацию API в новой вкладке
vibe-check text "h1"
# → "API Reference"
vibe-check tab-switch 0 # Обратно к приложению
vibe-check text "h1"
# → "Dashboard"
Пример: Сравнение двух страниц
vibe-check navigate https://staging.example.com
vibe-check text ".version" > /tmp/staging-version.txt
vibe-check tab-new https://production.example.com
vibe-check text ".version" > /tmp/prod-version.txt
# Агент сравнивает два файла
Паттерн 7: Негативное тестирование
Проверить, что приложение корректно отклоняет невалидные операции.
Пример: Несанкционированный доступ
# Попытка доступа к странице админа без авторизации
vibe-check navigate https://app.example.com/admin
vibe-check url
# → Агент проверяет: перенаправлен на /login (не /admin)
vibe-check text "h1"
# → Агент проверяет: "Please log in" (не контент администратора)
Пример: Ограничение скорости запросов
# Быстрые запросы подряд
for i in $(seq 1 10); do
vibe-check click "#submit-button"
vibe-check text ".response"
done
# Агент проверяет, сработало ли ограничение скорости
Паттерн 8: Визуальная регрессия (сравнение скриншотов)
Использование скриншотов для обнаружения визуальных изменений.
# Сохранить базовый снимок
vibe-check navigate https://app.example.com/dashboard
vibe-check screenshot -o baseline/dashboard.png
# ... после изменения кода ...
# Сохранить текущий снимок
vibe-check navigate https://app.example.com/dashboard
vibe-check screenshot -o current/dashboard.png
# Агент сравнивает скриншоты (через модель зрения или инструмент попиксельного сравнения)
Добавленная ценность агента
С возможностями зрения агент может:
- Выявить конкретные визуальные различия
- Классифицировать изменения как намеренные или регрессию
- Описать, что изменилось, на естественном языке
Паттерн 9: Тестирование состояний ошибок
Проверить, что приложение корректно обрабатывает ошибки.
Пример: Ошибка сети
# Использовать eval для имитации офлайн-режима
vibe-check eval "window.navigator.__defineGetter__('onLine', () => false)"
vibe-check click "#save-button"
vibe-check text ".error-banner"
# → Агент проверяет: отображается соответствующее сообщение об офлайне
Пример: Ошибка сервера
vibe-check navigate https://app.example.com/broken-page
vibe-check text "body"
# → Агент проверяет: есть ли пользовательская страница ошибки (а не необработанный стек 500)?
vibe-check screenshot -o error-page.png
Антипаттерны
Не надо: Жёстко задавать время ожидания
# ПЛОХО
vibe-check navigate https://app.example.com
sleep 5 # Произвольное ожидание
vibe-check text "h1"
# ХОРОШО
vibe-check navigate https://app.example.com
vibe-check wait "h1" # Ожидание конкретного элемента
vibe-check text "h1"
Не надо: Игнорировать возвращаемые значения
# ПЛОХО
vibe-check click "#submit"
vibe-check text ".result" # Может не сработать, если клик не прошёл
# ХОРОШО
vibe-check click "#submit"
vibe-check wait ".result" # Явно ожидать ожидаемое состояние
vibe-check text ".result"
Не надо: Цеплять команды без верификации
# ПЛОХО: Предполагает, что каждый шаг успешен
vibe-check navigate url && vibe-check click A && vibe-check click B && vibe-check click C
# ХОРОШО: Проверять каждый критический шаг
vibe-check navigate url
vibe-check wait "selector-A"
vibe-check click "selector-A"
vibe-check wait "selector-B"
vibe-check click "selector-B"