Перейти к основному содержимому

mock

Обзор​

Создает перехватчик сетевых запросов. Возвращаемый объект позволяет наблюдать запросы, заменять ответы или прерывать загрузку. Возможности зависят от протокола сессии.

  • WebDriver BiDi: перехват через сетевые события BiDi. Дополнительно доступны изменение запроса, перенаправление и сброс правил.
  • Classic с CDP/Puppeteer: прежняя реализация для совместимого браузера. Это не универсальная возможность Classic WebDriver.
  • WebDriver-перехват Sauce Labs: отдельное расширение провайдера с другим API и без событий; не переносите на него BiDi-пример без проверки.

См. подключение CDP и перехват запросов. Различия ниже относятся к Testplane 9.3.2 / WDIO 9.6.2.

Использование​

await browser.mock(url, filters)

Параметры команды​

ПараметрBiDiClassic/CDP
urlСтрока URLPattern: абсолютный HTTP(S)-шаблон или pathname, например /api/items.Glob-строка или RegExp.
methodСтрока или функция-фильтр HTTP-метода.То же.
requestHeadersОбъект или функция-фильтр заголовков запроса.То же.
responseHeadersОбъект или функция-фильтр заголовков ответа.Не применяется.
headersНе используйте; для ответа есть responseHeaders.Фильтр заголовков ответа, не запроса.
postDataНе применяется.Строка или функция-фильтр тела запроса.
statusCodeЧисло или функция-фильтр статуса ответа.То же.

Опции фильтрации необязательны. Фильтры ответа проверяются только на стадии ответа: событие request в BiDi может произойти раньше. Glob-строки CDP и URLPattern BiDi не взаимозаменяемы.

Результат​

Команда возвращает Promise с объектом мока. Общие операции: respond, respondOnce, abort, abortOnce, waitForResponse, clear и restore. Сигнатуры могут различаться между реализациями.

Только в BiDi: request, requestOnce, redirect, redirectOnce и reset.

mock.calls хранит историю ответов:

  • BiDi: объекты network.responseStarted, например call.request.url и call.response.status. Это не гарантия полной загрузки тела.
  • Classic/CDP: записи с url, body, headers, responseHeaders, statusCode.

Не используйте поля одной реализации как общий контракт. clear() очищает историю, но сохраняет правила. restore() удаляет перехватчик; ожидайте его завершения в finally.

События​

Подписывайтесь через mock.on(name, listener). Обработчик выполняется в Node.js, а не в браузере.

СобытиеBiDiClassic/CDP
requestСобытие network.beforeRequestSent: URL в event.request.url.Событие CDP Fetch.requestPaused.
matchВ этой версии не испускается, хотя объявлено в типах.Запись совпавшего ответа.
overwriteСобытие запроса или ответа, к которому применена подмена.Параметры подмененного ответа.
failИдентификатор прерванного запроса.Объект с requestId и errorReason.
continueИдентификатор продолженного запроса.Идентификатор продолженного запроса.

Не используйте наличие события как доказательство завершения всего сетевого обмена.

Пример​

Пример использует Chrome с WebDriver BiDi. Укажите в baseUrl адрес тестового HTTP-сервера: / отдает HTML-страницу, а /api/items — JSON с полем source: "original" и статусом 200. Явная подписка на события нужна для новых сессий в одном воркере в WDIO 9.6.2.

const assert = require("node:assert/strict");

it("browser.mock: observe and replace a BiDi response", async ({ browser }) => {
await browser.url("/");
await browser.sessionSubscribe({
events: ["network.beforeRequestSent", "network.responseStarted"],
});
const mock = await browser.mock("/api/items", { method: "GET", statusCode: 200 });
const seenUrls = [];
mock.on("request", event => seenUrls.push(event.request.url));
try {
mock.respond({ source: "mocked" });
const body = await browser.execute(async () =>
(await fetch("/api/items", { cache: "no-store" })).json(),
);
await mock.waitForResponse({ timeout: 3000 });
assert.equal(body.source, "mocked");
assert.equal(mock.calls.length, 1);
assert.ok(mock.calls[0].request.url.endsWith("/api/items"));
assert.ok(seenUrls.some(url => url.endsWith("/api/items")));
} finally {
await mock.restore();
}
});

Источники​

Материал учитывает исходную статью WebdriverIO.