Storage state и его использование

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

Что такое Storage State?

Storage State представляет собой сериализованное состояние браузера, включая данные о cookies, локальное хранилище (localStorage) и sessionStorage. Эти данные могут быть сохранены и использованы позже для восстановления текущего состояния приложения, что позволяет избежать лишних шагов, таких как повторный вход в систему.

Playwright предоставляет два основных способа работы с Storage State:

  1. Сохранение состояния.
  2. Восстановление состояния.

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

Для сохранения состояния браузера в Playwright используется метод context.storageState(). Этот метод позволяет получить объект, который включает в себя все cookies, данные из localStorage и sessionStorage. Сохранённое состояние может быть записано в файл или использовано для дальнейшего восстановления в другом контексте браузера.

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

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext();
  const page = await context.newPage();
  
  // Навигация и выполнение действий, например, вход в систему
  await page.goto('https://example.com');
  await page.fill('input[name="username"]', 'testuser');
  await page.fill('input[name="password"]', 'password');
  await page.click('button[type="submit"]');
  
  // Сохранение состояния в файл
  await context.storageState({ path: 'state.json' });
  
  await browser.close();
})();

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

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

Чтобы восстановить состояние из ранее сохранённого файла, можно передать путь к файлу в метод newContext() при создании нового контекста. Восстановление состояния позволяет продолжить работу с тем же состоянием, в котором завершился предыдущий сеанс.

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

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  
  // Создание нового контекста с использованием сохранённого состояния
  const context = await browser.newContext({
    storageState: 'state.json'
  });
  
  const page = await context.newPage();
  
  // Страница уже будет аутентифицирована и готова к дальнейшим действиям
  await page.goto('https://example.com');
  
  // Далее можно продолжить тестирование с тем же состоянием
  // Например, проверить, что пользователь всё ещё залогинен
  const userLoggedIn = await page.isVisible('text=Welcome, testuser');
  console.log(userLoggedIn ? 'Пользователь залогинен' : 'Пользователь не залогинен');
  
  await browser.close();
})();

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

Практическое использование

Использование storage state особенно полезно в случаях, когда тесты требуют выполнения нескольких шагов, таких как аутентификация или настройка пользовательских данных, и эти шаги должны быть выполнены только один раз. Например:

  • Аутентификация: сохранение состояния после входа в систему позволяет избежать необходимости повторно вводить логин и пароль на каждом тесте.
  • Персонализированные данные: если приложение сохраняет предпочтения пользователя (например, настройки или корзину покупок), их можно сохранить в storage state для восстановления в дальнейшем.
  • Многоуровневые тесты: в сложных тестах, которые требуют выполнения нескольких этапов, можно сохранить состояние после каждого этапа и восстанавливать его в следующих тестах.

Рекомендации по использованию

  1. Избегать переписывания состояния: Если несколько тестов используют одно и то же состояние, лучше сохранить уникальные файлы для каждого теста, чтобы избежать неожиданного поведения, вызванного перезаписью данных.
  2. Очистка состояния: Иногда полезно очистить cookies или localStorage перед началом теста. Это можно сделать с помощью методов context.clearCookies() или context.clearLocalStorage().
  3. Сохранение на уровне браузера: В некоторых случаях удобно сохранить состояние на уровне браузера, если тесты требуют различных сценариев для разных пользователей, но с одинаковыми действиями.

Пример очистки cookies перед началом нового теста:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext();
  
  // Очистка cookies
  await context.clearCookies();
  
  // Сохранение состояния после выполнения действий
  const page = await context.newPage();
  await page.goto('https://example.com');
  await page.fill('input[name="username"]', 'newuser');
  await page.fill('input[name="password"]', 'newpassword');
  await page.click('button[type="submit"]');
  await context.storageState({ path: 'new_state.json' });
  
  await browser.close();
})();

Преимущества использования Storage State

  1. Скорость: Значительное ускорение тестов, так как исключается необходимость повторной аутентификации и выполнения настроек.
  2. Консистентность: Сохранение состояния позволяет тестировать приложение в одном и том же контексте, что увеличивает стабильность тестов.
  3. Управляемость: С помощью storage state можно управлять состоянием тестов, например, переключаться между разными пользователями или сессиями, не влияя на другие тесты.

Ограничения и особенности

  • Зависимость от данных: При использовании storage state важно помнить, что если состояние зависит от каких-либо временных данных (например, срок действия cookies), то тесты могут начать давать ошибочные результаты через некоторое время.
  • Безопасность: Не стоит хранить чувствительные данные, такие как пароли или токены, в явном виде в файле состояния. Лучше использовать методы защиты данных, например, шифрование.
  • Совместимость с браузерами: Восстановление состояния может работать по-разному для разных браузеров (Chromium, Firefox, WebKit), что важно учитывать при тестировании на различных платформах.

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