如何使用 Playwright 保存请求的响应主体?

How to save requests' response body using Playwright?

我需要拦截网络请求并将其响应主体保存到变量中,这样我就可以使用显示在 UI 上的值执行断言,但是当我尝试访问应该包含已保存的变量时响应主体我收到 [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]

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

当我们设置这样的事件时,我们会得到一个输出,但输出不是响应本身。如果你想打印整个响应,你应该在 return:

之前的箭头函数中进行打印
...
console.log(JSON.stringify(response);
return await response.body();

尼特:return上没必要await,最后一行可以重写为:

return response.body();

我会使用 waitForResponse 来 return response 匹配谓词。谓词应该return truefalse。一旦然后您评估响应:

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

问这个问题已经快一年了。 还有另一种使用异步谓词函数保存响应的方法(对于只有一个端点的 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