如何使用 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 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();
我需要拦截网络请求并将其响应主体保存到变量中,这样我就可以使用显示在 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 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();