如何使用 Playwright 保存请求的响应正文?

问题描述 投票:0回答:3

我需要拦截网络请求并将其响应主体保存到变量中,这样我就可以使用用户界面上显示的值执行断言,但是当我尝试访问应该包含已保存响应主体的变量时,我收到 [object Object]而不是一个有效的身体。

JSON.stringify 也不能解决问题,因为我的变量变成了

{"_type":"Page","_guid":"page@"}
而不是实际的响应。

这是代码:

const resp = await page.on('response', async response => {
  if (response.url().includes('/some_url/') && response.status() === 200) {
    console.log('BODY() ' + (await response.body())); //logs valid JSON response body
    return await response.body();
  }
})
console.log('RESPONSE' + resp); //logs RESPONSE[object Object]
javascript automated-tests e2e-testing webautomation playwright
3个回答
16
投票

我会使用

waitForResponse
来返回与谓词匹配的
response
。谓词应返回
true
false
。一旦,然后你评估响应:

const response = await page.waitForResponse(response => response.url().includes('/some_url/') && response.status() === 200);
console.log('RESPONSE ' + (await response.body()));

1
投票

我问这个问题已经快一年了。 还有另一种使用异步谓词函数保存响应的方法(对于只有一个端点的 graphql 特别有用)

    const [response] = await Promise.all([
        page.waitForResponse(async response => {
            const text = await response.text();
            return text.includes(`some response text, that we need to intercept`);
        })
    ]);
    return response.json();

https://github.com/microsoft/playwright/issues/4535


0
投票

page.on
设置
'response'
类型的事件由从第一行开始设置的箭头函数处理 :
async response => {...
.

当我们设置一个像这样的事件时,我们会得到输出,但输出不是响应本身。如果您想打印整个响应,您应该在返回之前在箭头函数内执行此操作:

    ...
    console.log(JSON.stringify(response);
    return await response.body();

Nit:返回时无需

await
,最后一行可以重写为:

    return response.body();
© www.soinside.com 2019 - 2024. All rights reserved.