Аутентификация
Введение
Playwright выполняет тесты в изолированных средах, называемых контекстами браузера. Эта модель изоляции улучшает воспроизводимость и предотвращает каскадные сбои тестов. Тесты могут загружать существующее аутентифицированное состояние. Это устраняет необходимость аутентификации в каждом тесте и ускоряет выполнение тестов.
Основные концепции
Независимо от выбранной стратегии аутентификации, вы, вероятно, будете хранить аутентифицированное состояние браузера в файловой системе.
Мы рекомендуем создать директорию playwright/.auth
и добавить её в ваш .gitignore
. Ваша процедура аутентификации создаст аутентифицированное состояние браузера и сохранит его в файл в этой директории playwright/.auth
. В дальнейшем тесты будут повторно использовать это состояние и начинать уже аутентифицированными.
- Bash
- PowerShell
- Batch
mkdir -p playwright/.auth
echo $'\nplaywright/.auth' >> .gitignore
New-Item -ItemType Directory -Force -Path playwright\.auth
Add-Content -path .gitignore "`r`nplaywright/.auth"
md playwright\.auth
echo. >> .gitignore
echo "playwright/.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 + "')");