Chrome DevTools Protocol 入门:快速开始

Chrome DevTools Protocol(CDP) 是一套开放协议,允许外部程序通过 Chrome 浏览器提供的接口与其进行交互。CDP 提供了丰富的功能,使开发者可以远程控制 Chrome 浏览器,包括操作 DOM、监控网络请求、调试代码、截取屏幕快照等。

在这篇文章中,我们将介绍 CDP 的基本概念,并展示如何使用 CDP 与浏览器交互,从而帮助你快速上手这个强大的工具。

什么是 Chrome DevTools Protocol?

Chrome DevTools Protocol 是 Chrome 浏览器提供的一种低级 API,开发者可以通过它与浏览器的内部机制进行交互。它支持浏览器调试、性能分析、DOM 操作、网络管理等多种功能,几乎覆盖了开发者需要的所有调试和自动化场景。

通过 WebSocket 与浏览器建立连接,客户端程序可以向浏览器发送命令,并通过监听事件获取浏览器的状态反馈。CDP 提供了多个域(Domains),每个域负责不同的功能,例如:

  • Page 域:管理页面的加载、导航和截屏。
  • DOM 域:操作 DOM 树结构,获取页面元素的信息。
  • Network 域:拦截和监控网络请求。
  • Runtime 域:执行 JavaScript 代码,获取运行时的状态。
  • Debugger 域:设置断点,调试脚本。

如何启动 Chrome DevTools Protocol

开启端口

要开始使用 CDP,首先需要启动 Chrome 浏览器并开启远程调试模式。可以通过命令行启动 Chrome,并指定调试端口:

chrome --remote-debugging-port=9222

启动后,浏览器会在 localhost:9222 上监听 WebSocket 连接。此时,你可以通过 WebSocket 客户端连接到这个端口并发送 CDP 命令。

获取webSocketDebuggerUrl的两种途径

Chrome 提供了一个简单的 REST API 来查看可用的 WebSocket 调试端点。你可以通过访问 http://localhost:9222/json 或者 http://localhost:9222/json/version 获取浏览器可用的Websocket 地址。

这两种接口返回的信息有什么区别呢?
  • http://localhost:9222/json:

  • 返回一个 JSON 数组,包含所有正在通过 CDP 远程调试的页面信息。
  • 每个页面的信息通常包括:
    • id: 会话 ID,用于在 CDP 中与特定页面进行通信。
    • title: 页面的标题。
    • url: 当前页面的 URL。
    • webSocketDebuggerUrl: WebSocket 地址,用于与 CDP 建立通信。
  • 这个端点适合用于获取当前调试的页面列表,以及访问 WebSocket URL 以开始调试某个页面。
  • http://localhost:9222/json/version:

  • 返回有关 Chrome 版本的信息,以及与 CDP 相关的元数据信息。
  • 响应通常包含:
    • Browser: 浏览器的版本信息。
    • Protocol-Version: CDP 协议版本。
    • User-Agent: 浏览器的用户代理字符串。
    • V8-Version: 使用的 V8 引擎版本。
    • webSocketDebuggerUrl: 用于调试的 WebSocket 地址。
  • 这个端点适合用于查询当前使用的 Chrome 版本和 WebSocket 连接地址等信息。

总结来说,/json 提供的是所有当前可调试页面的列表,而 /json/version 则提供的是与当前浏览器和 CDP 协议版本有关的元数据。

如何选择合适的webSocketDebuggerUrl

根据以上描述很明显的看出一个是页面相关,而另一个是浏览器相关,那么适用于页面的CDP域(Page,DOM, RunTime...)使用http://localhost:9222/json比较合适, 而和浏览器相关的CDP域(Browser, Target, Network...)则使用http://localhost:9222/json/version

基本的 WebSocket 连接与命令发送

一旦你获取了 WebSocket 地址,就可以通过 WebSocket 客户端连接到 Chrome 并发送 CDP 命令。这里是一个简单的例子,展示了如何与浏览器交互:

import websockets
import asyncio
import jsonasync def cdp_interaction():# 连接到 Chrome DevTools Protocol 的 WebSocket 地址async with websockets.connect("ws://localhost:9222/devtools/page/4A211FFD0E71CD465FA1744717720311") as websocket:# 向浏览器发送命令,获取页面标题command = {"id": 1,"method": "Page.navigate","params": {"url": "https://www.example.com"}}await websocket.send(json.dumps(command))# 接收浏览器返回的响应response = await websocket.recv()print(response)# 运行 WebSocket 客户端
asyncio.get_event_loop().run_until_complete(cdp_interaction())

