Работа с правами доступа на уровне контекста

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

Контексты браузера

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

Создание нового контекста происходит с помощью метода browser.newContext(). Важно, что каждый контекст может быть настроен индивидуально, включая установку различных прав доступа, которые будут ограничивать действия пользователя в рамках теста.

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');
  await browser.close();
})();

Для работы с правами доступа на уровне контекста можно использовать несколько подходов: от эмуляции ролей до изменения доступных API. Рассмотрим подробнее, как можно управлять правами пользователя в разных сценариях.

Эмуляция ролей и прав доступа

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

В Playwright для этого можно использовать метод context.addCookies() для задания нужных cookies, а также методы для работы с localStorage и sessionStorage.

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

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext();
  
  // Добавление куки для администратора
  await context.addCookies([{
    name: 'role',
    value: 'admin',
    domain: 'example.com',
    path: '/',
    httpOnly: true
  }]);

  const page = await context.newPage();
  await page.goto('https://example.com/dashboard');
  await browser.close();
})();

Этот подход позволяет задать роль пользователя ещё до загрузки страницы, что особенно полезно для тестирования сценариев, в которых доступ к различным разделам приложения ограничен в зависимости от роли.

Управление правами с помощью API

Playwright также предоставляет возможность имитировать доступ к различным API и взаимодействовать с ними через context.route(). Это позволяет перехватывать сетевые запросы и изменять их поведение, например, для симуляции ошибки доступа или ограничений на доступ к определённым ресурсам.

Пример создания маршрута для перехвата запросов с API:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext();
  
  // Перехват API запросов и возвращение ошибки авторизации
  await context.route('**/api/protected-resource', route => {
    route.fulfill({
      status: 403, // Ошибка доступа
      body: JSON.stringify({ error: 'Access Denied' }),
    });
  });

  const page = await context.newPage();
  await page.goto('https://example.com/protected');
  await browser.close();
})();

С помощью этого подхода можно проверять обработку отказов в доступе и тестировать реакцию интерфейса на такие сценарии.

Изоляция пользователей в одном тесте

Часто возникает необходимость протестировать сценарий, в котором один пользователь выполняет действия, доступные только ему, а затем другой пользователь с другими правами пытается сделать то же самое. Playwright позволяет использовать несколько контекстов браузера в одном тесте для эмуляции таких сценариев.

Пример изоляции пользователей с разными правами:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();

  // Создание контекста для администратора
  const adminContext = await browser.newContext();
  const adminPage = await adminContext.newPage();
  await adminPage.goto('https://example.com/admin-dashboard');
  
  // Создание контекста для обычного пользователя
  const userContext = await browser.newContext();
  const userPage = await userContext.newPage();
  await userPage.goto('https://example.com/user-dashboard');

  await browser.close();
})();

Таким образом, можно проводить тесты, где одновременно тестируются разные уровни доступа, и проверяется, как система реагирует на различные типы пользователей.

Применение ограничений и флагов

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

Например, для эмуляции пользователя в определённом географическом регионе можно использовать метод context.setGeolocation():

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext();
  
  // Установка геолокации для теста
  await context.setGeolocation({ latitude: 37.7749, longitude: -122.4194 }); // Сан-Франциско
  
  const page = await context.newPage();
  await page.goto('https://example.com');
  await browser.close();
})();

Это позволяет проверить, как система реагирует на запросы из разных регионов с учётом прав доступа, например, для ограниченного контента в определённых странах.

Заключение

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