Контексты с различными настройками

Контексты с различными настройками

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

Чтобы создать новый контекст в Playwright, используется метод browser.newContext(). Этот метод позволяет задавать различные параметры и опции, которые будут применяться только в рамках этого контекста. Например, можно настроить сессии cookies, локальное хранилище, данные сессии, а также изменить user-agent или даже язык.

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

(async () => {
  const browser = await webkit.launch();
  const context = await browser.newContext({
    userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    locale: 'ru-RU',
    viewport: { width: 1280, height: 720 },
    // другие настройки
  });
  const page = await context.newPage();
  await page.goto('https://example.com');
  // Тестирование...
  await browser.close();
})();

В этом примере создается новый контекст с заданным user-agent, локалью и размером экрана. Эти настройки применяются только для этого контекста и не влияют на другие.

Разные сессии для разных пользователей

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

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

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

  // Первый контекст (первый пользователь)
  const context1 = await browser.newContext();
  const page1 = await context1.newPage();
  await page1.goto('https://example.com');
  await page1.click('text="Войти"');
  // Вход в систему и действия для первого пользователя...

  // Второй контекст (второй пользователь)
  const context2 = await browser.newContext();
  const page2 = await context2.newPage();
  await page2.goto('https://example.com');
  await page2.click('text="Войти"');
  // Вход в систему и действия для второго пользователя...

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

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

Изменение настроек cookies

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

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

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

  // Создаем контекст с cookies
  const context1 = await browser.newContext({
    cookies: [{
      name: 'session_id',
      value: 'abc123',
      domain: 'example.com',
      path: '/',
      httpOnly: true,
      secure: true
    }]
  });
  const page1 = await context1.newPage();
  await page1.goto('https://example.com');
  // Тестирование с авторизацией...

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

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

Настройка сети и перехват запросов

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

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

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

  // Создаем контекст с настройками сети
  const context = await browser.newContext();
  await context.setOffline(true); // Оффлайн-режим
  const page = await context.newPage();
  await page.goto('https://example.com');
  // Проверка поведения сайта в оффлайн-режиме

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

Кроме того, можно перехватывать и изменять сетевые запросы с помощью методов route() и on('route').

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

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext();
  
  context.on('route', route => {
    if (route.request().url().includes('example.com/api')) {
      route.fulfill({
        status: 200,
        body: '{"message": "Success"}'
      });
    } else {
      route.continue();
    }
  });

  const page = await context.newPage();
  await page.goto('https://example.com');
  // Тестирование с перехваченными запросами

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

Совмещение разных контекстов

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

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

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

  // Контекст с cookies для авторизованного пользователя
  const context1 = await browser.newContext({
    cookies: [{
      name: 'session_id',
      value: 'abc123',
      domain: 'example.com',
      path: '/',
      httpOnly: true,
      secure: true
    }]
  });
  const page1 = await context1.newPage();
  await page1.goto('https://example.com');
  await page1.click('text="Корзина"');
  // Действия для авторизованного пользователя

  // Контекст для неавторизованного пользователя
  const context2 = await browser.newContext();
  const page2 = await context2.newPage();
  await page2.goto('https://example.com');
  await page2.click('text="Корзина"');
  // Действия для неавторизованного пользователя

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

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

Использование пользовательских заголовков

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

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

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

  // Контекст с пользовательскими заголовками
  const context = await browser.newContext({
    extraHTTPHeaders: {
      'X-Region': 'EU',
      'X-Custom-Header': 'TestValue'
    }
  });
  const page = await context.newPage();
  await page.goto('https://example.com');
  // Тестирование с пользовательскими заголовками

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

Пользовательские заголовки могут быть полезны для проверки различных настроек региональных ограничений или тестирования API с определенными требованиями к заголовкам.

Заключение

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