拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Puppeteer ConsoleMessage.type() 详解:识别与分流浏览器控制台 21 种消息类型

Puppeteer ConsoleMessage.type() 详解识别与分流浏览器控制台 21 种消息类型【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteerConsoleMessage.type()是 Puppeteer 控制台中最常被用到、却最少被文档展开的 API 之一。当你通过page.on(console, ...)捕获页面日志时type()返回的字符串决定了这条消息应该被当作普通日志警告断言失败还是性能采样来处理。本文基于当前仓库的 API 文档与 ConsoleMessage 源码实现完整梳理type()的签名语义、ConsoleMessageType的 21 种取值、CDP 协议到 API 的类型转换链路以及结合 测试用例 给出的可复制实战代码。方法签名与返回类型官方 API 文档docs/api/puppeteer.consolemessage.type.md对ConsoleMessage.type()的定义如下class ConsoleMessage { type(): ConsoleMessageType; }Returns:ConsoleMessageType —— 即控制台消息的类型。ConsoleMessage对象由Page以及WebWorker通过console事件派发出站类本身在 docs/api/puppeteer.consolemessage.md 中有完整定义。需要强调的是文档中的 Remarks 约束构造函数被标记为 internal第三方代码不应直接调用构造函数也不应创建继承自ConsoleMessage的子类——你只能通过事件回调拿到实例而不能自行 new 一个出来。这一约束在源码中同样成立ConsoleMessage 类定义 的constructor带有internal标记而type()、text()、args()、location()、stackTrace()等访问器是public面。完整的 ConsoleMessageType 取值集合type()的返回值不是任意字符串而是一个固定的联合类型。源码中的定义与 docs/api/puppeteer.consolemessagetype.md 完全一致包含 21 个字面量export type ConsoleMessageType | log | debug | info | error | warn | dir | dirxml | table | trace | clear | startGroup | startGroupCollapsed | endGroup | assert | profile | profileEnd | count | timeEnd | verbose;这些取值与浏览器原生console对象的方法名一一对应console.log→log、console.warn→warn…但有几个值得注意的点类别取值说明常规输出log/debug/info/error/warn/verbose与console.*方法同名warn是 Puppeteer 侧统一后的命名见下文 CDP 转换结构化输出dir/dirxml/table对象检视、XML 检视、表格输出分组与断言startGroup/startGroupCollapsed/endGroup/assert对应console.group系列与console.assert做日志分组或断言告警时可用于识别计时与计数trace/count/timeEndconsole.trace、console.count、console.timeEnd性能分析profile/profileEnd对应console.profile/console.profileEnd清屏clearconsole.clear在自动化采集场景中type()是最有价值的分流字段例如把error与assert汇入错误监控把trace保留完整调用栈把clear、startGroup这类控制型消息直接丢弃。源码级实现type 字段如何被固化查看 ConsoleMessage 类type是实例私有字段在构造时一次性写入type()只是无副作用的读取器// packages/puppeteer-core/src/common/ConsoleMessage.ts export class ConsoleMessage { #type: ConsoleMessageType; #text: string; #args: JSHandle[]; #stackTraceLocations: ConsoleMessageLocation[]; #frame?: Frame; #rawStackTrace?: Protocol.Runtime.StackTrace; #targetId?: string; /** * internal */ constructor( type: ConsoleMessageType, text: string, args: JSHandle[], stackTraceLocations: ConsoleMessageLocation[], frame?: Frame, rawStackTrace?: Protocol.Runtime.StackTrace, targetId?: string, ) { /* ... */ } /** * The type of the console message. */ type(): ConsoleMessageType { return this.#type; } }从源码结构可以看出三个设计细节只读快照语义#type一经写入不可变type()保证在事件处理期间始终返回消息产生时的类型不会受后续页面状态影响与位置信息的分层#stackTraceLocations存完整调用栈location()返回栈顶第一个位置当没有栈信息时会回退到消息来源 frame 的 URL见 location() 实现。type()与location()组合即可回答什么类型的消息、发生在哪个文件哪一行双通道兼容构造参数中同时保留了 CDP 的rawStackTrace与 BiDi 场景下的targetId从参数设计可以推断该类是 CDP 与 WebDriver BiDi 两种传输协议的共同数据模型。BiDi 一侧的 bidi/util.ts 中同样存在event.type console的事件识别逻辑说明两条通道最终都会汇聚到同一个ConsoleMessage抽象。CDP 通道从 Runtime.consoleAPICalled 到 type()在 CDP 架构下type()返回的字符串并非原样透传而是经过一层显式的规范化。核心链路在 packages/puppeteer-core/src/cdp/utils.ts第一步构造消息对象createConsoleMessage。页面每调用一次console.*浏览器会推送一个Runtime.consoleAPICalled协议事件puppeteer-core 将其转换为ConsoleMessageexport function createConsoleMessage( event: Protocol.Runtime.ConsoleAPICalledEvent, values: JSHandle[], targetId?: string, ): ConsoleMessage { const textTokens []; for (const arg of values) { textTokens.push(valueFromJSHandle(arg)); } const stackTraceLocations []; if (event.stackTrace) { for (const callFrame of event.stackTrace.callFrames) { stackTraceLocations.push({ url: callFrame.url, lineNumber: callFrame.lineNumber, columnNumber: callFrame.columnNumber, }); } } return new ConsoleMessage( convertConsoleMessageLevel(event.type), // ← type() 的数据来源 textTokens.join( ), // ← text() 的数据来源 values, // ← args() 的数据来源 stackTraceLocations, undefined, event.stackTrace, targetId, ); }第二步类型归一化convertConsoleMessageLevelexport function convertConsoleMessageLevel(method: string): ConsoleMessageType { switch (method) { case warning: return warn; default: return method as ConsoleMessageType; } }这里隐藏了一个容易踩坑的细节CDP 协议层的警告类型是warning而 Puppeteer 对外统一暴露为warn。所以你在事件回调里写的判断条件必须是message.type() warn而不是warning。除了这一处重命名外其余类型值log、error、trace、dir、assert…按协议原值透传。同一条链路也解释了text()的构成各实参通过valueFromJSHandle序列化为文本 token 后以空格连接对象参数会得到[object Object]CDP或JSHandleobjectBiDi这类表示——这一点在测试中也被明确覆盖见下文。实战按 type() 分流页面控制台输出console事件在 Page 类 与 WebWorker 类 中注册为Console console。下面给出一个可直接运行的类型分流示例import puppeteer from puppeteer; const browser await puppeteer.launch(); const page await browser.newPage(); page.on(console, message { switch (message.type()) { case error: case assert: // 错误与断言失败记录来源位置便于定位 console.error([page] ${message.text()} ${JSON.stringify(message.location())}); break; case warn: // 注意判断 warnCDP 原始的 warning 已被 convertConsoleMessageLevel 归一化 console.warn([warn] ${message.text()}); break; case clear: case startGroup: case endGroup: // 分组/清屏是控制台 UI 语义采集时直接忽略 break; default: console.log([${message.type()}] ${message.text()}); } }); await page.setContent(script console.log(hello, 5, {foo: bar}); console.warn(a warning); console.error(something failed); console.assert(1 1 3, math is broken); /script); await browser.close();几点说明通过message.args()拿到的每个实参都是JSHandle可以进一步await args[i].jsonValue()还原为真实值console.log(hello, 5, {foo:bar})的三个实参可分别还原为hello、5、{foo:bar}Worker 内的console.*同样触发Worker的console事件type()语义一致页面在导航后脚本立即输出的日志也能被捕获见 console.test.ts 中的 data URL 用例。测试用例中的类型断言仓库测试对type()的取值做了系统验证可直接作为各类型映射的权威对照表test/src/console.test.tsconsole.log→logL28、console.trace→traceL83、console.dir→dirL96、console.warn→warnL109、console.error→errorL122test/src/worker.test.ts对 Web Worker 中的console.*做了完全同构的一组断言log/trace/dir/warn/error证明两种事件源共享同一套ConsoleMessageType语义test/src/page.test.ts 中也有以message.type() warn作为过滤条件的真实使用示范。小结ConsoleMessage.type()返回 ConsoleMessageType是一个 21 个取值的封闭联合类型与浏览器console.*方法名对应源码保证type在消息构造时固化ConsoleMessage.ts事件回调期间读取稳定可靠CDP 通道中唯一的重命名是warning→warncdp/utils.ts编写过滤逻辑时以warn为准构造函数为internalConsoleMessage实例只能由console事件产生type()、text()、args()、location()组合使用即可完成类型 内容 位置的完整日志分析。【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门