Перехват Cypress не ожидает

#cypress

#cypress

Вопрос:

Я использую Cypress 6.0.0 новый способ перехвата. Ожидание запроса

Мне нужно дождаться ответа «templatecontract», чтобы нажать #template-button-next, потому что в противном случае он отключен. Но пытается щелкнуть по нему, прежде чем получить ответ от API. Документация кажется довольно простой.

Я здесь не прав?

Я также пробовал точно так же, как:

 cy.wait('@templatecontract')
cy.get('#template-button-next').click()
 
 it("Test", function() {
    cy.intercept(Cypress.env("baseUrl") `/api/v1/contract-type/templatecontract`).as('templatecontract')
    cy.login(Cypress.env('testUserInviteEmail'), Cypress.env('testUserInvitePassword')).then((token) => {

        cy.visit(Cypress.env('baseUrl') "/templates", {headers: {
            Authorization: token,
          },
        });
        cy.get('a[href="/create-template"]').click();
        cy.get('.template-usecasetitle').contains('UBO-Formular')
        cy.get('button[cy-data="Formular"]').click();
        cy.get('#title').type("Title for testing");
        cy.get('#usecasetitle').type("Usecasetitle for testing")
        cy.get('#description').type("Description just for testing")
        cy.wait('@templatecontract').then(interceptions => {
            cy.get('#template-button-next').click()
        });
    });
});
 

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

1. вы получили решение этой проблемы. Я сталкиваюсь с той же проблемой.

Ответ №1:

Я не уверен, почему, но просто установка типа метода (в данном случае POST) решила проблему.

 cy.intercept('POST', Cypress.env("baseUrl") `/api/v1/contract-type/templatecontract`).as('templatecontract')
 

Ответ №2:

У меня была похожая проблема, и проблема заключалась в том, что первым запросом, отправленным моим приложением, был запрос ПАРАМЕТРОВ.

Если вы не включаете метод в качестве первого аргумента, все методы (включая ОПЦИИ) теперь сопоставляются. Это может вызвать недоумение, поскольку ваш .wait запрос будет удовлетворен запросом OPTIONS, а не вашим вторым запросом POST.

Ссылка: https://docs.cypress.io/api/commands/intercept.html#Comparison-to-cy-route Ссылка: https://docs.cypress.io/api/commands/intercept.html#Matching-URL

Ответ №3:

Интересно, что я получаю разные результаты для

 cy.intercept("POST", "https://backend.rocketgraph.app/api/signup").as("doSignup")
 

и

 cy.intercept("POST", `${BACKEND_URL}/signup`).as("doSignup")
 

Не уверен, в чем проблема. Также необходимо установить POST , как упоминал один из пользователей

Первый фактически перехвачен. Странно, но произошло.

Ответ №4:

Если вы отслеживаете маршрут в верхней части вашего теста, как вы делаете здесь, cy.wait() он немедленно вернется, если к моменту его вызова на этот маршрут уже были получены ответы.

В качестве примера, допустим, вы заметили это на вкладке «Сеть»:

 GET some-route: 200
GET some-route: 200
GET some-route: 200
GET some-route: 200
POST something-unique: 200
GET some-route: 500
 

^ некоторый маршрут проходит 500 в некоторой четко идентифицируемой точке. Должно быть легко поймать в тесте, верно? Ну:

 it('Should fail on this 500, but doesn't???', () => {
  // start spying our indicator; seems good:
  cy.intercept('GET', 'something-unique').as('indicator')
  // but if we start spying the route here:
  cy.intercept('POST', 'some-route').as('route')

  // then hit some-route a bunch of times amp; return:
  foo()

  // then expect to catch the failure after something-unique fires:
  cy.wait('@indicator').its('response.statusCode').should('eq', 200).then( () => {
  // then expect the test to fail on the 500:
  cy.wait('@route').its('response.statusCode).should('not.eq', 500) 
  // ...this won't work! this test will pass because cy.wait() will
  // succeed and return the *first* GET some-route: 200 !
})
 

Лично я нахожу это довольно нелогичным — кажется разумным, что wait() на отслеживаемом маршруте всегда будет фактически ждать следующего запроса! — но, по-видимому, это работает не так.

Один из способов обойти это — не начинать шпионить, пока вы действительно не будете готовы:

 it('Fails on a 500', () => {
  cy.intercept('GET', 'something-unique').as('indicator')
  foo()

  cy.wait('@indicator').its('response.statusCode').should('eq', 200).then( () => {
  // don't start spying until ready:
  cy.intercept('POST', 'some-route').as('route')
  cy.wait('@route').its('response.statusCode).should('not.eq', 500) 
  // and the test fails correctly; response.statusCode 500 should not equal 500
})