playwright-python等待请求响应
需求是:使用playwright打开一个页面,并等待其中某一接口响应。
在看官网提供的 playwright-node.js 文档时很容易的找到了 waitForResponse
// Start waiting for response before clicking. Note no await.
const responsePromise = page.waitForResponse('https://example.com/resource');
await page.getByText('trigger response').click();
const response = await responsePromise;
// Alternative way with a predicate. Note no await.
const responsePromise = page.waitForResponse(response =>
response.url() === 'https://example.com' && response.status() === 200
);
await page.getByText('trigger response').click();
const response = await responsePromise;
这看起来就是我们要的香香,但当想应用进python中时,发现python中并没有这一方法。
仔细翻阅 playwright-python 文档,其中对于等待请求响应的建议是 expect_request
with page.expect_request("http://example.com/resource") as first:
page.get_by_text("trigger request").click()
first_request = first.value
# or with a lambda
with page.expect_request(lambda request: request.url == "http://example.com" and request.method == "get") as second:
page.get_by_text("trigger request").click()
second_request = second.value
这个乍一看也许不太好理解(我才不会承认经验尚浅的我为了从文档中找答案尝试了很久...)
公布答案:
with page.expect_request("port") as res:
page.goto("url") # page.get_by_role("link", name="action").click()
response = res.value.response()
response.finished()
parse(response)
逐行解释:
- 开启对目标接口"port"的捕捉
- 某个跳转过程(要确定在这个过程中会触发对接口"port"的请求)
- 获取该请求的响应对象
- 等待该响应完成
- 解析该响应,获取你的需要
如此运行了半个小时,对比page.on监听器的方法,再没有见一个playwright抛出的异常~