Как перехватить сетевой запрос и воспроизвести его с теми же заголовками в Cypress?

У меня есть тест Cypress, в котором я перехожу на определенную страницу, и эта страница автоматически инициирует несколько запросов. Один из запросов извлекает данные и отображает их в пользовательском интерфейсе. В моем тесте я хочу захватить этот запрос со всеми параметрами и заголовками и воспроизвести его после нажатия кнопки выхода. С помощью этого теста я хочу убедиться, что авторизованные запросы возвращают код ошибки, если они снова вызываются с теми же заголовками аутентификации (файлами cookie) после выхода из системы. Я даже не уверен, возможно ли это через Cypress или нет. На данный момент я провожу этот тест вручную, используя такие инструменты, как Fiddler, Burp Repeater и т. д., и хочу автоматизировать его. Принимаются также предложения по любым другим способам автоматизации таких тестов.

Когда вы говорите «повторить это», вы имеете в виду отправку другого запроса? Если это так, вы можете сделать это с помощью cy.request().

jjhelguero 09.12.2022 17:11

Да, я имел в виду отправить тот же запрос еще раз.

Sunny 12.12.2022 03:56
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
2
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Сначала зафиксируйте запрос, отправленный приложением, с помощью cy.intercept(). Затем используйте cy.request(), чтобы повторно отправить его.

Вы хотите пройти тест, если последний запрос не удался, поэтому я бы попробовал его с failOnStatusCode: false.

Базовая схема будет следующей.

cy.intercept(url, (capturedRequest) => {
  cy.request({
    ...capturedRequest,
    failOnStatusCode: false
  })
  .then(response => {
    expect(response.statusCode).to.eq(505)  // whatever the failure code is 
  })
});

cy.get(logoutSelector).click()
Ответ принят как подходящий

Ответ Паоло не сработает, потому что capturedRequest всегда будет undefined. Cypress является асинхронным, поэтому переменная не будет иметь значения к моменту вызова cy.request(), что приведет к сбою.

Правильный способ сделать это:

cy.intercept('*/logout*').as('outRequest'); // Setup intercept and alias to monitor the request

cy.get('#logoutButton').click(); // Initiate the request

cy.wait('@outRequest'); // Wait for the request to come back, this is important

// Resend request and validate status code
cy.get('@outRequest').then((out) => {
  cy.request({...out.request, failOnStatusCode: false}).should(response => {
    expect(response.status).to.eq(401)
  })
})

Другие вопросы по теме