Backup и восстановление

Тестовые сценарии с Puppeteer нередко требуют сохранения браузерного состояния между запусками. К такому состоянию относят файл-куки, параметры локального хранилища и сессионного хранилища, а также созданные контексты аутентификации. Резервный бэкап этих данных позволяет ускорить тесты, избегать повторной авторизации и восстанавливать контексты после сбоев.

Типы данных, подлежащих бэкапу

Cookies. Наиболее частая цель бэкапа. Содержат токены аутентификации, настройки региона, флаги пользовательских предпочтений.

LocalStorage. Подходит для сохранения пользовательских настроек интерфейса и данных, которые приложение кэширует локально.

SessionStorage. Имеет смысл при воспроизведении шагов внутри одной сессии. В тестировании применяется реже, но в сложных сценариях также может требоваться.

User Data Directory. Полный каталог данных Chromium: базы IndexedDB, LocalStorage, куки, настройки браузера. Резервирование каталога полезно при интеграционных тестах, где требуется многократное воспроизведение сложной среды.

Извлечение и запись состояния

Puppeteer предоставляет средства сериализации куки и локального хранилища через API страницы и контекста браузера. Для получения набора куки вызывается page.cookies(), для установки — page.setCookie(). Работа с LocalStorage требует выполнения скрипта в контексте страницы.

// Извлечение состояния
const cookies = await page.cookies();
const localStorageData = await page.evaluate(() => {
  const data = {};
  for (let i = 0; i < localStorage.length; i++) {
    const key = localStorage.key(i);
    data[key] = localStorage.getItem(key);
  }
  return data;
});

Полученные структуры сериализуются в JSON-файл, который и служит резервной копией. Аналогично при восстановлении тест загружает данные из файла и устанавливает их в окружение браузера:

// Восстановление состояния
await page.setCookie(...cookiesFromBackup);
await page.evaluate(data => {
  Object.keys(data).forEach(key => localStorage.setItem(key, data[key]));
}, localStorageFromBackup);

При необходимости бэкап дополняется сессионным хранилищем. Процесс идентичен работе с LocalStorage, но со ссылкой на sessionStorage.

Бэкап каталога пользовательских данных

Полная резервная копия директории пользовательских данных удобна при повторной прогонке больших интеграционных сценариев. Puppeteer позволяет запускать браузер с параметром userDataDir, указывающим внешний каталог. Копирование каталога на файловом уровне создаёт бэкап всех внутренних хранилищ Chromium, включая IndexedDB, WebSQL, связку сертификатов и профильные настройки.

Копирование выполняется стандартными средствами ОС. Перед сохранением директории процесс Chromium должен быть завершён, иначе возможна порча файлов. Восстановление производится обратным копированием перед запуском нового тестового процесса.

Аутентификация и сохранение контекста

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

Отдельного внимания требует ротация токенов. Некоторые системы обновляют токены по истечении срока или при каждом запросе. В подобных случаях бэкап состояния должен дополняться проверкой валидности и механизмом обновления бэкапа.

Инкрементальные обновления бэкапа

Полная резервная копия может быть избыточной для частых прогонов. Оптимизировать процесс помогает выборочная сериализация: сохранение только изменённых ключей LocalStorage, свежих куки или отдельных файлов каталога userDataDir. Применяется при нагрузочном тестировании или CI-интеграции, когда сотни прогонов требуют минимального времени на подготовку среды.

Организация хранения бэкапов

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

Важный момент — разделение бэкапов по веткам разработки, окружениям и типам тестов. Такая структура предотвращает конфликт версий состояния и ускоряет диагностику ошибок при изменении функционала приложения.

Восстановление в рамках CI/CD

При автоматизированных прогонах тесты читают бэкап из артефактов прошлой сборки или из преднастроенного пакета. Восстановление выполняется перед запуском браузера: сначала копируется каталог или загружаются данные JSON, затем поднимается браузер с этим состоянием. Если приложение обновилось и состояние стало несовместимо, тестовая система генерирует новый бэкап до следующего цикла.

Практические аспекты и ограничения

Совместимость версий браузера. Бэкапы userDataDir завязаны на версию Chromium. Обновление Puppeteer может сделать старый бэкап непригодным.

Безопасность. В бэкапе могут присутствовать токены и персональные данные. Требуется шифрование и контроль доступа, особенно при хранении в CI.

Детерминизм. Восстановление состояния должно давать стабильный результат. Если приложение генерирует псевдослучайные ключи в LocalStorage или применяет одноразовые токены, бэкап теряет ценность.

Сложные офлайн-кэши. IndexedDB и сервис-воркеры создают дополнительный слой состояния. При необходимости офлайн-тестирования резервируется весь профиль браузера.

Выводы и практическое применение

Бэкап и восстановление состояния в Puppeteer позволяют моделировать долгоживущие пользовательские сессии, ускорять тестовые циклы и повышать устойчивость тестов к внешним факторам. Грамотная стратегия резервирования делает автоматизацию более предсказуемой и приближенной к реальным пользовательским сценариям.