跳至主要内容

路由

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

详细了解 网络


方法

abort

在 v1.9 之前添加 route.abort

中止路由的请求。

用法

await route.abort();
await route.abort(errorCode);

参数

  • 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' - 发生了一般性错误。

返回


continue

在 v1.9 之前添加 route.continue

使用可选的覆盖发送路由的请求到网络。

用法

await page.route('**/*', async (route, request) => {
// Override headers
const headers = {
...request.headers(),
foo: 'foo-value', // set "foo" header
bar: undefined, // remove "bar" header
};
await route.continue({ headers });
});

参数

  • options Object (可选)
    • headers Object<string, string> (可选)#

      如果设置,则更改请求 HTTP 标头。标头值将转换为字符串。

    • method string (可选)#

      如果设置,则更改请求方法(例如 GET 或 POST)。

    • postData string | Buffer | 可序列化 (可选)#

      如果设置,则更改请求的发布数据。

    • url string (可选)#

      如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。

返回

细节

请注意,任何覆盖(例如 urlheaders)仅适用于正在路由的请求。如果此请求导致重定向,覆盖将不会应用于新的重定向请求。如果您想通过重定向传播标头,请使用 route.fetch()route.fulfill() 的组合。

route.continue() 将立即将请求发送到网络,其他匹配的处理程序将不会被调用。如果您想调用链中下一个匹配的处理程序,请使用 route.fallback()


fallback

在 v1.23 中添加 route.fallback

使用可选的覆盖继续路由的请求。该方法类似于 route.continue(),不同之处在于其他匹配的处理程序将在发送请求之前被调用。

用法

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

await page.route('**/*', async route => {
// Runs last.
await route.abort();
});
await page.route('**/*', async route => {
// Runs second.
await route.fallback();
});
await page.route('**/*', async route => {
// Runs first.
await route.fallback();
});

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

// Handle GET requests.
await page.route('**/*', async route => {
if (route.request().method() !== 'GET') {
await route.fallback();
return;
}
// Handling GET only.
// ...
});

// Handle POST requests.
await page.route('**/*', async route => {
if (route.request().method() !== 'POST') {
await route.fallback();
return;
}
// Handling POST only.
// ...
});

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

await page.route('**/*', async (route, request) => {
// Override headers
const headers = {
...request.headers(),
foo: 'foo-value', // set "foo" header
bar: undefined, // remove "bar" header
};
await route.fallback({ headers });
});

使用 route.continue() 立即将请求发送到网络,在这种情况下,其他匹配的处理程序将不会被调用。

参数

  • options Object (可选)
    • headers Object<string, string> (可选)#

      如果设置,则更改请求 HTTP 标头。标头值将转换为字符串。

    • method string (可选)#

      如果设置,则更改请求方法(例如 GET 或 POST)。

    • postData string | Buffer | 可序列化 (可选)#

      如果设置,则更改请求的发布数据。

    • url string (可选)#

      如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。更改 URL 不会影响路由匹配,所有路由都使用原始请求 URL 匹配。

返回


fetch

在 v1.29 中添加 route.fetch

执行请求并获取结果,但不满足结果,以便可以修改响应,然后满足。

用法

await page.route('https://dog.ceo/api/breeds/list/all', async route => {
const response = await route.fetch();
const json = await response.json();
json.message['big_red_dog'] = [];
await route.fulfill({ response, json });
});

参数

  • options Object (可选)
    • headers 对象<字符串, 字符串> (可选)#

      如果设置,则更改请求 HTTP 标头。标头值将转换为字符串。

    • maxRedirects 数字 (可选)新增于:v1.31#

      自动跟随请求重定向的最大次数。如果超过此限制,将抛出错误。默认值为 20。传递 0 表示不跟随重定向。

    • maxRetries 数字 (可选)新增于:v1.46#

      网络错误重试的最大次数。目前仅重试 ECONNRESET 错误。不会根据 HTTP 响应代码进行重试。如果超过限制,将抛出错误。默认值为 0 - 不重试。

    • method 字符串 (可选)#

      如果设置,则更改请求方法(例如 GET 或 POST)。

    • postData 字符串 | 缓冲区 | 可序列化 (可选)#

      允许设置请求的 POST 数据。如果数据参数是对象,它将被序列化为 JSON 字符串,并且 content-type 头部将被设置为 application/json(除非显式设置)。否则,content-type 头部将被设置为 application/octet-stream(除非显式设置)。

    • timeout 数字 (可选)新增于:v1.33#

      请求超时时间(毫秒)。默认值为 30000(30 秒)。传递 0 表示禁用超时。

    • url 字符串 (可选)#

      如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。

返回

细节

请注意,headers 选项将应用于获取的请求以及由其发起的任何重定向。如果您只想将 headers 应用于原始请求,而不应用于重定向,请查看 route.continue()


fulfill

在 v1.9 之前添加 route.fulfill

用给定的响应来满足路由的请求。

用法

用 404 响应来满足所有请求的示例

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

提供静态文件的示例

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

参数

  • options Object (可选)
    • body 字符串 | 缓冲区 (可选)#

      响应主体。

    • contentType 字符串 (可选)#

      如果设置,等同于设置 Content-Type 响应头。

    • headers 对象<字符串, 字符串> (可选)#

      响应头。头值将被转换为字符串。

    • json 可序列化 (可选)在 v1.29 中添加#

      JSON 响应。此方法将内容类型设置为 application/json(除非已设置)。

    • path 字符串 (可选)#

      要响应的文件路径。内容类型将从文件扩展名推断出来。如果 path 是相对路径,则相对于当前工作目录解析。

    • response API 响应 (可选)新增于:v1.15#

      用于满足路由请求的 API 响应。可以使用 fulfill 选项覆盖响应的各个字段(例如头)。

    • status 数字 (可选)#

      响应状态代码,默认值为 200

返回


request

在 v1.9 之前添加 route.request

要路由的请求。

用法

route.request();

返回