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)

逐行解释:

  1. 开启对目标接口"port"的捕捉
  2. 某个跳转过程(要确定在这个过程中会触发对接口"port"的请求)
  3. 获取该请求的响应对象
  4. 等待该响应完成
  5. 解析该响应,获取你的需要

如此运行了半个小时,对比page.on监听器的方法,再没有见一个playwright抛出的异常~

posted @ 2023-08-30 17:50  anyiya  阅读(406)  评论(0编辑  收藏  举报