Тестирование веб-приложений часто требует работы с авторизацией пользователей. В процессе тестирования важно не только проверять правильность работы формы логина, но и обеспечивать сохранение состояния авторизации между тестами. Это помогает ускорить выполнение тестов, избежать излишней многократной авторизации и лучше имитировать реальные сценарии использования приложений. В Playwright для решения этой задачи существует несколько подходов, которые подробно рассмотрим в этом разделе.
Сохранение состояния авторизации значительно упрощает тестирование веб-приложений. Без этой возможности каждый тест будет начинаться с нулевого состояния, что может привести к увеличению времени на тестирование, а также к дополнительным проблемам при выполнении большого количества тестов. Важно помнить, что при работе с несколькими тестами или при работе с системами с длинной цепочкой авторизаций сохранение состояния позволяет поддерживать непрерывность теста и минимизировать возможные ошибки.
Playwright предоставляет несколько методов для сохранения состояния авторизации между тестами:
Сохранение и загрузка cookies Cookies — это данные, которые сохраняются в браузере и позволяют отслеживать состояние сессии пользователя. Один из подходов — сохранить cookies в одном тесте и использовать их в следующем. В Playwright это можно реализовать с помощью API для работы с cookies.
Сохранение и загрузка локального хранилища (localStorage) Локальное хранилище используется для сохранения данных на клиентской стороне, например, токенов авторизации или других данных сессии. С помощью Playwright можно сохранять и загружать эти данные между тестами.
Сохранение и загрузка sessionStorage SessionStorage — это еще один механизм хранения данных в браузере, аналогичный localStorage, но данные в нем хранятся только в пределах одной сессии браузера. Для целей авторизации этот механизм используется реже, но может быть полезен в определенных ситуациях.
Сохранение состояния сессии с использованием контекста браузера Контексты в Playwright позволяют изолировать тесты и их состояние, сохраняя все данные, связанные с сессией, такие как cookies и localStorage.
Рассмотрим пример, где мы будем использовать cookies для сохранения состояния авторизации между тестами.
Сохранение состояния авторизации в cookies
В первом тесте, после успешного логина, мы сохраняем cookies:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
// Переходим на страницу логина
await page.goto('https://example.com/login');
// Вводим данные для авторизации
await page.fill('input[name="username"]', 'user');
await page.fill('input[name="password"]', 'password');
await page.click('button[type="submit"]');
// Ожидаем успешную авторизацию
await page.waitForSelector('text=Welcome');
// Сохраняем cookies после успешной авторизации
const cookies = await context.cookies();
require('fs').writeFileSync('cookies.json', JSON.stringify(cookies));
await browser.close();
})();
В данном примере мы создаем новый браузерный контекст, выполняем
авторизацию, а затем сохраняем cookies в файл cookies.json.
Эти cookies могут быть использованы в других тестах для повторной
авторизации.
Загрузка состояния авторизации из cookies
В следующем тесте мы загружаем cookies из файла и восстанавливаем состояние сессии:
const { chromium } = require('playwright');
const fs = require('fs');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
// Загружаем cookies из файла
const cookies = JSON.parse(fs.readFileSync('cookies.json', 'utf8'));
await context.addCookies(cookies);
const page = await context.newPage();
// Переходим на страницу, где нужно быть авторизованным
await page.goto('https://example.com/dashboard');
// Проверяем, что мы находимся на странице с доступом для авторизованных пользователей
await page.waitForSelector('text=Dashboard');
await browser.close();
})();
Здесь мы загружаем cookies из файла, добавляем их в контекст браузера и переходим на защищенную страницу, где проверяем, что сессия успешно восстановлена.
В некоторых приложениях авторизация может храниться не только в cookies, но и в localStorage. Рассмотрим пример сохранения и восстановления состояния авторизации с использованием localStorage.
Сохранение состояния в localStorage
В первом тесте сохраняем данные из localStorage:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
// Переходим на страницу логина
await page.goto('https://example.com/login');
// Вводим данные для авторизации
await page.fill('input[name="username"]', 'user');
await page.fill('input[name="password"]', 'password');
await page.click('button[type="submit"]');
// Ожидаем успешную авторизацию
await page.waitForSelector('text=Welcome');
// Сохраняем данные из localStorage
const localStorageData = await page.evaluate(() => {
return JSON.stringify(localStorage);
});
require('fs').writeFileSync('localStorage.json', localStorageData);
await browser.close();
})();Загрузка состояния из localStorage
Во втором тесте мы восстанавливаем данные из localStorage:
const { chromium } = require('playwright');
const fs = require('fs');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
// Загружаем данные из localStorage
const localStorageData = JSON.parse(fs.readFileSync('localStorage.json', 'utf8'));
await page.evaluate((data) => {
Object.keys(data).forEach(key => {
localStorage.setItem(key, data[key]);
});
}, localStorageData);
// Переходим на страницу, где нужно быть авторизованным
await page.goto('https://example.com/dashboard');
// Проверяем, что мы находимся на странице с доступом для авторизованных пользователей
await page.waitForSelector('text=Dashboard');
await browser.close();
})();Playwright также позволяет создавать несколько контекстов в одном браузере. Это может быть полезно, если необходимо тестировать несколько пользователей одновременно или если нужно, чтобы каждый тест запускался с уникальным состоянием.
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
// Создаем два контекста с разными сессиями
const context1 = await browser.newContext();
const context2 = await browser.newContext();
const page1 = await context1.newPage();
const page2 = await context2.newPage();
// Переход на страницы с разными пользователями
await page1.goto('https://example.com/login');
await page1.fill('input[name="username"]', 'user1');
await page1.fill('input[name="password"]', 'password1');
await page1.click('button[type="submit"]');
await page2.goto('https://example.com/login');
await page2.fill('input[name="username"]', 'user2');
await page2.fill('input[name="password"]', 'password2');
await page2.click('button[type="submit"]');
// Выполняем тесты для каждого контекста
await browser.close();
})();
В этом примере каждый контекст браузера изолирован, и каждый тест выполняется в своей уникальной сессии, что позволяет тестировать несколько пользователей одновременно, не влияя друг на друга.
Сохранение состояния авторизации является важным элементом автоматизированного тестирования веб-приложений. Playwright предоставляет гибкие инструменты для работы с cookies, localStorage, sessionStorage и контекстами браузера. Это позволяет эффективно поддерживать авторизацию между тестами, сокращая время на тестирование и делая процесс более надежным.