| Руководство по аутентификации в Playwright |
| 05.11.2025 00:00 |
|
Аутентификация – как правило, первое препятствие при настройке автоматизации тестирования. В зависимости от сложности используемого метода аутентификации эта задача может оказаться весьма трудоёмкой. Давайте начнём с простого примера последовательности входа в систему. login.spec.ts 1 import { test, expect } from '@playwright/test';
Абстрагирование шагов входаПоскольку эту последовательность, вероятно, придётся повторять во множестве тестов, её можно вынести в отдельный блок. Это может быть функция, модуль или Page Object. Функциональный модульВ случае функции модуль может выглядеть так: login.ts 1 export const login = async (page: Page) => {
Теперь мы можем использовать эту функцию в нашем тесте. login.spec.ts 1 import { test, expect } from '@playwright/test';
Page ObjectПоскольку Playwright поощряет использование Page Object, можно создать примерно такой объект: login.ts 1 export class LoginPage {
Этот объект страницы теперь можно использовать в тесте. Нам нужно создать его экземпляр и вызвать метод login. Это достаточно простой подход, но в реальном проекте вы, скорее всего, будете передавать разные параметры для входа и делать объект более гибким. login.spec.ts 1 import { test, expect } from '@playwright/test';
Хранение состояния браузераОднако у этих подходов есть свои проблемы. Несмотря на то, что мы соблюдаем принцип DRY в коде, на уровне выполнения тестов мы повторяем одни и те же действия снова и снова. Каждый тест будет переходить на страницу входа, заполнять форму, нажимать кнопку входа и затем проверять успешность авторизации. С современными инструментами для веб-тестирования, такими как Playwright, этого можно избежать. Мы можем сохранить состояние аутентификации и использовать его в нескольких тестах. Для этого воспользуемся двумя возможностями Playwright: context.storageState и test.use. context.storageState — это свойство, которое позволяет сохранить состояние браузера. Его можно либо записать в отдельный файл, либо вернуть из функции и сохранить в переменной. Вот простой пример, демонстрирующий, как это работает: login.spec.ts 1 import { test, expect } from '@playwright/test';
Это сохранит куки браузера и состояние локального хранилища в файл playwright/.auth.json. Этот файл затем можно переиспользовать в нескольких тестах. Функция test.use — это хук, который позволяет применять сохранённое состояние аутентификации в тестах. login.spec.ts 1 import { test, expect } from '@playwright/test';
Внимание!Если вы сохраняете состояние браузера в файл, убедитесь, что этот файл или папка не попадают в ваш репозиторий. Этот файл содержит конфиденциальную информацию. Используйте .gitignore, чтобы исключить файл или папку из коммитов: .gitignore 1 playwright/.auth.json Глобальная настройкаПоскольку большинство тестов требуют аутентификации, мы можем создать файл настройки, который будет служить зависимостью для всех наших тестов. Таким образом, настройка будет подключаться глобально, и не нужно будет повторять её в каждом тесте. Хорошей практикой будет использование расширения .setup.ts вместо .spec.ts для таких файлов, чтобы отделять их от самих тестов. Файлы настройки станут удобным местом для всей логики, отвечающей за подготовку состояния, данных или других зависимостей для тестов. auth.setup.ts 1 import { test as setup, expect } from '@playwright/test';
Как только файл настройки создан, мы можем указать его в качестве зависимости в playwright.config.ts. Логика работы тут следующая:
playwright.config.ts 1 import { defineConfig } from '@playwright/test';
Обратите внимание, что если вы хотите запускать тесты в режиме --ui, нужно убедиться, что проект setup включён в список проектов, иначе он будет пропущен. Это может быть очевидно для опытных пользователей, но мне при первой настройке это не сразу пришло в голову (в headless-режиме всё работает нормально, так как там по умолчанию запускаются все проекты).
Подход с файлом настройки работает отлично, так как вы одновременно тестируете и процесс логина. Как только вход успешен, Playwright переходит к другим тестам. Однако бывают случаи, когда вам не нужно быть залогиненным. Для таких тестов можно просто использовать хук test.use и сбросить состояние для текущего теста. redirect.spec.ts 1 import { test, expect } from '@playwright/test';
Сохранение состояния и повторное его использование в нескольких тестах — лучший способ работы с аутентификацией. Это сокращает время выполнения тестов и делает их более надёжными. Если ваше приложение защищено от атак перебором (как оно и должно быть), вы ограничите количество запросов к эндпойнту логина. Это снижает нагрузку на бэкенд и уменьшает вероятность блокировки из-за капчи или других мер безопасности. |