Перейти к основному содержимому

Аутентификация

Введение

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

Основные концепции

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

Мы рекомендуем создать директорию playwright/.auth и добавить её в ваш .gitignore. Ваша процедура аутентификации создаст аутентифицированное состояние браузера и сохранит его в файл в этой директории playwright/.auth. Впоследствии тесты будут повторно использовать это состояние и начинать уже аутентифицированными.

mkdir -p playwright/.auth
echo $'\nplaywright/.auth' >> .gitignore

Вход перед каждым тестом

API Playwright может автоматизировать взаимодействие с формой входа.

Следующий пример выполняет вход на GitHub. После выполнения этих шагов контекст браузера будет аутентифицирован.

var page = await context.NewPageAsync();
await page.GotoAsync("https://github.com/login");
// Взаимодействие с формой входа
await page.GetByLabel("Username or email address").FillAsync("username");
await page.GetByLabel("Password").FillAsync("password");
await page.GetByRole(AriaRole.Button, new() { Name = "Sign in" }).ClickAsync();
// Продолжение теста

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

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

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

Веб-приложения используют аутентификацию на основе куки или токенов, где аутентифицированное состояние хранится в виде куки, в локальном хранилище или в IndexedDB. Playwright предоставляет метод BrowserContext.StorageStateAsync(), который можно использовать для получения состояния хранилища из аутентифицированных контекстов, а затем создания новых контекстов с предварительно заполненным состоянием.

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

Следующий фрагмент кода получает состояние из аутентифицированного контекста и создает новый контекст с этим состоянием.

// Сохранение состояния хранилища в файл.
// Тесты выполняются в <TestProject>\bin\Debug\netX.0\, поэтому используется относительный путь для ссылки на playwright/.auth, созданный в корне проекта
await context.StorageStateAsync(new()
{
Path = "../../../playwright/.auth/state.json"
});

// Создание нового контекста с сохраненным состоянием хранилища.
var context = await browser.NewContextAsync(new()
{
StorageStatePath = "../../../playwright/.auth/state.json"
});

Расширенные сценарии

Хранилище сессий

Повторное использование аутентифицированного состояния охватывает аутентификацию на основе куки, локального хранилища и IndexedDB. Редко хранилище сессий используется для хранения информации, связанной с состоянием входа. Хранилище сессий специфично для определенного домена и не сохраняется между загрузками страниц. Playwright не предоставляет API для сохранения хранилища сессий, но следующий фрагмент может быть использован для сохранения/загрузки хранилища сессий.

// Получение хранилища сессий и сохранение в переменную окружения
var sessionStorage = await page.EvaluateAsync<string>("() => JSON.stringify(sessionStorage)");
Environment.SetEnvironmentVariable("SESSION_STORAGE", sessionStorage);

// Установка хранилища сессий в новом контексте
var loadedSessionStorage = Environment.GetEnvironmentVariable("SESSION_STORAGE");
await context.AddInitScriptAsync(@"(storage => {
if (window.location.hostname === 'example.com') {
const entries = JSON.parse(storage);
for (const [key, value] of Object.entries(entries)) {
window.sessionStorage.setItem(key, value);
}
}
})('" + loadedSessionStorage + "')");