Как перехватить несколько запросов XHR с одной и той же конечной точкой с помощью cypress

#cypress

Вопрос:

Например, у меня есть следующие запросы запросов, и каждый запрос возвращает уникальный параметр идентификатора, который будет использоваться позже в другом запросе. Я использовал cypress для этого, но он перехватывает только первый запрос, а не другой для 4 запросов.

Как заставить его перехватывать все запросы и обрабатывать каждый из них отдельно?

 describe(Cypress.env('label') 'TestSuite', function() { 

    beforeEach(function() {
            cy.login_api(Cypress.env('username'), Cypress.env('password'))
    })
    it('General data queries', function(){
        cy.visit(/)

        cy.intercept({method : 'GET',path : '/API/query/*'}).as('call1')
        cy.intercept({method : 'GET',path : '/API/query/*'}).as('call2')
        cy.intercept({method : 'GET',path : '/API/query/*'}).as('call3')
        cy.intercept({method : 'GET',path : '/API/query/*'}).as('call4')
        cy.intercept({method : 'GET',path : '/API/query/*'}).as('call5')

        cy.wait('@call1').then(res => {
            expect(res.response.statusCode).to.eq(200)
            const valuesV3 = res.response.body.values
        
            cy.setCookie('forceversion', '4')
            cy.intercept({method : 'GET',path : '/galileo/data/*'}).as('call11')
            cy.wait('@call11').then(res => {
                expect(res.response.statusCode).to.eq(200)
                const valuesV4 = res.response.body.values
                alert(vluesV4)
    
                for (var i = 0; i<Object.keys(valuesV3).length;i  ) {
                    let x = Object.values(valuesV3[i])
                    let y = Object.values(valuesV4[i])
            
                    function compare(arr1, arr2) {
                        return arr1.every(item => arr2.includes(item))
                    }
                    if(compare(x,y)==true){
    
                        assert(true)
                    }
                    else {                
                 
                        assert(false)
                    })
                 
                }
           
            }
        
        })
        
    })
    
    })
})
 

Комментарии:

1. Пожалуйста, добавьте свой код Cypress.

2. Почему бы просто не добавить дополнительные 4 команды ожидания для их обработки?

3. @pavelsaman Я добавил код

4. @Zaista я добавляю четыре ожидания, но когда я собираюсь получить ответ, я всегда получаю ответ на первый запрос

Ответ №1:

Используйте одну intercept команду, вызывайте visit после intercept и не вставляйте следующие wait команды. Попробуй вот так:

 it('General data queries', function() {
    cy.intercept({method : 'GET',path : '/API/query/*'}).as('call')
    cy.visit('/')
    cy.wait('@call').then((interception) => {
        cy.log(interception) // first api call
    })
    cy.wait('@call').then((interception) => {
        cy.log(interception) // second api call
    })
    cy.wait('@call').then((interception) => {
        cy.log(interception) // third api call
    })
})
 

Ссылка: https://docs.cypress.io/guides/guides/network-requests#Waiting

Комментарии:

1. Спасибо за ваш ответ, но что делать, если количество запросов время от времени меняется. Я имею в виду, что это может быть 3 запроса, а может быть 2 запроса. Что я могу сделать в этом случае ?

2. Поскольку у вас есть неопределенный тест, с которым немного сложно легко справиться. Если вы действительно не можете заставить свое приложение запускать ожидаемое количество ответов (что должно быть вашим решением), вы можете перехватывать ошибки, вызванные этими дополнительными wait командами, и явно игнорировать их, используя следующие примеры: github.com/cypress-io/cypress-example-recipes/tree/master/…

3. Было бы очень необычно, если бы приложение вызывало свой API разное количество раз в разных стартапах.