跳到主要内容

Route

当通过 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) => {
// 覆盖请求头
const headers = {
...request.headers(),
foo: 'foo-value', // 设置 "foo" 请求头
bar: undefined, // 移除 "bar" 请求头
};
await route.continue({ headers });
});

参数

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

      如果设置,将修改请求的 HTTP 头。头值会被转换为字符串。

    • method string (可选)#

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

    • postData string | Buffer | Serializable (可选)#

      如果设置,将修改请求的 post 数据。

    • url string (可选)#

      如果设置,将修改请求 URL。新 URL 必须与原始 URL 使用相同的协议。

返回

详情

headers 选项会同时应用于路由请求及其引发的任何重定向。但是 urlmethodpostData 仅适用于原始请求,不会传递给重定向请求。

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

注意

无法使用此方法覆盖 Cookie 头。如果提供了值,它将被忽略,cookie 会从浏览器的 cookie 存储中加载。要设置自定义 cookie,请使用 browserContext.addCookies()


fallback

v1.23 版本新增 route.fallback

使用可选覆盖参数继续路由请求。该方法类似于 route.continue(),区别在于在发送请求前会先调用其他匹配的处理程序。

使用场景

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

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

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

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

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

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

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

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

参数

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

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

    • method string (可选)#

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

    • postData string | Buffer | Serializable (可选)#

      如果设置,将更改请求的 post 数据。

    • 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 Object<string, string> (可选)#

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

    • maxRedirects number (可选) 添加于: v1.31#

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

    • maxRetries number (可选) 添加于: v1.46#

      网络错误的最大重试次数。当前仅重试 ECONNRESET 错误。不会基于 HTTP 响应码重试。如果超过限制将抛出错误。默认为 0 - 不重试。

    • method string (可选)#

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

    • postData string | Buffer | Serializable (可选)#

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

    • timeout number (可选) 添加于: v1.33#

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

    • url string (可选)#

      如果设置,将更改请求 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 string | Buffer (可选)#

      响应体。

    • contentType string (可选)#

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

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

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

    • json Serializable (可选) v1.29 版本新增#

      JSON 响应。如果未设置内容类型,此方法会将其设置为 application/json

    • path string (可选)#

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

    • response APIResponse (可选) v1.15 版本新增#

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

    • status number (可选)#

      响应状态码,默认为 200

返回


request

v1.9 之前版本添加 route.request

需要被路由的请求。

用法

route.request();

返回值