Как отловить параметры запроса в авто-тестах, используя CodeceptJS

Задача крайне проста:

Необходимо совершить действие на странице и проверить, что в конкретном апи-запросе отправляются нужные параметры.

Я использую codeceptjs в связке с фреймворком PlayWright. Для решения данной задачи есть базовая функция I.waitForRequest, которая проверяет и эндпоинт и тело запроса. Но беда в том, что когда я совершаю действие на странице, запрос отправляется слишком быстро и функция I.waitForRequest не успевает запуститься до срабатывания запроса и потом просто валится с таймаутом в ожидании уже сработавшего запроса.

Выглядят сейчас эти два шага примерно вот так:

Then('I click on the update button in the advanced search window', () => {
    I.click(advancedSearch.buttons.update);
});
Then('I see correct parameters in the API method for banks', () => {
    I.waitForRequest(
      request => 
        request.url() ===
        'https://test-api.test.ru/api/v2/executions?isBank=true',
    );
  });

Соответственно нужно проверить, что у параметра isBank значение true. Может быть есть какие-то еще варианты проверки запросов, которые успеют сработать в момент между нажатием кнопки и отправлением запроса?


Ответы (1 шт):

Автор решения: Andrei Popruha

Вы можете попробовать добавить задержку перед проверкой запроса API. Вы можете использовать I.wait()функцию, чтобы добавить задержку в миллисекундах. Например:

Then('I click on the update button in the advanced search window', () => {
    I.click(advancedSearch.buttons.update);
});
Then('I see correct parameters in the API method for banks', () => {
    I.wait(500);
    I.waitForRequest(
      request => 
        request.url() ===
        'https://test-api.test.ru/api/v2/executions?isBank=true',
    );
});

В качестве альтернативы вы можете попробовать использовать I.waitForFunctionфункцию ожидания выполнения определенного условия перед проверкой запроса API. Например:

Then('I click on the update button in the advanced search window', () => {
    I.click(advancedSearch.buttons.update);
});
Then('I see correct parameters in the API method for banks', () => {
    I.waitForFunction(() => {
      return window.fetch.mock.calls.length > 0;
    });
    I.waitForRequest(
      request => 
        request.url() ===
        'https://test-api.test.ru/api/v2/executions?isBank=true',
    );
});
→ Ссылка