在这个例子中,我们使用 Python 的 websockets 库连接到浏览器,并通过 Page.navigate 命令让浏览器加载一个指定的 URL。浏览器处理该命令后,会通过 WebSocket 发送回一个响应。

运行结果:

{"id":1,"result":{"frameId":"1F1A646103FECD9BDC9C29868F0E31D1","loaderId":"51642D68A778B53AEB6F8E8768A7080A"}}

运行截图:

常用的 CDP 命令

这里列出了一些常见的 CDP 命令,帮助你快速掌握 CDP 的使用:

  1. Page.navigate
    导航到一个指定的 URL:
{"id":1,"method":"Page.navigate","params":{"url":"https://www.example.com"}
}
  1. Runtime.evaluate
    执行 JavaScript 代码:
{"id":2,"method":"Runtime.evaluate","params":{"expression":"document.title"}
}
  1. DOM.getDocument
    获取当前页面的 DOM 树:
{"id":3,"method":"DOM.getDocument"
}
  1. Network.enable
    启用网络监控:
{"id":4,"method":"Network.enable"
}

事件监听

CDP 还支持事件机制,允许你监听浏览器中的某些操作。例如,你可以监听网络请求的事件,以获取每个请求的详细信息:

{"method":"Network.requestWillBeSent","params":{"requestId":"1234","url":"https://www.example.com","request":{"headers":{"User-Agent":"..."}}}
}

可以通过 WebSocket 客户端持续监听这些事件,并根据需要处理这些信息。

总结

Chrome DevTools Protocol 为开发者提供了强大的工具,帮助我们深入理解和操作浏览器的内部机制。通过 CDP,你可以实现自动化测试、性能调优、调试脚本等众多功能。本文只是对 CDP 的基础介绍,未来的文章中我们将深入探讨具体的功能实现和使用场景,如果想了解更多CDP相关内容,可参考官方文档: Chrome DevTools Protocol 。


希望这篇文章能够帮助你顺利入门 Chrome DevTools Protocol!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12324.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

TCP协议详解

一、整体抓包情况 192.168.111.1:53965请求向192.168.111.128:80发起TCP连接。 注意:TCP连接是TCP端口向TCP端口的连接。 二、TCP连接请求(三次握手) 此处为简洁隐去端口号。 (1)192.168.111.1——>192.168.11…

vue+Springboot实现简单文件上传到本地

实现效果 点击上传文件按钮后&#xff0c;选择需要上传的文件&#xff0c;如果是图片的话&#xff0c;上传成功后可以直接在下面预览。 前端页面 <template><div class"file-upload"><el-upload:headers"getUploadConfig(token).headers"…

