Insights / Технические материалы

Обезьянье тестирование сайта с GitHub Copilot × Playwright: практическое руководство

Практическое руководство по систематическому обезьяньему тестированию статического сайта с использованием VS Code Agent Mode (GitHub Copilot) в сочетании с инструментами браузера Playwright. Рассматриваются методология проектирования тестов, обнаруженные ошибки и их исправления, а также рекомендации по улучшению.

  • Технологии
  • GitHub Copilot
  • VS Code
  • Astro
  • Веб-сайт
Обезьянье тестирование сайта с GitHub Copilot × Playwright: практическое руководство
Содержание
  1. Введение
  2. Тестовая среда
  3. Фаза 1: Инвентаризация объектов тестирования
  4. Полное чтение исходного кода
  5. Автоматическая генерация плана тестирования
  6. Фаза 2: Полный обход всех маршрутов
  7. Проверка HTTP-статусов
  8. Проверка DOM-структуры
  9. Проверка битых ссылок
  10. Фаза 3: Проверка взаимодействий
  11. FAQ (элементы <details>)
  12. Модальное окно поиска (Pagefind)
  13. Паттерн фасада YouTube
  14. Кнопка копирования (после View Transitions)
  15. Кнопка прокрутки вверх
  16. Фаза 4: Аудит SEO и структурированных данных
  17. Мета-теги OGP
  18. Структурированные данные (JSON-LD)
  19. Карта сайта
  20. Фаза 5: Проверка доступности
  21. Фаза 6: Тестирование навигации с View Transitions
  22. Фаза 7: Проверка заголовков безопасности
  23. Обнаруженные ошибки и исправления
  24. Ошибка 1: Модальное окно поиска не устойчиво к сбоям
  25. Ошибка 2: Отсутствующие домены Google в CSP-заголовке
  26. Систематизация методологии тестирования
  27. Уровень 1: Статический анализ (чтение исходного кода)
  28. Уровень 2: Тестирование HTTP-уровня (полный обход маршрутов)
  29. Уровень 3: Тестирование DOM-уровня (проверка структуры)
  30. Уровень 4: Тестирование уровня взаимодействий (проверка поведения)
  31. Уровень 5: Тестирование уровня доступности
  32. Ограничения и оговорки
  33. Заключение

Введение

Контроль качества веб-сайта не ограничивается одноразовой проверкой перед выпуском. Непредвиденные проблемы могут возникнуть в любой момент — при добавлении контента, обновлении библиотек, изменении конфигурации CDN и в других случаях.

В этой статье описан практический сеанс обезьяньего тестирования, в котором VS Code Agent Mode (GitHub Copilot) напрямую управлял браузером для тестирования всего сайта. Мы систематизировали методологию тестирования, которую ИИ последовательно выполняет — от статического анализа исходного кода до динамической проверки в браузере.


Тестовая среда

Элемент Детали
Редактор VS Code + GitHub Copilot (Agent Mode)
Модель ИИ Claude Opus 4.6
Управление браузером Встроенные инструменты Playwright в VS Code
Объект тестирования Статический сайт на Astro + UnoCSS + Cloudflare Pages
Предпросмотр npm run preview (локально) + продакшн URL

В Agent Mode Copilot автономно выполняет команды терминала, читает и записывает файлы и управляет браузером. Тестировщик просто даёт инструкцию «протестируйте», и ИИ автоматически выполняет весь процесс, описанный ниже.


Фаза 1: Инвентаризация объектов тестирования

Полное чтение исходного кода

ИИ сначала сканирует структуру каталогов проекта и читает весь исходный код компонентов, страниц и утилит.

src/
├── components/    ← Прочитаны все 28 компонентов
├── content/blog/  ← Распознан frontmatter 23 статей
├── pages/         ← Определены все файлы маршрутизации
├── layouts/       ← Понята структура BaseLayout
└── utils/         ← Проанализированы rehype-плагины и генерация OG-изображений

На этом этапе ИИ автоматически определяет:

  • Полный список маршрутов: 7 статических страниц + маршруты блога (статьи, теги, архив, авторы, пагинация)
  • Интерактивные элементы: модальное окно поиска, переключатели FAQ, кнопки копирования, фасад YouTube, прокрутка вверх, слайдер на главной странице
  • Внешние интеграции: ssgform.com (формы), Cloudflare Turnstile (защита от ботов), Google AdSense, GA4

Автоматическая генерация плана тестирования

По результатам анализа исходного кода ИИ автоматически генерирует план тестирования в виде списка задач. Людям не нужно создавать чек-листы.


Фаза 2: Полный обход всех маршрутов

Проверка HTTP-статусов

Собранный сайт запускается с помощью npm run preview, и Playwright обращается ко всем маршрутам.

Объекты тестирования: 38 маршрут
├── Статические страницы    7 (/, /about/, /services/ и т.д.)
├── Посты блога            23
├── Страницы тегов         25
├── Архив                   5
├── Пагинация               2 (/blog/page/2/, /blog/page/3/)
├── Страницы авторов        2
├── RSS                     1
└── Тест 404                1

Результат: Все маршруты 200 OK (кроме намеренного 404)

Проверка DOM-структуры

На каждой странице автоматически проверяется следующее:

Элемент проверки Метод проверки Результат
Битые изображения img.complete && img.naturalWidth === 0 0 найдено
Пустые ссылки href пустой, # или не задан 0 найдено
Небезопасные внешние ссылки target="_blank" без rel="noopener" 0 найдено
Количество H1 document.querySelectorAll('h1').length === 1 Все страницы OK
Ссылка пропуска Наличие “Skip to content” Все страницы OK
Атрибут lang html[lang="ja"] Все страницы OK

Проверка битых ссылок

Внутренние ссылки были рекурсивно собраны со стартовой страницы, подтверждена доступность всех 69 уникальных URL. 0 битых ссылок обнаружено.


Фаза 3: Проверка взаимодействий

ИИ напрямую управляет элементами браузера через Playwright для проверки функциональности на JavaScript.

FAQ (элементы <details>)

// Пример тестового кода, выполненного ИИ
const details = document.querySelectorAll("details");
// Начальное состояние: все закрыты → OK
// Клик для открытия → OK
// Повторный клик для закрытия → OK

Модальное окно поиска (Pagefind)

  1. Открытие диалога поиска с помощью window.openSearch()
  2. Ожидание завершения загрузки Pagefind UI
  3. Ввод «Astro» и подтверждение появления результатов поиска
  4. Подтверждение закрытия клавишей ESC

Паттерн фасада YouTube

  1. Клик по элементу .yt-facade
  2. Подтверждение динамической генерации iframe для youtube-nocookie.com/embed/
  3. Подтверждение наличия параметра autoplay=1

Кнопка копирования (после View Transitions)

Подтверждено, что кнопки копирования блоков кода переинициализируются и работают после перехода страниц через View Transitions. Повторная регистрация через событие astro:page-load работала корректно.

Кнопка прокрутки вверх

Прокрутка до конца страницы → кнопка появляется → клик → подтверждение возврата window.scrollY к 0.


Фаза 4: Аудит SEO и структурированных данных

Мета-теги OGP

На всех страницах проверено следующее:

  • og:title / og:description / og:image / og:url / og:type установлены
  • twitter:card установлен в summary_large_image
  • canonical URL корректен
  • URL OG-изображения существует и имеет рекомендуемый размер (1200×630)

Структурированные данные (JSON-LD)

JSON-LD на каждой странице был разобран для проверки типов схем и содержимого.

Тип страницы Структурированные данные
Все страницы Organization, WebSite
Посты блога BreadcrumbList, BlogPosting, FAQPage
Статьи с FAQ FAQPage (mainEntity содержит вопросы и ответы)

Карта сайта

Подтверждено, что sitemap-index.xmlsitemap-0.xml содержит все 288 URL, включая многоязычные страницы. Ссылка на карту сайта из robots.txt также работала корректно.


Фаза 5: Проверка доступности

Проверки, аналогичные движку AXE, были выполнены через Playwright на нескольких страницах.

Элемент проверки Проверено страниц Нарушения
Атрибуты alt у img 4 0
Метки кнопок 4 0
Иерархия заголовков (порядок h1→h2→h3) 4 0
Метки полей ввода форм 1 (Контакты) 0
Элементы-ориентиры 4 0
Атрибуты rel внешних ссылок 4 0
Значения tabindex 4 0

Ноль нарушений на всех 4 страницах и по всем элементам проверки.


Фаза 6: Тестирование навигации с View Transitions

При использовании Astro View Transitions DOM обновляется дифференциально, что делает переинициализацию JavaScript сложной задачей. Были проверены следующие паттерны переходов:

Главная → Список блога → Статья → Тег → Автор → Контакты → Услуги → Главная

После каждого перехода подтверждено:

  • URL, заголовок и H1 корректно обновляются
  • Кнопка поиска работает
  • Кнопки копирования переинициализируются
  • Хлебные крошки обновляются
  • Ноль JS-ошибок

Фаза 7: Проверка заголовков безопасности

Проверка заголовков ответа на продакшн-сайте:

Заголовок Значение Оценка
Content-Security-Policy Полностью настроен
X-Frame-Options SAMEORIGIN
X-Content-Type-Options nosniff
Strict-Transport-Security max-age=15552000
Referrer-Policy strict-origin-when-cross-origin
Permissions-Policy geolocation=(), camera=() и т.д.

Обнаруженные ошибки и исправления

В ходе этого тестового сеанса были обнаружены 2 ошибки, обе исправлены в том же сеансе.

Ошибка 1: Модальное окно поиска не устойчиво к сбоям

Симптом: Если нажать кнопку поиска до завершения загрузки скрипта Pagefind, интерфейс перестаёт реагировать.

Причина: loadPagefindScript() не имел механизма повторной попытки после первоначального сбоя.

Исправление: Реализована очистка кэша промиса при сбое и отображение кнопки «Перезагрузить» в качестве запасного интерфейса.

Ошибка 2: Отсутствующие домены Google в CSP-заголовке

Симптом: Ресурсы, связанные с Google AdSense, блокируются CSP, вызывая ошибки в консоли.

Причина: connect-src и frame-src не включали https://www.google.com / https://www.google.co.jp.

Исправление: Добавлены домены Google в директивы CSP в public/_headers.


Систематизация методологии тестирования

Систематизируя данный подход к обезьяньему тестированию с ИИ, его можно классифицировать по следующим уровням:

Уровень 1: Статический анализ (чтение исходного кода)

  • Сканирование структуры каталогов
  • Построение карты зависимостей компонентов
  • Анализ схемы frontmatter (Zod)
  • Обзор конфигурации CSP и перенаправлений

Уровень 2: Тестирование HTTP-уровня (полный обход маршрутов)

  • Проверка кодов состояния (200/404/301)
  • Аудит заголовков ответа (безопасность, кэш)
  • Согласованность sitemap, robots.txt, ads.txt

Уровень 3: Тестирование DOM-уровня (проверка структуры)

  • Битые изображения, пустые ссылки, небезопасные внешние ссылки
  • Уникальность H1 и иерархия заголовков
  • Мета-теги (OGP, canonical, description)
  • Структурированные данные (JSON-LD)

Уровень 4: Тестирование уровня взаимодействий (проверка поведения)

  • Клик, ввод, операции с клавиатурой
  • Открытие/закрытие модальных окон, валидация форм
  • Переинициализация JS после View Transitions
  • События прокрутки, ленивая загрузка

Уровень 5: Тестирование уровня доступности

  • Атрибуты alt, метки, ARIA
  • Иерархия заголовков, ориентиры
  • Управление фокусом, tabindex
  • Ссылки пропуска

Ограничения и оговорки

Обезьянье тестирование с ИИ имеет некоторые ограничения:

