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

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

Что такое состояние сессии?

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

  • Куки
  • Локальное хранилище (localStorage)
  • Сессионное хранилище (sessionStorage)
  • Индексы DB
  • Данные, связанные с сессией, такие как авторизация

Задача Playwright — предоставить инструменты для сохранения этого состояния, чтобы оно могло быть использовано в последующих тестах без необходимости заново проходить процесс авторизации или выполнять другие временные операции, требующие значительных ресурсов.

Основные подходы к сохранению состояния сессии

Playwright предоставляет несколько механизмов для сохранения состояния сессии, которые можно использовать в тестах.

Сохранение состояния сессии с использованием метода context.storageState()

Метод context.storageState() позволяет сохранить текущее состояние сессии в файл. Этот метод сохраняет все данные, связанные с состоянием, такие как куки и локальное хранилище. В результате можно легко восстанавливать состояние в следующем тесте, избегая необходимости заново логиниться или повторно загружать страницы.

Пример сохранения состояния сессии:

const { webkit } = require('playwright');  // или другой браузер: chromium, firefox
(async () => {
  const browser = await webkit.launch();
  const context = await browser.newContext();
  const page = await context.newPage();
  
  await page.goto('https://example.com');
  // Сохраняем состояние сессии в файл
  await context.storageState({ path: 'state.json' });

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

В этом примере после выполнения теста состояние сессии сохраняется в файл state.json. Этот файл можно затем использовать для восстановления состояния в следующем тесте.

Восстановление состояния сессии с использованием метода browser.newContext()

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

Пример восстановления состояния сессии:

const { webkit } = require('playwright');  // или другой браузер: chromium, firefox
(async () => {
  const browser = await webkit.launch();
  const context = await browser.newContext({
    storageState: 'state.json'  // указываем путь к файлу состояния
  });
  const page = await context.newPage();
  
  await page.goto('https://example.com');
  // Теперь состояние сессии восстановлено, и можно продолжать тест
  await browser.close();
})();

Этот код создает новый контекст браузера, загружая данные из файла state.json, что позволяет начать тест с восстановленного состояния сессии.

Обработка нескольких сессий

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

Пример использования нескольких контекстов:

const { webkit } = require('playwright');  // или другой браузер: chromium, firefox
(async () => {
  const browser = await webkit.launch();
  
  // Контекст первого пользователя
  const context1 = await browser.newContext();
  const page1 = await context1.newPage();
  await page1.goto('https://example.com');
  await context1.storageState({ path: 'user1_state.json' });
  
  // Контекст второго пользователя
  const context2 = await browser.newContext();
  const page2 = await context2.newPage();
  await page2.goto('https://example.com');
  await context2.storageState({ path: 'user2_state.json' });

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

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

Практическое применение сохранения и восстановления состояния

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

Пример использования с авторизацией

  1. В первом тесте выполняется логин и сохраняется состояние сессии.
const { webkit } = require('playwright');
(async () => {
  const browser = await webkit.launch();
  const context = await browser.newContext();
  const page = await context.newPage();
  
  await page.goto('https://example.com/login');
  await page.fill('input[name="username"]', 'testuser');
  await page.fill('input[name="password"]', 'password');
  await page.click('button[type="submit"]');
  
  // Сохраняем состояние сессии после логина
  await context.storageState({ path: 'loggedInState.json' });

  await browser.close();
})();
  1. Во втором тесте с использованием сохранённого состояния можно сразу перейти к авторизованной части приложения.
const { webkit } = require('playwright');
(async () => {
  const browser = await webkit.launch();
  const context = await browser.newContext({
    storageState: 'loggedInState.json'
  });
  const page = await context.newPage();
  
  await page.goto('https://example.com/dashboard');
  // Продолжить тестирование в авторизованном состоянии
  await browser.close();
})();

Удаление состояния сессии

Playwright позволяет легко очистить состояние сессии, что полезно для тестов, где требуется начать с “чистого листа” или выполнить выход из системы. Для этого можно просто удалить соответствующие файлы сессий или использовать методы, которые очищают состояние контекста.

Пример очистки состояния сессии:

const { webkit } = require('playwright');
(async () => {
  const browser = await webkit.launch();
  const context = await browser.newContext();
  
  // Очищаем состояние сессии
  await context.clearCookies();
  await context.clearLocalStorage();
  
  const page = await context.newPage();
  await page.goto('https://example.com/logout');
  await browser.close();
})();

Этот код очищает все куки и локальное хранилище в контексте браузера, что гарантирует, что тесты будут выполняться без каких-либо остаточных данных.

Заключение

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