闯关leetcode——3206. Alternating Groups I

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/alternating-groups-i/description/ 内容 There is a circle of red and blue tiles. You are given an array of integers colors. The color of tile i is represented by colors[i]: colors[i…

QT Unknown module(s) in QT 以及maintenance tool的更详细用法(qt6.6.0)

不小心接了同事的委托&#xff0c;帮改一个qt的工程代码。然后出事了&#xff0c;那个proj是qt5.9版本的吧&#xff0c;搞到6.6版本的环境中各种问题。至少有3个是这样的&#xff1a; :-1: error: Unknown module(s) in QT: multimedia 直接百度&#xff0c;好像很简单&#x…

Springboot苍穹外卖实战:四、分页查询(PageHelper实现、日期格式转换)

分页查询 使用PageHelper插件实现。其实可以升级为MybatisPlus的。 接口设计 设计DTO类 com.sky.dto.EmployeePageQueryDTO 已设计好&#xff0c;为EmployeePageQueryDTO&#xff1b; 封装PageResult com.sky.result.PageResult com.sky.result.Result 已封装好&#xff0…

0x00基础算法 -- 0x03 前缀和与差分

1、前缀和 对于一个给定的数组A&#xff0c;它的前缀和数列S是通过递推求得的&#xff1a;//A[]和S[]的有效数据从下标1开始&#xff0c;方便后续计算 s[0] 0; for (int i 1; i < n; i) {s[i] s[i - 1] A[i]; } 作用&#xff1a;用于快速求得某一部分的和&#xff1a;对…

四焦距聚焦型光场计算成像系统的设计

摘要: 光场相机是一种在图像传感器前增加微透镜阵列的新型相机结构&#xff0c;除了记录不同位置下光的强度及颜色外&#xff0c;也记录不同位置下光线的方向信息&#xff0c;从而能够计算目标场景的深度图和高阶相位图。该技术由于景深和分辨率相互制约&#xff0c;获得大景深…

ubuntu18.04 配置安卓编译环境

目前有个项目&#xff0c;验收时有个要求是在linux中进行编译打包生成apk文件。我平时都是在windows环境android studio中进行打包的&#xff0c;花了半天时间研究了一下&#xff0c;记录如下&#xff1a; 安装安卓sdk cd /opt wget https://dl.google.com/android/reposito…

qt QWidgetAction详解

1、概述 QWidgetAction是Qt框架中的一个类&#xff0c;它继承自QAction类。QWidgetAction允许开发者将自定义的小部件&#xff08;widget&#xff09;插入到基于QAction的容器中&#xff0c;如工具栏或菜单项中。这使得QWidgetAction成为创建复杂用户界面和自定义菜单项的强大…

工位管理革新:Spring Boot企业级系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理企业级工位管理系统的相关信息成为必然。开…

mysql查询语句(基础)

查询所需要的关键字 select 先在图形化工具导入数据库文件。 1&#xff1a;查询一个表中的所有列&#xff0c;使用通配符 * 。 select * from 表名 ; 2&#xff1a;查询表中的某列字段。 select 字段1,字段2,... from 表名; 字段之间使用逗号隔开。 …

Zookeeper的安装与使用

一、简介 1.1、概念 ZooKeeper 是一个开源的分布式协调服务&#xff0c;主要用于解决分布式系统中的数据一致性问题。它提供了一种可靠的机制来管理和协调分布式系统的各个节点。ZooKeeper 的设计目标是简化分布式应用的开发&#xff0c;提供简单易用的接口和高性能、高稳定性…

【论文阅读】医学SAM适配器:适应医学图像分割的任意分割模型

【论文阅读】医学SAM适配器&#xff1a;适应医学图像分割的任意分割模型 文章目录 【论文阅读】医学SAM适配器&#xff1a;适应医学图像分割的任意分割模型一、介绍二、联系工作三、方法四、实验 Medical SAM Adapter: Adapting Segment Anything Model for Medical Image Segm…

caozha-ip(IP地址查询源码)

caozha-ip&#xff0c;是基于原生PHP写的一套完整的IP转地址模块源码&#xff0c;支持自动获取IP&#xff0c;也支持查询指定IP&#xff0c;同时支持输出json、jsonp、text、xml、js等多种IP和地址格式&#xff0c;还可以细分为国家、省、市、地区&#xff0c;方便在各种系统里…

【Android、IOS、Flutter、鸿蒙、ReactNative 】文本Text显示

XML布局 参考 android:text <TextViewandroid:id"id/textview"android:layout_width"wrap_content"android:layout_height"wrap_content"android:text"Android Java TextView"app:layout_constraintBottom_toBottomOf"paren…

FPGA学习笔记#7 Vitis HLS 数组优化和函数优化

本笔记使用的Vitis HLS版本为2022.2&#xff0c;在windows11下运行&#xff0c;仿真part为xcku15p_CIV-ffva1156-2LV-e&#xff0c;主要根据教程&#xff1a;跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 学习笔记&#xff1a;《FPGA学习笔记》索引 FPGA学习笔记#1 HLS简介及…

深入浅出JUC常用同步器

文章目录 1.JUC下同步器1.1 CountdownLatch 倒计数锁存器1.2 CyclicBarrier回环屏障1.3 Semephone 信号量 2.小结 1.JUC下同步器 日常开发会遇到主线程开启多个子线程去并行执行任务&#xff0c;并且主线程需要等待所有子线程执行完后在进行汇总的场景。 同步器出现之前&…

工位管理新策略:Spring Boot企业级应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

CAN总线物理层特性详细分析

目录 1. 简介 2. CAN总线拓扑图 3. CAN硬件电路 4. CAN电平标准 5. CAN收发器-TJA1050&#xff08;高速CAN&#xff09; 6. CAN物理层特性 1. 简介 CAN总线&#xff08;Controller Area Network Bus&#xff09;控制器局域网总线&#xff0c;是由BOSCH公司开发的一…

2024AAAI | DiffRAW: 利用扩散模型从手机RAW图生成单反相机质量的RGB图像

文章标题&#xff1a;《DiffRAW: Leveraging Diffusion Model to Generate DSLR-Comparable Perceptual Quality sRGB from Smartphone RAW Images》 原文链接&#xff1a;DiffRAW 本文是清华大学深圳研究院联合华为发表在AAAI-2024上的论文&#xff08;小声bb&#xff1a;华…