惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
MongoDB | Blog
MongoDB | Blog
L
LangChain Blog
WordPress大学
WordPress大学
小众软件
小众软件
IT之家
IT之家
腾讯CDC
月光博客
月光博客
量子位
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

晚花行乐

马克卡尼在2026年达沃斯论坛上的讲话(阅读材料) | 晚花行乐 鸡娃如何用力才是恰到好处 | 晚花行乐 读万卷书,行万里路的辩证关系 | 晚花行乐 反对培训机构掐尖招生 | 晚花行乐 小泽和建国会谈最后10分钟全文(阅读材料) | 晚花行乐 来看看 DeepSeek 怎么鸡娃 | 晚花行乐 谈谈基本功 | 晚花行乐 惠普 ProDesk SFF PC 各系列参数对比 | 晚花行乐 解决瘦客户机上安装 Debian 12 启动失败问题 | 晚花行乐 意拾喻言:老外写的文言文 | 晚花行乐 笠翁对韵中的典故(十三元) | 晚花行乐 谈谈中考取消四小门 | 晚花行乐 亚马逊云科技产品免费试用攻略(3) - 对象存储服务 | 晚花行乐 在 Windows 10 LTSC 版本上安装 WSL2 | 晚花行乐 Debian 12 的常用配置项 | 晚花行乐 在 Debian 12 上安装 Nvidia 显卡驱动程序 | 晚花行乐 解决 Debian 12 关机失败问题 | 晚花行乐 解决 VS Code 自动更新版本后卡在连接界面 | 晚花行乐 观看巴黎奥运会有感 | 晚花行乐 在 Windows10 上安装惠普旧打印机驱动程序 | 晚花行乐 欢迎关注公众号:晚花行乐 | 晚花行乐 如何编写拼写检查器 | 晚花行乐 亚马逊云科技产品免费试用攻略(2) - 云服务器 | 晚花行乐 Pandas 中 axis 参数的理解(附实例) | 晚花行乐 我打算命个名,叫什么什么 Manager | 晚花行乐 上海武康路历史建筑一览 | 晚花行乐 Python 实现简单的数学表达式解析并处理 | 晚花行乐 观看马拉松的感悟 | 晚花行乐 Python 保存 Cookies 到文件并再次读取 | 晚花行乐 如何为 Hugo 静态网站添加评论功能 | 晚花行乐
Puppeteer 获取 http 请求的响应 | 晚花行乐
2019-05-19 · via 晚花行乐

页面收到的 HTTP 响应,用 Chrome 的开发者工具 DevTool 很容易能看到,但是如何以运行程序的方法,从 Chrome 中取得呢?本文讨论一种可行的方法。

基本原理

页面实体 Page,收到响应后,会触发 ‘reponse’ 事件,并且得到 响应实体 response,里面包含各类响应信息。

处理事件

下面这段代码可以将页面接收到的响应信息打印出来:

// 打开浏览器,打开新页面
browser = await puppeteer.launch()
page = await browser.newPage()


// 订阅 reponse 事件,参数是一个 reponse 实体
page.on('response', 
    function (response){
        console.log(response.url())
    }
})

// 开始浏览
await page.goto(url)

上面的代码将每条响应的URL地址打印出来

响应的其他属性

响应的信息,可以从 response 实体提供的各类方法得到,比如

page.on('response', 
    function (response){
        console.log(response.url())  //显示响应的 URL,字符串
        console.log(response.headers())  //显示响应的header对象
        console.log(response.text())  //显示响应的body,Promise
        console.log(response.status())  //显示响应的状态码,数值型
        console.log(response.ok())  //显示响应是否成功,布尔值
        console.log(response.request())  //显示响应对应的 request 对象
    }
})

响应的body

这里详细讨论如何获取 响应的 body. 从 上节 看出, response.text() 可以返回响应的body,但仅仅返回一个 Promise ,还需要稍微处理才能真正得到响应的内容。

基本用法

page.on('response', 
    function (response){
        response.text().then((body)=>{
            console.log(body)
        })
    }
})

Promise 化

将上面的基本用法,包一层 Promise 后,可以用 await 方便的得到响应的body,具体来说,首先准备如下的函数:

function getResponseBody(resolve, reject){
    page.on('response', async function(response){
        resolve(await response.text())
    })
}

然后在测试用例里可以像下面这么写:

describe('获取响应', function() {
    it('检查响应 body 中的值', async function(){
         //其他语句

         waitForResponse = new Promise(getResponseBody)
         await page.goto(url, {waitUntil: 'networkidle0'})
         response = await waitForResponse 
         expect(response).to.equal(someValue)
     })
})

这样,测试用例就可以写的很简洁、易读。

过滤响应

上节的方法 中使用的Promise 在第一条响应产生后立即resolve,但是我们往往只关心我们期待的某一条响应,所以需要结合 reponse 的其他方法,达到过滤响应的目的。

比如,我们希望过滤从 /some/api 返回的响应,那么上面的 getResponseBody 函数可以这么写:

function getResponseBody(resolve, reject){
    page.on('response', async function(response){
         if(response.url().includes('/some/api')){
              resolve(await response.text())
         }
    })
}

WebSocket 响应

除了 HTTP 响应以外,如何获取 WebSocket 响应的方法,见 Puppeteer 获取 WebSocket 响应 一文

各位读后有什么想法,请在下方留言吧!如果对本文有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

精彩评论