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

respond

Обзор​

Подменяет ответы на подходящие запросы, пока правило активно. Исходный запрос в BiDi все равно отправляется на сервер; это не способ запретить побочные эффекты запроса.

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

mock.respond(overwrites, params)

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

ПараметрBiDiClassic/CDP
overwritesСтрока тела или JSON-объект/массив. Callback для тела не поддерживается.Строка, JSON или функция, получающая запись запроса и клиент. Функция может вернуть Promise.
params.headersЗаголовки ответа: объект или синхронная функция от события ответа. Заменяют набор заголовков.Объект или функция. Дополняют исходные заголовки.
params.statusCodeЧисло или синхронная функция от события ответа.Число или функция.
params.cookiesМассив Cookie[] в формате WebDriver или синхронная функция от события ответа.Не поддерживается этой реализацией.
params.fetchResponseНе применяется: подмена выполняется на стадии ответа, запрос доходит до сервера.Boolean, по умолчанию true. При false ответ подменяется до загрузки оригинального тела.

В params.cookies передавайте строковое value и поле expiry (время Unix в секундах), а не BiDi-объект value и поле expires. Библиотека сама преобразует cookies в формат BiDi.

Имя параметра — headers, не header. Без переопределения метаданных используются исходные значения.

Ограничения​

В BiDi строка с путем к файлу или URL остается текстом ответа. Команда не читает файл и не перенаправляет запрос; для изменения URL используйте redirect. В Classic/CDP существующий путь читается как локальный файл, а строка с HTTP(S)-URL задает ответ-перенаправление.

Не смешивайте постоянные и однократные правила без учета реализации. В BiDi respond() заменяет очередь ответов постоянным правилом. respondOnce() убирает постоянное правило и добавляет однократное к другим однократным. В CDP правила добавляются в очередь, и ранее добавленное постоянное правило может перекрыть последующие.

Результат​

BiDi синхронно возвращает тот же объект мока. Classic/CDP не возвращает полезного значения. Для удаления подмены и перехватчика вызовите await mock.restore().

Пример​

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

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

it("mock.respond: replace response data and metadata in BiDi", async ({ browser }) => {
await browser.url("/");
await browser.sessionSubscribe({
events: ["network.beforeRequestSent", "network.responseStarted"],
});
const mock = await browser.mock("/api/items");
try {
mock.respond(
{ source: "mocked" },
{
statusCode: 201,
headers: { "content-type": "application/json", "x-example": "response" },
cookies: [
{
name: "mock-example",
value: "ready",
domain: new URL(await browser.getUrl()).hostname,
path: "/",
},
],
},
);
for (let i = 0; i < 2; i++) {
const result = await browser.execute(async () => {
const response = await fetch("/api/items", { cache: "no-store" });
return {
status: response.status,
header: response.headers.get("x-example"),
body: await response.json(),
};
});
assert.deepEqual(result, {
status: 201,
header: "response",
body: { source: "mocked" },
});
}
} finally {
await mock.restore();
}
});

Источники​

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