Puppeteer中正确处理CDP会话分离与页面关闭
2025-04-28 01:07:35作者:傅爽业Veleda
在使用Puppeteer进行自动化测试或网页爬取时,开发者经常会遇到需要同时使用CDP(Chrome DevTools Protocol)会话和页面操作的情况。一个常见的场景是在执行完CDP命令后需要关闭页面,但如果不正确处理会话分离,就会导致程序崩溃。
问题现象
当开发者尝试在Puppeteer中同时使用CDP会话和页面关闭操作时,可能会遇到两种典型的错误:
TargetCloseError: Protocol error (Input.synthesizeScrollGesture): Target closedTargetCloseError: Protocol error (Network.getCookies): Session closed. Most likely the page has been closed
这些错误表明在CDP会话仍在活动时,页面被关闭了,导致会话中断。
根本原因
Puppeteer中的CDP会话与页面对象是紧密关联的。当页面被关闭时,所有与之关联的CDP会话也会被强制终止。如果在会话终止后仍有未完成的CDP命令,就会抛出上述错误。
解决方案
要正确处理这种情况,开发者应该在关闭页面前显式地分离(detach)CDP会话。Puppeteer提供了CDPSession.detach()方法来实现这一点。
以下是正确的使用模式:
const session = await page.target().createCDPSession();
try {
await session.send('Input.synthesizeScrollGesture', {
x: 100,
y: 200,
yDistance: -400,
speed: 500,
});
} finally {
await session.detach();
await page.close();
}
最佳实践
- 总是使用try-finally块:确保在任何情况下都能正确清理资源
- 分离会话后再关闭页面:确保会话完全分离后再执行页面关闭操作
- 错误处理:考虑添加适当的错误处理逻辑,特别是对于长时间运行的CDP命令
深入理解
CDP会话实际上是浏览器和客户端之间的一个通信通道。当页面关闭时,浏览器会自动清理所有相关资源,包括这些会话。通过显式调用detach()方法,我们主动通知浏览器我们不再需要这个会话,从而避免意外的连接中断。
这种方法不仅适用于滚动操作,也适用于任何通过CDP协议执行的操作,如网络请求拦截、Cookie管理等。遵循这种模式可以确保Puppeteer脚本的稳定性和可靠性。
登录后查看全文
热门项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0172
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook098
Step-3.7-FlashStep-3.7-Flash是一个拥有 1980 亿参数的稀疏混合专家(MoE)视觉语言模型,由 1960 亿参数的语言主干网络和 18 亿参数的视觉编码器组合而成,具备原生图像理解能力。Python00
BitCPM-CANN-8BBitCPM-CANN 是首个基于华为昇腾 NPU 原生构建的端到端 1.58 位(三值化)大语言模型训练系统。该系统将量化感知训练(QAT)集成到 Megatron-LM 框架中,并结合 MindSpeed 加速,覆盖了从自定义三值算子到基于昇腾 910B 的分布式并行训练的完整训练栈。Python00
MiniCPM5-1BMiniCPM5-1B,这是 MiniCPM5 系列的首款模型。它是一个专为端侧、本地部署和资源受限场景打造的 10 亿参数密集型 Transformer 模型,达到了 10 亿参数级开源模型的 SOTA 水平Jinja00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0239
项目优选
收起
暂无描述
Dockerfile
750
4.87 K
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
841
1.84 K
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
642
1.28 K
Ascend Extension for PyTorch
Python
689
834
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
451
419
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.02 K
1.04 K
Claude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed.
Get Started
Rust
1.59 K
172
CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。
Python
956
561
昇腾LLM分布式训练框架
Python
173
212
暂无简介
Dart
998
259