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)
Параметры команды
| Параметр | BiDi | Classic/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, а не в браузере.
| Событие | BiDi | Classic/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.