我需要拦截网络请求并将其响应主体保存到变量中,这样我就可以使用用户界面上显示的值执行断言,但是当我尝试访问应该包含已保存响应主体的变量时,我收到 [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]
我会使用
waitForResponse
来返回与谓词匹配的 response
。谓词应返回 true
或 false
。一旦,然后你评估响应:
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();
page.on
设置 'response'
类型的事件由从第一行开始设置的箭头函数处理
: async response => {...
.
当我们设置一个像这样的事件时,我们会得到输出,但输出不是响应本身。如果您想打印整个响应,您应该在返回之前在箭头函数内执行此操作:
...
console.log(JSON.stringify(response);
return await response.body();
Nit:返回时无需
await
,最后一行可以重写为:
return response.body();