Сохранение состояния авторизации

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

Почему важно сохранять состояние авторизации

Сохранение состояния авторизации значительно упрощает тестирование веб-приложений. Без этой возможности каждый тест будет начинаться с нулевого состояния, что может привести к увеличению времени на тестирование, а также к дополнительным проблемам при выполнении большого количества тестов. Важно помнить, что при работе с несколькими тестами или при работе с системами с длинной цепочкой авторизаций сохранение состояния позволяет поддерживать непрерывность теста и минимизировать возможные ошибки.

Основные механизмы Playwright для сохранения состояния

Playwright предоставляет несколько методов для сохранения состояния авторизации между тестами:

  1. Сохранение и загрузка cookies Cookies — это данные, которые сохраняются в браузере и позволяют отслеживать состояние сессии пользователя. Один из подходов — сохранить cookies в одном тесте и использовать их в следующем. В Playwright это можно реализовать с помощью API для работы с cookies.

  2. Сохранение и загрузка локального хранилища (localStorage) Локальное хранилище используется для сохранения данных на клиентской стороне, например, токенов авторизации или других данных сессии. С помощью Playwright можно сохранять и загружать эти данные между тестами.

  3. Сохранение и загрузка sessionStorage SessionStorage — это еще один механизм хранения данных в браузере, аналогичный localStorage, но данные в нем хранятся только в пределах одной сессии браузера. Для целей авторизации этот механизм используется реже, но может быть полезен в определенных ситуациях.

  4. Сохранение состояния сессии с использованием контекста браузера Контексты в Playwright позволяют изолировать тесты и их состояние, сохраняя все данные, связанные с сессией, такие как cookies и localStorage.

Пример сохранения и загрузки состояния авторизации

Рассмотрим пример, где мы будем использовать cookies для сохранения состояния авторизации между тестами.

  1. Сохранение состояния авторизации в 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 могут быть использованы в других тестах для повторной авторизации.

  2. Загрузка состояния авторизации из 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 из файла, добавляем их в контекст браузера и переходим на защищенную страницу, где проверяем, что сессия успешно восстановлена.

Работа с localStorage и sessionStorage

В некоторых приложениях авторизация может храниться не только в cookies, но и в localStorage. Рассмотрим пример сохранения и восстановления состояния авторизации с использованием localStorage.

  1. Сохранение состояния в 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();
    })();
  2. Загрузка состояния из 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 и контекстами браузера. Это позволяет эффективно поддерживать авторизацию между тестами, сокращая время на тестирование и делая процесс более надежным.