Skip to main content

Route

每当使用 page.route(url, handler[, options])browserContext.route(url, handler[, options]) 设置网络路由时,Route 对象允许处理该路由。

了解有关 网络 的更多信息。

route.abort([errorCode])

Added in: v1.8
  • errorCode? <string> 可选错误代码。默认为 failed,可以是以下之一:#
    • 'aborted' - 操作被中止(由于用户操作)
    • 'accessdenied' - 访问资源(网络除外)的权限被拒绝
    • 'addressunreachable' - IP 地址无法访问。这通常意味着没有通往指定主机或网络的路由。
    • 'blockedbyclient' - 客户端选择阻止请求。
    • 'blockedbyresponse' - 请求失败,因为响应随附的要求未得到满足(例如 'X-Frame-Options' 和 'Content-Security-Policy' 祖先检查)。
    • 'connectionaborted' - 由于未收到发送数据的 ACK,连接超时。
    • 'connectionclosed' - 连接已关闭(对应于 TCP FIN)。
    • 'connectionfailed' - 连接尝试失败。
    • 'connectionrefused' - 连接尝试被拒绝。
    • 'connectionreset' - 连接被重置(对应于 TCP RST)。
    • 'internetdisconnected' - 互联网连接已丢失。
    • 'namenotresolved' - 主机名无法解析。
    • 'timedout' - 操作超时。
    • 'failed' - 发生一般故障。
  • returns: <Promise<void>>#

中止路由的请求。

route.continue([options])

Added in:v1.8
  • options? <Object>
    • headers? <Object<string, string>> 若设置,则修改请求的 HTTP 头部。头部值会被转换为字符串。#
    • method? <string> 若设置,则修改请求方法(例如 GET 或 POST)。#
    • postData? <string|Buffer> 若设置,则修改请求的 post 数据。#
    • url? <string> 若设置,则修改请求 URL。新的 URL 必须与原始 URL 使用相同的协议。#
  • returns: <Promise<void>>#

继续该路由上的请求,并可选择性覆盖部分请求参数。

await page.route('**/*', (route, request) => {
// 覆盖标头
const headers = {
...request.headers(),
foo: 'foo-value', // 设置 "foo" 标头
bar: undefined, // 删除 "bar" 标头
};
route.continue({headers});
});

route.fallback([options])

Added in: v1.23
  • options? <Object>
    • headers? <Object<string, string>> 若设置,则修改请求的 HTTP 头部。头部值会被转换为字符串。#
    • method? <string> 若设置,则修改请求方法(如 GET 或 POST)。#
    • postData? <string|Buffer> 若设置,则修改请求的 post 数据。#
    • url? <string> 若设置,则修改请求 URL。新的 URL 必须与原始 URL 使用相同协议。修改 URL 不会影响路由匹配,所有路由仍根据原始请求 URL 匹配。#
  • returns: <Promise<void>>#

当多个路由匹配到同一模式时,它们会按照与注册顺序相反的顺序执行。这样,最后注册的路由始终可以覆盖之前的所有路由。在下面的示例中,请求将首先由最底部的处理器处理,然后回退到前一个,最后被第一个注册的路由终止。

await page.route('**/*', route => {
// 最后运行。
route.abort();
});
await page.route('**/*', route => {
// 第二个运行。
route.fallback();
});
await page.route('**/*', route => {
// 第一个运行。
route.fallback();
});

当您希望单独的处理程序处理不同类型的请求时,注册多个路由很有用,例如 API 调用与页面资源,或 GET 请求与 POST 请求,如下例所示。

// 处理 GET 请求。
await page.route('**/*', route => {
if (route.request().method() !== 'GET') {
route.fallback();
return;
}
// 仅处理 GET。
// ...
});

// 处理 POST 请求。
await page.route('**/*', route => {
if (route.request().method() !== 'POST') {
route.fallback();
return;
}
// 仅处理 POST。
// ...
});

也可以在回退到后续处理程序时修改请求,这样中间路由处理程序可以修改请求的 url、method、headers 和 postData。

await page.route('**/*', (route, request) => {
// 覆盖标头
const headers = {
...request.headers(),
foo: 'foo-value', // 设置 "foo" 标头
bar: undefined, // 删除 "bar" 标头
};
route.fallback({headers});
});

route.fulfill([options])

Added in: v1.8
  • options? <Object>
    • body? <string|Buffer> 响应体。#
    • contentType? <string> 若设置,相当于设置响应头 Content-Type#
    • headers? <Object<string, string>> 响应头部。所有头部值会被转换为字符串。#
    • path? <string> 用于响应的文件路径。内容类型将根据文件扩展名推断。如果 path 是相对路径,则会基于当前工作目录进行解析。#
    • response? <APIResponse> 用于 fulfill 路由请求的 APIResponse 对象。响应的单独字段(如 headers)可通过 fulfill 选项覆盖。新增于:v1.15#
    • status? <number> 响应状态码,默认为 200#
  • returns: <Promise<void>>#

使用指定的响应 fulfill 当前路由的请求。

以下是一个将所有请求都以 404 响应 fulfill 的示例:

await page.route('**/*', route => {
route.fulfill({
status: 404,
contentType: 'text/plain',
body: 'Not Found!'
});
});

提供静态文件的示例:

await page.route('**/xhr_endpoint', route => route.fulfill({ path: 'mock_data.json' }));

route.request()

Added in: v1.8

要路由的请求。