Перехват запросов и ответов

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

Использование WebdriverIO с devtools для перехвата сетевых запросов

WebdriverIO поддерживает интеграцию с Chrome DevTools Protocol (CDP), что позволяет работать с запросами и ответами на низком уровне. Чтобы начать перехват сетевых запросов, необходимо использовать API CDP, которое доступно через WebdriverIO.

  1. Настройка драйвера для использования CDP Для того чтобы начать работу с DevTools в WebdriverIO, необходимо включить поддержку CDP при запуске сессии. Например, при использовании ChromeDriver, нужно указать debuggerAddress или включить опцию chromeOptions в конфигурации WebdriverIO.

    capabilities: [
        {
            browserName: 'chrome',
            'goog:chromeOptions': {
                args: ['--headless', '--disable-gpu', '--remote-debugging-port=9222']
            }
        }
    ]

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

  2. Подключение к CDP Чтобы начать перехват запросов, нужно подключиться к Chrome DevTools API через WebdriverIO:

    const cdp = await browser.cdp('Network', 'enable');

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

Перехват HTTP-запросов

WebdriverIO с интеграцией DevTools позволяет перехватывать и анализировать HTTP-запросы и ответы. Для этого нужно использовать события, предоставляемые API CDP, такие как Network.requestWillBeSent, Network.responseReceived и другие.

  1. Отслеживание исходящих запросов С помощью события 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, методе и теле запроса (если оно присутствует).

  2. Отслеживание ответов на запросы Для отслеживания ответов на запросы используется событие responseReceived. Это позволяет получить статусный код ответа, заголовки и тело ответа:

    browser.on('Network.responseReceived', (params) => {
        console.log('URL ответа:', params.response.url);
        console.log('Статусный код:', params.response.status);
        console.log('Заголовки ответа:', params.response.headers);
    });

    С помощью этого события можно проверять успешность запросов (например, статус 200) или получать информацию о возможных ошибках в ответах.

Модификация запросов и ответов

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

  1. Изменение заголовков запроса Для изменения заголовков запроса можно использовать событие requestWillBeSent и модифицировать заголовки перед отправкой запроса:

    browser.on('Network.requestWillBeSent', (params) => {
        if (params.request.url.includes('api/sensitive-endpoint')) {
            params.request.headers['Authorization'] = 'Bearer token123';
        }
    });

    Этот код изменяет заголовок Authorization для запросов к определённому API.

  2. Подмена ответа сервера В случае, если необходимо подменить данные в ответе, можно использовать событие 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 можно настроить фильтрацию запросов и ответов по определённым критериям, чтобы перехватывать только те запросы, которые интересуют.

  1. Фильтрация по URL Можно задать фильтрацию запросов по определённым URL, что позволяет уменьшить количество отслеживаемых событий:

    browser.on('Network.requestWillBeSent', (params) => {
        if (params.request.url.includes('/api/v1/')) {
            console.log('Запрос к API:', params.request.url);
        }
    });
  2. Фильтрация по методу запроса Если нужно перехватывать только запросы определённого типа (например, только POST или GET запросы), можно фильтровать их по методу:

    browser.on('Network.requestWillBeSent', (params) => {
        if (params.request.method === 'POST') {
            console.log('POST запрос:', params.request.url);
        }
    });

Практическое применение перехвата запросов

Перехват запросов и ответов часто используется в следующих случаях:

  • Тестирование взаимодействия с API: С помощью перехвата можно проверять правильность запросов и ответов, например, проверять корректность передаваемых данных, заголовков и статусов.
  • Тестирование обработки ошибок: Можно подменять ответы от сервера, чтобы тестировать, как приложение реагирует на ошибки, такие как 404 или 500.
  • Моделирование нагрузочных сценариев: Изменяя задержки или статусные коды ответов, можно симулировать разные условия работы сервера и проверять, как приложение справляется с этими ситуациями.

Завершение сессии

Когда сессия больше не требуется, необходимо отключить перехват запросов и очистить ресурсы:

await browser.cdp('Network', 'disable');

Это остановит перехват запросов и освобождает связанные с ним ресурсы.

Заключение

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