Chrome DevTools 协议如何工作?CDP 详解

Chrome DevTools 协议如何工作?

Scrapeless Agent Browser 暴露云端浏览器会话,自动化客户端可以通过 Chrome DevTools 协议来控制这些会话。

什么是 Chrome DevTools 协议?

Chrome DevTools 协议(CDP)是一个用于检查、调试和控制基于 Chromium 的浏览器的结构化接口。客户端向浏览器目标发送命令并接收响应和事件。Chrome 自身的 DevTools 前端使用这个接口来提供浏览器调试功能。

该 Chrome DevTools 协议定义 将能力组织成 Page、Network、Runtime 和 Target 等域。每个域定义方法、事件以及相关的数据类型。自动化库可以将这些细节封装在更高级别的 API 中。

CDP 是一种浏览器控制协议,而不是页面的公共 Web API。普通站点脚本在 Web 安全边界之内运行。调试客户端可以获得更广泛的检查和控制能力,这使得连接端点具有敏感性。

总结

  • CDP 交换命令、响应和事件。 命令和异步浏览器观测具有不同的角色。
  • 目标标识客户端所控制的对象。 浏览器级别控制与特定页面会话是不同的作用域。
  • 浏览器里程碑并不保证应用已就绪。 自动化仍然必须检查所需内容。
  • 调试端点是特权接口。 限制访问并保护会话凭证。

CDP 连接是如何开始的?

CDP 连接开始于客户端获得一个由兼容浏览器或浏览器服务暴露的调试传输通道的访问权。远程浏览器服务通常提供一个 WebSocket 端点。本地调试也可能涉及发现元数据以及其他受支持的传输方式。

WebSocket 在已建立的连接之上传输消息。 WebSocket 标准 描述了传输接口,而 CDP 定义了在所选传输之上传递的浏览器控制消息。一个可达的 socket 本身并不能表明客户端已附加到预期的页面。

本地调试发现机制可以暴露浏览器级端点以及关于页面目标的信息。托管浏览器服务可能会直接分配一个会话,并通过不同的生命周期返回其端点。遵循服务当前的连接约定,而不是假定每个提供方都暴露本地发现路径。

身份验证和端点生命周期是围绕协议的部署关注点。浏览器服务可以要求凭证并施加会话限制。将携带凭证的端点视为敏感信息,即使它出现在查询字符串中也是如此。避免在共享的日志或截图中打印它。

命令和响应如何匹配?

命令和响应通过相关连接上下文中的请求标识符进行匹配。命令指定一个方法名,在需要时提供参数,并携带一个标识符。响应会引用该标识符,并包含结果或错误。

标识符允许客户端跟踪多个未完成操作。响应不必是接收到的下一条消息,因为浏览器可以在命令响应之间发出事件。客户端应当依据消息结构和标识符来路由消息,而不是依赖简单的消息顺序。

方法名称由域和操作组合而成。例如,Page.navigate 属于页面导航,Runtime.evaluate 属于 JavaScript 求值。提到这些方法是为了说明接口;完整的实现还需要为其浏览器版本提供正确的目标作用域、参数、生命周期和错误处理。

命令成功具有特定含义。导航命令被接受并不代表商品列表已经加载完成。一次 JavaScript 求值完成并不代表提取出的对象满足你的业务模式。将协议层面的成功与应用层面的成功分开看待。

什么是 CDP 事件?

CDP 事件是关于浏览器活动的异步通知。它们可以描述导航、网络活动、目标变化或已启用域和附加会话中的其他观测。

客户端通过其库订阅事件或自行路由传入的事件消息。有些域在其观测被投递之前需要显式启用。在开始你想要观测的活动之前注册所需的监听器,否则客户端可能会错过解释结果的那个事件。

事件是有用的证据,但需要上下文。页面可能会生成许多与主文档无关的网络请求。子框架可以独立于顶层页面进行导航。在协议提供的地方,将观测与其 frame、request、target 或 session 标识符关联起来。

不要把“连接变得安静”定义为所有应用的内容就绪。分析或流式活动可能会在有用内容出现之后继续进行。相反,一个安静的连接也可能对应一个空白页面。确认任务真正需要的元素和字段。

目标、会话和框架

目标、会话和框架描述了调试模型中的不同部分。目标是可检查的浏览器实体,会话是附加上下文,框架是页面文档结构的一部分。

概念角色常见误解
浏览器目标浏览器级调试上下文认为每个命令都作用于可见标签页
页面目标可检查的页面上下文将标签页标题误认为是稳定的目标标识
会话用于路由命令和事件的附加上下文通过错误的作用域发送页面命令
框架页面内的文档上下文当内容位于框架内时从主文档中提取