Ограничение Подробности
Эмуляция вьюпорта Эмуляция мобильной ширины не работает во встроенном браузере VS Code. Корректность CSS была проверена через статический анализ результатов сборки
Сетевые условия Симуляция офлайн-режима и медленного соединения невозможна. Тестирование Service Worker также не охвачено
Пользовательское «ощущение» Красота дизайна, читаемость и соответствие бренду требуют человеческой оценки
Потоки аутентификации Страницы, требующие входа, нуждаются в отдельном безопасном управлении учётными данными

Для адаптивного CSS-дизайна мы заменили проверку прямым анализом CSS-файлов в результатах сборки, подтвердив корректную генерацию медиа-запросов @media(min-width:768px).


Заключение

GitHub Copilot Agent Mode может завершить полный цикл контроля качества — от анализа исходного кода → планирования тестов → автоматического управления браузером → исправления ошибок → повторной проверки — начиная с одной инструкции: «протестируйте».

Вот сводка результатов этого сеанса:

  • Объекты тестирования: 38 маршрут + 25 тегов + 5 архивов + 2 пагинации = 70 маршрутов
  • Элементы тестирования: HTTP-статусы, DOM-структура, взаимодействия, SEO, доступность, безопасность, View Transitions
  • Обнаружено ошибок: 2 (модальное окно поиска, CSP-заголовок) → исправлены на месте
  • Нарушений доступности: 0
  • Битых ссылок: 0

Сочетание визуальной проверки человеком и автоматизированной проверки ИИ обеспечивает как покрытие тестами, так и эффективность.

Как проводить обезьянье тестирование с ИИ

  1. Инвентаризация

    Чтение всего исходного кода для определения маршрутов, компонентов и взаимодействий для тестирования.

  2. Тестирование обходом

    Отправка HTTP-запросов ко всем маршрутам и обнаружение кодов состояния, битых изображений и пустых ссылок.

  3. Проверка взаимодействий

    Работа с JS-элементами — переключатели FAQ, кнопки копирования, модальные окна поиска и YouTube-вставки.

  4. Аудит структуры и SEO

    Проверка структурированных данных, OGP, мета-тегов, иерархии заголовков и доступности на всех страницах.

Сравнение с ручным тестированием

Традиционное ручное тестирование

  • Визуальная проверка каждой страницы в браузере по одной
  • Ручное создание и ведение чек-листов
  • Склонность к упущениям и пропущенным проверкам
  • Запись шагов воспроизведения занимает много времени

Обезьянье тестирование с ИИ

  • Автоматический обход всех маршрутов для проверки HTTP-статусов и DOM-структуры
  • ИИ автоматически извлекает объекты тестирования из исходного кода
  • Нулевой пропуск обнаружения битых изображений, пустых ссылок и JS-ошибок
  • Обнаружение → анализ причин → исправление → повторное тестирование — всё в одном сеансе

Часто задаваемые вопросы

Можно ли использовать GitHub Copilot Agent Mode бесплатно?

Бесплатный план GitHub Copilot имеет ежемесячные лимиты использования Agent Mode. Планы Pro и Business имеют расширенные лимиты. Последние функции доступны раньше в VS Code Insiders.

Можно ли использовать тот же подход с браузерными инструментами, отличными от Playwright?

Мы используем встроенные браузерные инструменты VS Code (Simple Browser + интеграция с Playwright). Поскольку Copilot напрямую управляет браузером через инструмент run_playwright_code, нет необходимости устанавливать Playwright отдельно.

Можно ли применить этот подход к нестатическим сайтам?

Да. Тот же подход работает для SPA и SSR-сайтов. Однако страницы, требующие аутентификации, нуждаются в механизме безопасного управления тестовыми учётными данными.

Может ли ИИ исправлять обнаруженные ошибки?

В Agent Mode возможно чтение и запись файлов, поэтому весь цикл — от обнаружения ошибки до исправления и проверки сборки — может быть выполнен в рамках одного сеанса. В этой статье мы обнаружили 2 ошибки и исправили их на месте.