Аутентификация
Введение
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. После выполнения этих шагов контекст браузера будет аутентифицирован.
- Sync
- Async
page = context.new_page()
page.goto('https://github.com/login')
# Взаимодействие с формой входа
page.get_by_label("Username or email address").fill("username")
page.get_by_label("Password").fill("password")
page.get_by_role("button", name="Sign in").click()
# Продолжение теста
page = await context.new_page()
await page.goto('https://github.com/login')
# Взаимодействие с формой входа
await page.get_by_label("Username or email address").fill("username")
await page.get_by_label("Password").fill("password")
await page.get_by_role("button", name="Sign in").click()
# Продолжение теста
Повторный вход в систему для каждого теста может замедлить выполнение тестов. Чтобы этого избежать, повторно используйте существующее аутентифицированное состояние.
Повторное использование аутентифицированного состояния
Playwright предоставляет способ повторного использования аутентифицированного состояния в тестах. Таким образом, вы можете войти в систему только один раз, а затем пропустить шаг входа для всех тестов.
Веб-приложения используют аутентификацию на основе cookies или токенов, где аутентифицированное состояние хранится в виде cookies, в локальном хранилище или в IndexedDB. Playwright предоставляет метод browser_context.storage_state(), который можно использовать для получения состояния хранилища из аутентифицированных контекстов, а затем создания новых контекстов с предварительно заполненным состоянием.
Состояние cookies, локального хранилища и IndexedDB может использоваться в разных браузерах. Они зависят от модели аутентификации вашего приложения, которая может требовать некоторой комбинации cookies, локального хранилища или IndexedDB.
Следующий фрагмент кода получает состояние из аутентифицированного контекста и создает новый контекст с этим состоянием.
- Sync
- Async
# Сохранение состояния хранилища в файл.
storage = context.storage_state(path="state.json")
# Создание нового контекста с сохраненным состоянием хранилища.
context = browser.new_context(storage_state="state.json")
# Сохранение состояния хранилища в файл.
storage = await context.storage_state(path="state.json")
# Создание нового контекста с сохраненным состоянием хранилища.
context = await browser.new_context(storage_state="state.json")
Продвинутые сценарии
Хранилище сессий
Повторное использование аутентифицированного состояния охватывает аутентификацию на основе cookies, локального хранилища и IndexedDB. Редко хранилище сессий используется для хранения информации, связанной с аутентифицированным состоянием. Хранилище сессий специфично для определенного домена и не сохраняется между загрузками страниц. Playwright не предоставляет API для сохранения хранилища сессий, но следующий фрагмент кода может быть использован для сохранения/загрузки хранилища сессий.
- Sync
- Async
import os
# Получение хранилища сессий и сохранение в переменную окружения
session_storage = page.evaluate("() => JSON.stringify(sessionStorage)")
os.environ["SESSION_STORAGE"] = session_storage
# Установка хранилища сессий в новом контексте
session_storage = os.environ["SESSION_STORAGE"]
context.add_init_script("""(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)
}
}
})('""" + session_storage + "')")
import os
# Получение хранилища сессий и сохранение в переменную окружения
session_storage = await page.evaluate("() => JSON.stringify(sessionStorage)")
os.environ["SESSION_STORAGE"] = session_storage
# Установка хранилища сессий в новом контексте
session_storage = os.environ["SESSION_STORAGE"]
await context.add_init_script("""(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)
}
}
})('""" + session_storage + "')")