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

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

Введение

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

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

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

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

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

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

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

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

Page page = context.newPage();
page.navigate("https://github.com/login");
// Взаимодействие с формой входа
page.getByLabel("Username or email address").fill("username");
page.getByLabel("Password").fill("password");
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign in"))
.click();
// Продолжение теста

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

Повторное использование аутентифицированного состояния

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

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

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

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

// Сохранение состояния хранилища в файл.
context.storageState(new BrowserContext.StorageStateOptions().setPath(Paths.get("state.json")));

// Создание нового контекста с сохраненным состоянием хранилища.
BrowserContext context = browser.newContext(
new Browser.NewContextOptions().setStorageStatePath(Paths.get("state.json")));

Продвинутые сценарии

Сессионное хранилище

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

// Получение сессионного хранилища и сохранение в переменную окружения
String sessionStorage = (String) page.evaluate("JSON.stringify(sessionStorage)");
System.getenv().put("SESSION_STORAGE", sessionStorage);

// Установка сессионного хранилища в новом контексте
String sessionStorage = System.getenv("SESSION_STORAGE");
context.addInitScript("(storage => {\n" +
" if (window.location.hostname === 'example.com') {\n" +
" const entries = JSON.parse(storage);\n" +
" for (const [key, value] of Object.entries(entries)) {\n" +
" window.sessionStorage.setItem(key, value);\n" +
" };\n" +
" }\n" +
"})('" + sessionStorage + "')");