Эмуляция сетевых условий

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

Основные принципы эмуляции сетевых условий

Playwright поддерживает эмуляцию различных сетевых параметров, таких как:

  • Скорость загрузки и выгрузки данных: позволяет моделировать как быстрые, так и медленные соединения.
  • Задержка (latency): имитирует время, необходимое для того, чтобы запрос дошел до сервера и обратно.
  • Потери пакетов: возможность эмулировать потерю части сетевых пакетов, что может быть полезно для тестирования устойчивости приложения к сетевым сбоям.

Для настройки этих параметров Playwright использует интерфейс browserContext.setOffline, browserContext.setNetworkConditions и другие методы.

Эмуляция сетевых условий с использованием setNetworkConditions

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

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

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

  // Эмуляция сетевых условий
  await context.setNetworkConditions({
    offline: false,           // Отключение интернета
    downloadThroughput: 500 * 1024,  // Скорость загрузки (500 Kbps)
    uploadThroughput: 500 * 1024,    // Скорость выгрузки (500 Kbps)
    latency: 100,             // Задержка (100 мс)
    offline: false
  });

  const page = await context.newPage();
  await page.goto('https://example.com');
  await page.screenshot({ path: 'example.png' });

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

Детали настройки параметров сети

Скорость загрузки и выгрузки

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

Задержка (latency)

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

Потери пакетов

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

Использование предустановленных профилей сети

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

  • No throttling — без ограничения скорости, идеален для тестирования в условиях стабильного и быстрого интернета.
  • GPRS — эмуляция мобильного интернета с очень низкой пропускной способностью и большой задержкой.
  • Regular 3G — типичная мобильная сеть с задержкой порядка 100 мс и ограниченной пропускной способностью.
  • Slow 3G — медленная сеть с низким качеством связи, типична для старых мобильных устройств или слабых 3G-сетей.
  • WiFi — эмуляция высокоскоростного соединения через Wi-Fi.

Пример использования предустановленного профиля:

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

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

  // Использование предустановленного профиля сети
  await context.setNetworkConditions({
    offline: false,
    downloadThroughput: 1.6 * 1024 * 1024, // 1.6 Mbps
    uploadThroughput: 1.6 * 1024 * 1024,   // 1.6 Mbps
    latency: 40                          // 40 ms
  });

  const page = await context.newPage();
  await page.goto('https://example.com');
  await page.screenshot({ path: 'example.png' });

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

Отключение интернета

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

Пример:

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

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

  // Отключение интернета
  await context.setOffline(true);

  const page = await context.newPage();
  await page.goto('https://example.com');
  // Этот запрос будет завершаться ошибкой, так как интернет отключен
  await page.screenshot({ path: 'example.png' });

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

Работа с сетевыми ошибками

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

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')) {
      route.abort(); // Эмуляция ошибки запроса
    } else {
      route.continue();
    }
  });

  const page = await context.newPage();
  await page.goto('https://example.com'); // Этот запрос будет прерван
  await page.screenshot({ path: 'example.png' });

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

Преимущества и применение

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