Ожидание конкретных запросов

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

Зачем нужно ожидание запросов?

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

Чтобы предотвратить такие проблемы, необходимо правильно настроить ожидание запросов. Playwright предоставляет несколько методов, которые позволяют отслеживать HTTP-запросы, ожидая их завершения, прежде чем продолжить выполнение теста.

Методы ожидания запросов

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

page.waitForRequest

Метод waitForRequest используется для ожидания появления конкретного HTTP-запроса. Этот метод позволяет дожидаться отправки запроса с определенным URL или с определённым методом HTTP (например, POST, GET и т. д.).

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

const { chromium } = require('playwright');
const browser = await chromium.launch();
const page = await browser.newPage();

await page.goto('https://example.com');

const request = page.waitForRequest(request => 
  request.url() === 'https://example.com/api/data' && request.method() === 'GET'
);

await page.click('button#loadData');

await request; // Ждём, пока не будет отправлен запрос
await browser.close();

В этом примере тест ожидает отправки GET-запроса на URL https://example.com/api/data. Как только запрос будет отправлен, выполнение теста продолжится.

page.waitForResponse

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

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

const { chromium } = require('playwright');
const browser = await chromium.launch();
const page = await browser.newPage();

await page.goto('https://example.com');

const response = page.waitForResponse(response => 
  response.url() === 'https://example.com/api/data' && response.status() === 200
);

await page.click('button#loadData');

const res = await response; // Ожидаем получения ответа
const data = await res.json(); // Извлекаем данные из ответа
console.log(data);

await browser.close();

В этом примере тест не только ожидает отправку запроса, но и проверяет, что ответ имеет статус 200 и содержит данные. Это позволяет убедиться в том, что API работает корректно и возвращает нужную информацию.

Ожидание ответа с определённым содержимым

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

Пример:

const { chromium } = require('playwright');
const browser = await chromium.launch();
const page = await browser.newPage();

await page.goto('https://example.com');

const response = page.waitForResponse(response => 
  response.url() === 'https://example.com/api/data' && 
  response.body().includes('expectedValue')
);

await page.click('button#loadData');

const res = await response; 
const data = await res.json(); 
console.log(data);

await browser.close();

Здесь тест ожидает получения ответа, тело которого должно содержать строку 'expectedValue'. Это полезно, когда нужно удостовериться, что данные, возвращаемые сервером, соответствуют ожидаемому формату.

Ожидание запросов в сценариях с несколькими запросами

В случае, когда на странице происходит несколько запросов, и необходимо ожидать выполнения всех из них, Playwright предоставляет возможность ожидания сразу нескольких ответов. Для этого можно использовать метод Promise.all, комбинируя его с методами waitForRequest или waitForResponse.

Пример:

const { chromium } = require('playwright');
const browser = await chromium.launch();
const page = await browser.newPage();

await page.goto('https://example.com');

const request1 = page.waitForRequest(request => 
  request.url() === 'https://example.com/api/first' && request.method() === 'GET'
);
const request2 = page.waitForRequest(request => 
  request.url() === 'https://example.com/api/second' && request.method() === 'POST'
);

await page.click('button#loadData');

await Promise.all([request1, request2]); // Ожидаем оба запроса

await browser.close();

Здесь тест дожидается выполнения двух запросов: один GET и один POST. Метод Promise.all позволяет дождаться выполнения всех запросов одновременно, что делает тест более эффективным.

Ожидание нескольких ответов с различными критериями

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

Пример:

const { chromium } = require('playwright');
const browser = await chromium.launch();
const page = await browser.newPage();

await page.goto('https://example.com');

const response1 = page.waitForResponse(response => 
  response.url() === 'https://example.com/api/first' && response.status() === 200
);
const response2 = page.waitForResponse(response => 
  response.url() === 'https://example.com/api/second' && response.status() === 200
);

await page.click('button#loadData');

await Promise.all([response1, response2]); // Ожидаем оба ответа

await browser.close();

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

Ошибки при ожидании запросов

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

Пример:

const { chromium } = require('playwright');
const browser = await chromium.launch();
const page = await browser.newPage();

await page.goto('https://example.com');

try {
  const response = await page.waitForResponse(
    response => response.url() === 'https://example.com/api/data',
    { timeout: 5000 } // Тайм-аут в 5 секунд
  );
  console.log(await response.json());
} catch (error) {
  console.error('Запрос не завершился вовремя:', error);
}

await browser.close();

Этот код показывает, как можно задать тайм-аут для ожидания запроса. Если ответ не приходит в пределах 5 секунд, тест завершится с ошибкой.

Резюме

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