В процессе автоматизированного тестирования часто возникает необходимость не только взаимодействовать с пользовательским интерфейсом, но и отслеживать сетевые запросы, которые происходят при взаимодействии с приложением. WebdriverIO предоставляет инструменты для перехвата и анализа HTTP-запросов и ответов, что особенно полезно для тестирования API и проверки данных, передаваемых между клиентом и сервером. Рассмотрим основные методы работы с перехватом сетевых запросов в WebdriverIO.
devtools для перехвата сетевых запросовWebdriverIO поддерживает интеграцию с Chrome DevTools Protocol (CDP), что позволяет работать с запросами и ответами на низком уровне. Чтобы начать перехват сетевых запросов, необходимо использовать API CDP, которое доступно через WebdriverIO.
Настройка драйвера для использования CDP Для
того чтобы начать работу с DevTools в WebdriverIO, необходимо включить
поддержку CDP при запуске сессии. Например, при использовании
ChromeDriver, нужно указать debuggerAddress или включить
опцию chromeOptions в конфигурации WebdriverIO.
capabilities: [
{
browserName: 'chrome',
'goog:chromeOptions': {
args: ['--headless', '--disable-gpu', '--remote-debugging-port=9222']
}
}
]
После этого можно подключиться к протоколу DevTools для выполнения более сложных операций, таких как перехват HTTP-запросов.
Подключение к CDP Чтобы начать перехват запросов, нужно подключиться к Chrome DevTools API через WebdriverIO:
const cdp = await browser.cdp('Network', 'enable');
Эта команда позволяет включить перехват сетевых запросов и ответов, а также настроить обработчики событий для различных типов запросов.
WebdriverIO с интеграцией DevTools позволяет перехватывать и
анализировать HTTP-запросы и ответы. Для этого нужно использовать
события, предоставляемые API CDP, такие как
Network.requestWillBeSent,
Network.responseReceived и другие.
Отслеживание исходящих запросов С помощью
события requestWillBeSent можно перехватывать исходящие
HTTP-запросы:
browser.cdp('Network', 'enable');
browser.on('Network.requestWillBeSent', (params) => {
console.log('URL запроса:', params.request.url);
console.log('Метод:', params.request.method);
console.log('Тело запроса:', params.request.postData);
});
Этот код позволяет отслеживать каждый запрос, отправленный браузером, и выводить информацию о его URL, методе и теле запроса (если оно присутствует).
Отслеживание ответов на запросы Для отслеживания
ответов на запросы используется событие responseReceived.
Это позволяет получить статусный код ответа, заголовки и тело
ответа:
browser.on('Network.responseReceived', (params) => {
console.log('URL ответа:', params.response.url);
console.log('Статусный код:', params.response.status);
console.log('Заголовки ответа:', params.response.headers);
});
С помощью этого события можно проверять успешность запросов (например, статус 200) или получать информацию о возможных ошибках в ответах.
В WebdriverIO есть возможность не только перехватывать запросы, но и модифицировать их. Это может быть полезно при тестировании различных сценариев, например, для подмены данных, изменения заголовков или даже ошибок на сервере.
Изменение заголовков запроса Для изменения
заголовков запроса можно использовать событие
requestWillBeSent и модифицировать заголовки перед
отправкой запроса:
browser.on('Network.requestWillBeSent', (params) => {
if (params.request.url.includes('api/sensitive-endpoint')) {
params.request.headers['Authorization'] = 'Bearer token123';
}
});
Этот код изменяет заголовок Authorization для запросов к
определённому API.
Подмена ответа сервера В случае, если необходимо
подменить данные в ответе, можно использовать событие
responseReceived и модифицировать тело ответа:
browser.on('Network.responseReceived', (params) => {
if (params.response.url.includes('api/fake-response')) {
const modifiedResponse = {
...params.response,
body: '{"data": "fake data"}'
};
return modifiedResponse;
}
});
Такой подход позволяет тестировать работу приложения с поддельными данными, что бывает полезно для проверки обработки ошибок.
В WebdriverIO можно настроить фильтрацию запросов и ответов по определённым критериям, чтобы перехватывать только те запросы, которые интересуют.
Фильтрация по URL Можно задать фильтрацию запросов по определённым URL, что позволяет уменьшить количество отслеживаемых событий:
browser.on('Network.requestWillBeSent', (params) => {
if (params.request.url.includes('/api/v1/')) {
console.log('Запрос к API:', params.request.url);
}
});Фильтрация по методу запроса Если нужно перехватывать только запросы определённого типа (например, только POST или GET запросы), можно фильтровать их по методу:
browser.on('Network.requestWillBeSent', (params) => {
if (params.request.method === 'POST') {
console.log('POST запрос:', params.request.url);
}
});Перехват запросов и ответов часто используется в следующих случаях:
Когда сессия больше не требуется, необходимо отключить перехват запросов и очистить ресурсы:
await browser.cdp('Network', 'disable');
Это остановит перехват запросов и освобождает связанные с ним ресурсы.
Перехват запросов и ответов в WebdriverIO позволяет тестировщикам получить более полное представление о взаимодействии приложения с сервером. Возможность отслеживать, изменять и фильтровать запросы открывает широкие возможности для тестирования, в том числе для API-тестирования, проверки данных и моделирования различных сценариев работы.