Сохранение и восстановление сессии

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

Что такое сессия в Puppeteer?

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

Зачем сохранять и восстанавливать сессии?

Преимущества использования сохранения и восстановления сессий включают:

  • Снижение времени выполнения тестов. Вместо того чтобы каждый раз начинать тест с чистого листа (например, проходя через процесс авторизации), можно быстро восстановить состояние сессии и продолжить тестирование с того места, где оно было завершено.
  • Стабильность тестов. Часто бывает необходимо проверить не только функциональность приложения, но и его поведение в различных состояниях. Сохранение сессии позволяет избежать непредсказуемых изменений в результатах тестов.
  • Упрощение кода тестов. Когда восстановление сессии осуществляется программно, тесты становятся более читаемыми и понятными, так как исключается избыточная логика подготовки.

Как сохранить сессию в Puppeteer?

Чтобы сохранить сессию в Puppeteer, нужно экспортировать куки и локальное хранилище из текущего контекста браузера. Эти данные можно затем записать в файл и использовать при следующем запуске тестов.

Сохранение cookies

Для сохранения сессии в Puppeteer можно использовать метод page.cookies(), который возвращает список всех cookies для текущего контекста.

Пример кода:

const fs = require(&

async function saveSession(page) {
  // Получаем все cookies
  const cookies = await page.cookies();
  
  // Сохраняем cookies в файл
  fs.writeFileSync('cookies.json', JSON.stringify(cookies));
}

Сохранение локального хранилища

Для сохранения данных локального хранилища (например, localStorage и sessionStorage), нужно выполнить команду JavaScript в контексте страницы и сохранить данные.

Пример кода:

async function saveLocalStorage(page) {
  const localStorageData = await page.evaluate(() => {
    return Object.keys(localStorage).map(key => {
      return { key: key, value: localStorage.getItem(key) };
    });
  });

  // Сохраняем данные локального хранилища в файл
  fs.writeFileSync('localStorage.json', JSON.stringify(localStorageData));
}

Как восстановить сессию в Puppeteer?

Восстановление сессии включает в себя загрузку сохранённых cookies и данных локального хранилища, а затем повторную их установку в текущий контекст страницы.

Восстановление cookies

Чтобы восстановить cookies, нужно загрузить данные из файла и использовать метод page.setCookie().

Пример кода:

async function restoreSession(page) {
  const cookies = JSON.parse(fs.readFileSync('cookies.json', 'utf8'));

  // Устанавливаем cookies
  for (let cookie of cookies) {
    await page.setCookie(cookie);
  }
}

Восстановление локального хранилища

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

Пример кода:

async function restoreLocalStorage(page) {
  const localStorageData = JSON.parse(fs.readFileSync('localStorage.json', 'utf8'));

  await page.evaluate((data) => {
    data.forEach(item => {
      localStorage.setItem(item.key, item.value);
    });
  }, localStorageData);
}

Полный пример: сохранение и восстановление сессии

Рассмотрим полный пример, который включает как сохранение, так и восстановление сессии:

const puppeteer = require('puppeteer');
const fs = require('fs');

async function saveSession(page) {
  const cookies = await page.cookies();
  fs.writeFileSync('cookies.json', JSON.stringify(cookies));

  const localStorageData = await page.evaluate(() => {
    return Object.keys(localStorage).map(key => {
      return { key: key, value: localStorage.getItem(key) };
    });
  });
  fs.writeFileSync('localStorage.json', JSON.stringify(localStorageData));
}

async function restoreSession(page) {
  const cookies = JSON.parse(fs.readFileSync('cookies.json', 'utf8'));
  for (let cookie of cookies) {
    await page.setCookie(cookie);
  }

  const localStorageData = JSON.parse(fs.readFileSync('localStorage.json', 'utf8'));
  await page.evaluate((data) => {
    data.forEach(item => {
      localStorage.setItem(item.key, item.value);
    });
  }, localStorageData);
}

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Восстановление сессии
  await restoreSession(page);

  // Открываем страницу
  await page.goto('https://example.com');

  // Выполняем действия на странице

  // Сохраняем сессию после выполнения действий
  await saveSession(page);

  await browser.close();
})();

Сложности и особенности

  1. Проблемы с доменом и путями cookies. Cookies привязаны к определённому домену и пути. Если при восстановлении сессии используется другой домен или путь, cookies могут не работать должным образом. В таких случаях важно учитывать, что восстановленные cookies должны быть установлены в контексте соответствующего домена.

  2. Ограничения локального хранилища. Локальное хранилище может хранить только строковые данные. Если в процессе сохранения и восстановления сессии используются другие типы данных, их нужно сериализовать и десериализовать соответствующим образом.

  3. Совместимость с новыми версиями Puppeteer. Некоторые методы работы с cookies и локальным хранилищем могут изменяться с выходом новых версий Puppeteer, поэтому важно проверять совместимость используемых методов с текущей версией библиотеки.

  4. Многопользовательская работа. Если необходимо управлять сессиями для нескольких пользователей одновременно, потребуется реализовать логику сохранения и восстановления сессий для каждого пользователя в отдельности, например, с использованием разных файлов или баз данных для хранения состояния.

Рекомендации

  • Автоматизация и безопасность. При использовании сохранённых сессий всегда проверяйте, что данные не были изменены или повреждены, особенно если сессии сохраняются в открытых или небезопасных местах.
  • Интеграция с другими инструментами тестирования. Сохранение и восстановление сессий можно использовать в связке с такими инструментами, как Jest или Mocha, для улучшения работы с тестами и ускорения их выполнения.

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