新的标签页、工作线程和跨进程文档行为可能需要额外的目标处理。更高层的库会处理大量这类生命周期管理,这也是应用程序代码通常使用浏览器自动化 API 而不是自行实现原始传输层的原因之一。

自动化库能带来什么?

一个自动化库在浏览器控制之上增加了生命周期管理和面向任务的抽象。它可以跟踪页面、等待特定条件、定位元素,并将结果关联到编程语言对象。

这种抽象并不会让每一种浏览器协议都变得完全相同。CDP 与 Chromium 浏览器控制相关,而其他自动化标准和库传输方式则有不同的适用范围。库的原生连接所提供的行为,可能会与通过兼容性接口进行连接时有所不同。

根据所需的操作和受支持的浏览器环境选择接口。对于普通页面交互,一个维护良好的库可以减少你需要维护的目标和消息路由代码量。对于仅通过某个协议域暴露的诊断特性,使用作用域限定的 CDP 会话可能更为合适。

保持对版本的预期明确。tip-of-tree 协议可能会发生变化,并且不保证与每个已安装的浏览器兼容。为实现可复现的自动化,应固定一个合适的环境,并在依赖某个实验性方法之前,检查该环境所支持的协议。

为什么远程调试的安全性很重要?

远程调试的安全性之所以重要,是因为已连接的客户端可以对浏览器会话及其可访问状态获得相当大的控制权。该端点应被保护为一个特权控制界面。

Chrome 的 远程调试安全性变更 解决在日常配置档中使用除错开关所带来的风险。请使用专用的自动化配置档,并遵循当前浏览器的要求。包含个人浏览记录的配置档并不适合用于共享的除错工作流程。

对于本地工作,将侦听器限制在预期的本地边界内,并避免通过不受限制的网络路径对其进行暴露。对于托管服务,使用其经过身份验证的会话机制并保护 API 凭据。网络可达性是需要加以控制的访问条件,而不是为了方便而广泛启用的功能。

清理诊断工件。控制台消息、屏幕截图、网络捕获以及已评估的页面对象可能包含账户数据。仅保留调查任务所必需的内容,并对这些工件应用适当的保留策略。

CDP 如何与代理浏览器协同工作?

CDP 为自动化客户端提供了一个控制通道,用于连接到代理浏览器会话。云浏览器负责执行页面,而客户端则发送操作并接收观测结果。

该 Scrapeless 代理浏览器产品 公开一个兼容 CDP 的连接界面。 代理浏览器开发者工具界面 描述了在受管浏览器上下文中对控制台、网络和文档元素的检查。这些视图有助于区分控制连接问题和页面内容问题。

一个实用的诊断顺序遵循这些边界:先确认会话分配,然后是连接,再然后是预期的页面目标,接着是导航,最后是内容需求。如果客户端连接成功但页面是登录屏幕,那么问题就不再是基础的 CDP 传输。

使用当前 无爬取方案定价 用于规划和衡量你的任务所需的实际浏览器生命周期。相关说明 Chrome 远程调试 涵盖本地和远程上下文;当前服务文档管理托管连接参数。

结论

CDP 通过在客户端和可检查的浏览器目标之间路由结构化命令和事件来工作。理解标识符、目标作用域以及异步活动有助于更容易定位故障。保护控制端点,使用浏览器所支持的协议,并在协议操作成功后验证页面内容。

构建一个你可以验证的工作流

选择适用于你获准使用的数据源的 Scrapeless 服务,然后根据你的应用所需的字段检查返回的内容。

今天注册即可获得 5 美元免费额度 — 无需信用卡.

领取你的 $5 额度 →

常见问题

问:CDP 和 Chrome DevTools 是同一个东西吗?

CDP 是浏览器控制协议,而 Chrome DevTools 是使用该协议的用户界面。其他客户端可以在不显示 DevTools 界面的情况下使用该协议。

问:一次成功的导航命令是否意味着页面已就绪?

成功的导航命令并不保证应用程序已就绪。在提取数据之前,请检查所需内容并考虑动态加载因素。

问:CDP 可以连接到所有浏览器吗?

CDP 并未为每个浏览器引擎提供通用的控制协议。请确认你打算使用的浏览器或服务所支持的协议和功能。

问:公开调试端点安全吗?

在没有必要的访问控制情况下,不应将调试端点公开暴露。它可能会赋予对浏览器状态和操作的强大访问权限。

参考资料