Cypress предоставляет мощные средства для перехвата и проверки сетевых запросов, что позволяет проводить детальное тестирование API и фронтенд-взаимодействий. Одной из ключевых задач является проверка request payload — данных, которые клиент отправляет на сервер.
cy.interceptМетод cy.intercept позволяет перехватывать HTTP-запросы
и работать с ними. Он заменил устаревший cy.route и
обладает более гибкими возможностями:
cy.intercept('POST', '/api/users').as('createUser');
GET, POST,
PUT, DELETE и т.д.).as('alias') создаёт удобное имя для последующего
обращения к запросу.Для проверки payload после отправки запроса используется метод
cy.wait с ссылкой на alias:
cy.wait('@createUser').then((interception) => {
expect(interception.request.body).to.deep.equal({
name: 'John Doe',
email: 'john.doe@example.com',
role: 'admin'
});
});
interception.request.body содержит тело запроса в
формате JSON.expect(...).to.deep.equal(...) проверяет полное
соответствие объекта.Если payload может содержать динамические данные (например, timestamp или id), рекомендуется использовать частичное сравнение:
cy.wait('@createUser').its('request.body').should('include', {
role: 'admin'
});
should('include', {...}) проверяет только указанные
поля, игнорируя остальные.
Иногда URL запроса содержит динамические части, например
/api/users/123. В таких случаях удобно использовать
регулярные выражения:
cy.intercept('POST', /\/api\/users\/\d+/).as('updateUser');
cy.wait('@updateUser').then((interception) => {
expect(interception.request.body).to.have.property('email', 'new.email@example.com');
});
Регулярное выражение позволяет перехватывать все запросы, соответствующие заданной маске, не указывая конкретный идентификатор.
Кроме проверки значений, важно убедиться, что структура данных соответствует требованиям:
cy.wait('@createUser').then(({ request }) => {
expect(request.body).to.have.all.keys('name', 'email', 'role');
expect(request.body.name).to.be.a('string');
expect(request.body.email).to.match(/^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/);
});
have.all.keys проверяет наличие всех указанных
ключей.to.be.a('string') и регулярные выражения проверяют типы
и формат полей.Cypress позволяет перехватывать запросы и изменять их payload перед отправкой на сервер:
cy.intercept('POST', '/api/users', (req) => {
req.body.role = 'tester';
}).as('modifiedCreateUser');
cy.get('form').submit();
cy.wait('@modifiedCreateUser').its('request.body').should('have.property', 'role', 'tester');
Это полезно для тестирования различных сценариев без изменения фронтенд-кода.
Если страница отправляет несколько запросов подряд, можно перехватывать и проверять их отдельно:
cy.intercept('POST', '/api/orders').as('createOrder');
cy.intercept('POST', '/api/payments').as('createPayment');
cy.get('#submit-order').click();
cy.wait('@createOrder').its('request.body').should('include', { itemId: 42 });
cy.wait('@createPayment').its('request.body').should('include', { amount: 100 });
Каждый alias позволяет работать с конкретным запросом и его payload независимо.
Для отладки удобно выводить тело запроса в консоль:
cy.wait('@createUser').then((interception) => {
console.log('Request payload:', interception.request.body);
});
Это упрощает анализ сложных объектов и выявление проблем с данными.
req
вместо редактирования фронтенд-кода.Проверка request payload в Cypress позволяет создавать надёжные, детализированные тесты, полностью контролируя данные, отправляемые клиентом на сервер.