#javascript #cypress #cypress-cucumber-preprocessor
#javascript #кипарис #cypress-cucumber-препроцессор
Вопрос:
В Cypress я использую cy.route()
для отправки запроса ниже, но cypress не идентифицирует отправку запроса ниже. В URL-адресе маршрута есть значение openHash, которое будет отличаться для каждого запроса POST. Есть ли какой-нибудь способ проигнорировать значение openHash или принять любое значение, отображаемое там.
До сих пор я пытался указать URL-адрес следующими способами в маршруте.
url: '**/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=**',
url: '**/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=**amp;ajaxCall=true**',
Я считаю, что при использовании cy.route() URL-адрес публикации должен точно совпадать. Не мог бы кто-нибудь посоветовать, пожалуйста
Cypress version: 5.4.0
Student.feature
Feature: Update student details
Background: User logged in to application
Given I should load all of the routes required for tests
Scenario: Update student details
When I am logged in as the student user
And I click on "Student" subtab
And I should see details displayed
Step definition
:
import { Then, When, And } from "cypress-cucumber-preprocessor/steps";
before(() => {
Then('I should load all of the routes required for tests', () => {
cy.server();
cy.route({
method: 'POST',
url: '**student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=5fc8329a76e73amp;ajaxCall=true**',
delay: 2000
}).as('getStudentTabDetails');
})
})
Then('I am logged in as the student user', () => {
cy.get('[name=loginUsername]').type("Student1");
cy.get('[name=loginPassword]').type("somePassword1", { sensitive: true });
cy.contains('Login').click();
})
Then('I click on {string} subtab', (student) => {
cy.get('#main a').contains(student).click({force:true});
});
Then('I should see details displayed', () => {
cy.wait('@getStudentTabDetails', { timeout: 5000 });
});
Error:
Ошибка кипариса
Тайм-аут повторной попытки: cy.wait() тайм-аут ожидания 5000 мс для 1-го запроса к маршруту: getStudentTabDetails. Никакого запроса так и не поступило.
Комментарии:
1. Я думаю, что в cy.route2 есть
pathname
опция — совпадения типа ‘path’, но без параметров запроса , поэтому следует игнорировать все после ‘?’.2. @Ackroydd Я добавил к вопросу шаг функции и строку определения шага. При нажатии на вкладку Student приложение отправит запрос POST. Я пытаюсь перехватить этот запрос, используя строку
I should see details displayed
3. Спасибо, теперь все ясно.
cy.route()
требуетсяcy.server()
перед ним, так что это первый шаг.cy.route2()
лучше для вашего требования.4. Я использую
cy.server()
в своем тесте. Попробую с помощью cy.route2()5. Пожалуйста, предоставьте полный тест в вопросе, иначе трудно помочь.
Ответ №1:
Cypress.minimatch — это инструмент, который можно использовать для проверки совпадений маршрутов.
По умолчанию Cypress использует minimatch для проверки шаблонов глобусов на соответствие URL-адресам запросов.
Если вы затрудняетесь с написанием правильного шаблона, вы можете выполнить итерацию намного быстрее, протестировав ее непосредственно в консоли инструментов разработчика.
Два маршрута, которые вы показываете в вопросе, на самом деле проходят тест на минимальное соответствие.
const url = 'http://example/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=5fc8329a76e73amp;ajaxCall=true';
const pattern1 = '**/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=**';
console.log( Cypress.minimatch(url, pattern1) ); // true
const pattern2 = '**/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=**amp;ajaxCall=true**';
console.log( Cypress.minimatch(url, pattern2) ); // true
Вот Cypress fiddle, который показывает, как использовать новый метод перехвата для обработки параметров запроса.
/// <reference types="@cypress/fiddle" />
const test = {
html: `
<p class="text-lg"></p>
<script>
setTimeout(() => {
const url = 'http://example/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=5fc8329a76e73amp;ajaxCall=true';
window.fetch(url, { method: 'POST'});
}, 1000);
</script>
`,
test: `
cy.intercept({
method: 'POST',
url: '/student/details.php',
query: {
viewDetails: 'project', // whatever query parts you care about
stdCount: '1',
sectionID: '1'
}
}, {}) // Added an empty stub here, as my url does not actually exist
.as('getStudentTabDetails');
cy.wait('@getStudentTabDetails')
`
}
it('', () => {
cy.runExample(test)
});
Сообщение создается с помощью встроенной функции fetch(), которая не была бы захвачена в старом cy.route()
методе без использования полизаполнения.