#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
})