Request
当页面向网络资源发起请求时,Page 会按以下顺序触发事件:
- page.on("request"):请求刚被发送时触发。
- page.on("response"):收到该请求的响应头时触发(如果有响应)。
- page.on("requestfinished"):响应体下载完成、请求生命周期结束时触发。
如果请求过程中发生失败,将不会触发 'requestfinished'(以及可能出现的 response),取而代之的是 page.on("requestfailed")。
即使是 404、503 等 HTTP 错误状态,按照协议仍然属于成功响应,因此仍会触发 'requestfinished'。
若请求收到重定向响应,则当前请求会以 'requestfinished' 结束,随后浏览器会根据重定向 URL 发起新的请求。
- request.all_headers()
- request.failure
- request.frame
- request.header_value(name)
- request.headers
- request.headers_array()
- request.is_navigation_request()
- request.method
- request.post_data
- request.post_data_buffer
- request.post_data_json
- request.redirected_from
- request.redirected_to
- request.resource_type
- request.response()
- request.sizes()
- request.timing
- request.url
request.all_headers()
Added in: v1.15返回包含该请求所有 HTTP 头的字典,头名统一为小写。
request.failure
Added in: v1.8如果请求失败(通过 requestfailed 事件报告),返回失败原因,否则为 None。
记录所有失败请求的示例:
page.on("requestfailed", lambda request: print(request.url + " " + request.failure))
request.frame
Added in: v1.8返回发起此请求的 Frame。
request.header_value(name)
Added in: v1.15返回名称匹配的头值,名称不区分大小写。
request.headers
Added in: v1.8返回请求头字典,头名小写。该方法不会返回安全相关头(例如 cookie),如需完整列表请使用 request.all_headers()。
request.headers_array()
Added in: v1.15以数组形式返回该请求的全部 HTTP 头。与 request.all_headers() 不同,该方法保留原始大小写。对于 Set-Cookie 等多值头,会有多条记录。
request.is_navigation_request()
Added in: v1.8指示该请求是否导致所属 frame 导航。
request.method
Added in: v1.8请求方法(如 GET、POST)。
request.post_data
Added in: v1.8请求的 POST 正文内容(如果存在)。
request.post_data_buffer
Added in: v1.8以二进制形式返回 POST 正文(如果存在)。
request.post_data_json
Added in: v1.8- 返回值: <NoneType|Serializable>#
解析 application/x-www-form-urlencoded 或 JSON 请求体并返回结构化结果(如果存在)。对表单类型返回键值对对象,否则尝试解析为 JSON。
request.redirected_from
Added in: v1.8返回被服务器重定向到当前请求的上一跳请求(如果存在)。
当服务器返回重定向响应时,Playwright 会创建新的 Request 对象。两个请求可通过 redirectedFrom() / redirectedTo() 相互关联。若发生多次重定向,可多次调用 redirectedFrom() 追溯完整链路。
例如 http://example.com 重定向到 https://example.com:
- Sync
- Async
response = page.goto("http://example.com")
print(response.request.redirected_from.url) # "http://example.com"
response = await page.goto("http://example.com")
print(response.request.redirected_from.url) # "http://example.com"
若 https://google.com 没有发生重定向:
- Sync
- Async
response = page.goto("https://google.com")
print(response.request.redirected_from) # None
response = await page.goto("https://google.com")
print(response.request.redirected_from) # None
request.redirected_to
Added in: v1.8服务器返回重定向响应时,浏览器接着发送的下一跳请求。与 request.redirected_from 成对出现:
assert request.redirected_from.redirected_to == request
request.resource_type
Added in: v1.8返回渲染引擎识别的资源类型,可能为 document、stylesheet、image、media、font、script、texttrack、xhr、fetch、eventsource、websocket、manifest 或 other。
request.response()
Added in: v1.8返回匹配的 Response,如果由于错误未收到响应则为 None。
request.sizes()
Added in: v1.15返回该请求的资源体积信息。
request.timing
Added in: v1.8- 返回值: <Dict>#
startTime<float> 请求开始的 Unix 时间(秒)。domainLookupStart<float> 浏览器开始 DNS 查询的相对秒数,不可用则为 -1。domainLookupEnd<float> 浏览器完成 DNS 查询的相对秒数,不可用为 -1。connectStart<float> 浏览器开始与服务器建立连接前的相对秒数,不可用为 -1。secureConnectionStart<float> 浏览器开始 TLS 握手的相对秒数,不可用为 -1。connectEnd<float> 浏览器完成连接建立后的相对秒数,不可用为 -1。requestStart<float> 浏览器开始向服务器或缓存发起请求的相对秒数,不可用为 -1。responseStart<float> 浏览器开始接收响应的相对秒数,不可用为 -1。responseEnd<float> 浏览器接收最后一个字节或即将关闭连接时的相对秒数,不可用为 -1。
返回请求的时间线信息。大部分字段在收到响应后可用,responseEnd 在请求结束后出现。更多细节可参考 Resource Timing API。
- Sync
- Async
with page.expect_event("requestfinished") as request_info:
page.goto("http://example.com")
request = request_info.value
print(request.timing)
async with page.expect_event("requestfinished") as request_info:
await page.goto("http://example.com")
request = await request_info.value
print(request.timing)
request.url
Added in: v1.8返回请求的 URL。