【问题标题】:How to save requests' response body using Playwright?如何使用 Playwright 保存请求的响应正文?
【发布时间】:2021-08-03 17:04:12
【问题描述】:

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

【问题讨论】:

    标签: javascript automated-tests e2e-testing webautomation playwright


    【解决方案1】:

    我会使用waitForResponse,它将返回与谓词匹配的response。谓词应返回truefalse。一旦然后你评估响应:

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

    【讨论】:

    • 很难按照评论中的代码进行操作。你想完成什么?
    • 没关系,我通过阅读您对另一个问题 stackoverflow.com/a/67020417/11540378 的回答解决了这个问题,非常感谢您的帮助
    【解决方案2】:

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

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

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

    尼特:返回时无需await,最后一行可以改写为:

    return response.body();
    

    【讨论】:

    • 感谢您的建议但是有没有办法在箭头函数之外访问响应体?
    • @VladimirKrygin 不在此处,因为此代码在输入请求之前执行...
    猜你喜欢
    • 2021-06-21
    • 2017-02-21
    • 2022-07-25
    • 2015-09-16
    • 2017-06-26
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多