尧图精选

Puppeteer CDPSession.id():获取 CDP 会话标识及其底层路由机制解析

🕒 发布时间:2026/9/7 16:22:18 📁 来源:尧图网络
Puppeteer CDPSession.id()获取 CDP 会话标识及其底层路由机制解析【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer本文围绕 Puppeteer 的CDPSession.id()方法展开它返回当前 Chrome DevTools ProtocolCDP会话的唯一会话 IDsession id。这个看似简单的访问器实际上是 Puppeteer 内部消息路由的关键枢纽——所有 CDP 命令都要携带会话 ID 才能被浏览器正确分发。读完本文你将掌握id()的签名与返回值语义并理解它在 CDP 与 BiDi 两种协议实现中分别如何生成、如何被用于send、detach以及它在内部会话-目标session-target映射中的作用。CDPSession 与 CDPSession.id() 的定位CDPSession实例用于直接收发原始的 Chrome DevTools Protocol 消息。协议方法通过CDPSession.send()调用协议事件通过CDPSession.on订阅参见 CDPSession 类文档。id()是该类上的一个只读语义访问器返回当前会话对应的 session id 字符串class CDPSession { abstract id(): string; }Returns:string在 CDP 协议层面浏览器连接上会同时存在多个会话主会话浏览器级 target 的 session以及通过Target.attachToTarget自动附加产生的子会话如页面、worker、Service Worker 各自持有独立的 sessionId。id()返回的正是这条逻辑线路的标识是 Puppeteer 把高层 API 调用映射到底层协议消息、再把事件与响应回投到正确会话对象的依据。抽象层声明id()的声明位于 packages/puppeteer-core/src/api/CDPSession.ts 中的抽象类CDPSession继承自EventEmitterCDPSessionEvents/** * Returns the sessions id. */ abstract id(): string;抽象类同时定义了connection()、detached、send()、detach()等抽象成员并注明构造函数为内部实现第三方代码不应直接实例化或继承该类见 CDPSession.ts。id()与这些成员一样由具体协议实现填充其返回值的生命周期语义何时生成、何时失效取决于实现。CDP 实现会话 ID 的持有与使用CDP 模式下的实现类CdpCDPSession位于 packages/puppeteer-core/src/cdp/CdpSession.ts。会话 ID 以私有字段#sessionId保存由构造函数注入constructor( connection: Connection, targetType: string, sessionId: string, parentSessionId: string | undefined, rawErrors: boolean, logger: Logger, ) { // ... this.#sessionId sessionId; // ... }id()的实现CdpSession.ts即为直接返回该字段override id(): string { return this.#sessionId; }从源码结构看#sessionId在会话存活期间是恒定值id()是纯粹的读取器不存在异步获取的成本。它在会话内部有三处核心用途作为命令路由标识。send()通过this.#connection._rawSend(this.#callbacks, method, params, this.#sessionId, options)把 sessionId 传给底层ConnectionCdpSession.ts对应 Connection._rawSend。若目标不是浏览器级会话Connection会经Target.dispatchMessage按 sessionId 转发命令才能到达正确的渲染进程或 worker。作为分离detach依据。detach()会向Target.detachFromTarget传入sessionId: this.#sessionIdCdpSession.ts即id()的取值可直接用于从协议层解除附加。作为父子会话索引。parentSession()通过this.#parentSessionId调用connection.session(...)查找父会话对象CdpSession.ts构成 CDP auto-attach 机制下的会话树。此外当浏览器返回Session with given id not found错误时send()会捕获该错误、调用onClosed()标记会话已分离并抛出TargetCloseErrorCdpSession.ts——这正是会话 ID 失效这一状态在公开 API 上的表现。BiDi 实现延迟解析的会话 ID在 WebDriver BiDi 模式下CDP 会话由 packages/puppeteer-core/src/bidi/CDPSession.ts 中的BidiCdpSession提供。这里的会话 ID 并非立即确定而是用Deferredstring延迟解析构造时若未显式传入sessionId会异步调用 BiDi 扩展命令goog:cdp.getSession按 frame 的 context 请求解析成功后得到result.session并注册进静态sessions表id()的实现bidi/CDPSession.ts在值尚未解析时返回空字符串override id(): string { const value this.#sessionId.value(); return typeof value string ? value : ; }相应地BiDi 侧的send()会先await this.#sessionId.valueOrThrow()再通过goog:cdp.sendCommand携带 session 标识转发命令detach()使用this.id()的当前值作为Target.detachFromTarget的参数并在onClose时以id()为键从BidiCdpSession.sessions表中清除记录bidi/CDPSession.ts。若浏览器不支持 CDPconnection()返回undefinedsend()会抛出UnsupportedOperation。这一实现细节提示使用者在 BiDi 模式下过早调用id()可能得到空字符串可靠的使用时机是createCDPSession()返回之后Puppeteer 已在内部等待会话就绪。会话 ID 在 Puppeteer 内部的路由作用id()的返回值被广泛用作会话 → 对象的映射键这解释了为何它是消息回投的核心TargetManager.ts 维护#attachedTargetsBySessionId表以session.id()为键登记已附加的 target并在处理Target.detachedFromTarget事件时用事件中的sessionId反查对象TargetManager.tsFrameManager.ts 用${session.id()}:${name}组合作为会话级事件监听的去重键Page.ts 将 worker 会话以session.id()为键存入#workersWebWorker.ts 在转发 worker 侧命令时以sessionId: this.client.id()显式指定目标会话。从源码结构看Puppeteer 内部大多数收到一个裸 sessionId需要找到对应会话或对象的场景都依赖上述以id()为键的注册表——因此对使用者而言id()也是把自定义 CDP 逻辑与 Puppeteer 事件体系对齐的公共入口。实战示例使用 createCDPSession 并结合 id()以下示例继承自 CDPSession 类文档的官方用法并补充了对id()的观察const client await page.createCDPSession(); // 打印会话标识CDP 模式下为浏览器分配的不透明 sessionId console.log(CDP session id:, client.id()); await client.send(Animation.enable); client.on(Animation.animationCreated, () console.log(Animation created!), ); const response await client.send(Animation.getPlaybackRate); console.log(playback rate is response.playbackRate); await client.send(Animation.setPlaybackRate, { playbackRate: response.playbackRate / 2, }); // 分离会话内部即向 Target.detachFromTarget 传入 id() 的取值 await client.detach(); console.log(detached:, client.detached);createCDPSession()的声明见 Page.tsCDPSession.id()自身的参考页见 docs/api/puppeteer.cdpsession.id.md相关成员文档还包括 send()、detach() 与 connection()。小结CDPSession.id(): string返回当前 CDP 会话的唯一标识签名与返回值语义定义于 docs/api/puppeteer.cdpsession.id.mdCDP 实现中它是构造期注入的常量CdpSession.ts支撑send命令路由、detach分离请求与父子会话索引BiDi 实现中它由goog:cdp.getSession延迟解析bidi/CDPSession.ts解析前返回空字符串内部通过TargetManager、FrameManager、Page、WebWorker等处以id()为键维护会话-对象映射使协议事件能够回投到正确的会话实例。【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →