Настройка proxy

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

Основные параметры proxy

Playwright позволяет настраивать proxy-серверы для браузеров на уровне конфигурации. Для этого используется объект proxy, который позволяет указать параметры, такие как:

  • server: адрес прокси-сервера. Это обязательное поле.
  • username: имя пользователя для аутентификации на прокси-сервере.
  • password: пароль для аутентификации.
  • bypass: строка или список доменов, для которых прокси-сервер не используется.

Прокси-сервер для браузера

Для настройки прокси-сервера на уровне браузера Playwright нужно использовать параметры при запуске браузера через API launch(). Это позволяет перенаправить весь трафик браузера через заданный прокси.

Пример настройки:

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

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://proxy-server.com:8080', // Адрес прокси
      username: 'user', // Имя пользователя
      password: 'password', // Пароль
    }
  });

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

В этом примере браузер запускается с использованием прокси-сервера по адресу proxy-server.com:8080 с указанием имени пользователя и пароля для аутентификации.

Прокси-сервер для отдельных страниц

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

Для этого используется метод newContext(), который позволяет настроить прокси-сервер для конкретного контекста браузера. Контексты в Playwright — это независимые сессии браузера с собственными куками, локальным хранилищем и сессионными данными.

Пример настройки прокси на уровне контекста:

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

(async () => {
  const browser = await chromium.launch();
  
  const context = await browser.newContext({
    proxy: {
      server: 'http://proxy-server.com:8080', // Прокси для контекста
      username: 'user', // Имя пользователя
      password: 'password', // Пароль
    }
  });

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

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

Использование прокси без аутентификации

Если прокси-сервер не требует аутентификации, настройка будет значительно проще. Можно указать только адрес прокси-сервера, без использования полей username и password.

Пример без аутентификации:

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

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://proxy-server.com:8080', // Прокси без аутентификации
    }
  });

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

Блокировка прокси для определённых доменов

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

Пример с исключением доменов:

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

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://proxy-server.com:8080', // Прокси-сервер
      bypass: 'example.com' // Исключить example.com из проксирования
    }
  });

  const page = await browser.newPage();
  await page.goto('http://example.com'); // Этот запрос не будет использовать прокси
  await page.goto('http://another-example.com'); // Этот запрос будет использовать прокси
  await browser.close();
})();

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

Ротация прокси

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

Пример с ротацией:

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

const proxyList = [
  'http://proxy1.com:8080',
  'http://proxy2.com:8080',
  'http://proxy3.com:8080'
];

(async () => {
  const browser = await chromium.launch();
  const randomProxy = proxyList[Math.floor(Math.random() * proxyList.length)];

  const context = await browser.newContext({
    proxy: {
      server: randomProxy
    }
  });

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

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

Прокси для запросов в сети

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

Пример настройки прокси для запросов:

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

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext();
  
  context.route('**/*', (route, request) => {
    route.continue({
      url: request.url(),
      headers: {
        ...request.headers(),
        'Proxy-Authorization': 'Basic dXNlci1wYXNzd29yZA==' // Заголовок для прокси-аутентификации
      }
    });
  });

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

Здесь используется метод route(), чтобы добавить заголовок аутентификации прокси для каждого сетевого запроса.

Ожидание и управление прокси

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

Пример настройки тайм-аутов:

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

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext({
    proxy: {
      server: 'http://proxy-server.com:8080'
    },
    timeout: 30000 // Увеличиваем тайм-аут до 30 секунд
  });

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

Заданный тайм-аут в 30 секунд даст больше времени для обработки запросов через прокси.

Проблемы с прокси

При работе с прокси могут возникнуть различные проблемы, такие как неправильная аутентификация, медленный отклик, или блокировка сервером. Для отладки этих проблем полезно использовать логи и сетевые инструменты. В Playwright можно использовать метод page.on(‘response’) для мониторинга всех ответов от сервера и отслеживания проблем с прокси-сервером.

Пример мониторинга ответов:

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

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext({
    proxy: {
      server: 'http://proxy-server.com:8080'
    }
  });

  const page = await context.newPage();

  page.on('response', (response) => {
    console.log(`Response status: ${response.status()} for ${response.url()}`);
  });

  await page.goto('http://example.com');
  await browser.close();
})();

С помощью этого кода можно следить за всеми ответами от прокси-сервера и выявлять проблемы в процессе тестирования.

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