浅入浅出Selenium DevTools
前言
在自动化测试领域,Selenium一直是主流工具之一。随着前端技术的不断发展,浏览器的功能也在不断丰富。

Selenium 3版本前,一套通用的采集流程如上图所示:
- 打开Charles,设置Session自动导出频次及导出路径
- Selenium模拟操作Chrome网页页面,待网页页面渲染出需采集的数据
- 解析Charles拦截的Session,提取目标数据
Selenium 4版本引入了org.openqa.selenium.devtools.DevTools,为开发者提供了更底层、更强大的浏览器交互能力。对以上采集流程而言,DevTools优化了步骤2,减少了模块间的异步交互,增加了采集的稳定性。
什么是DevTools?
DevTools是Selenium 4引入的一个全新的功能模块,它允许开发者直接与浏览器的DevTools协议(Chrome DevTools Protocol,CDP)进行交互。通过DevTools,开发者可以获取浏览器的更底层信息,或者执行更复杂的浏览器操作。
Chrome DevTools协议是一个允许工具与浏览器内部对象交互的接口。通过CDP,开发者可以访问浏览器的所有内部信息,如页面结构、网络请求、性能指标等。此外,CDP还允许开发者执行一些高级操作,如设置页面缩放、获取页面截图、模拟设备等。
为什么使用DevTools?
更底层的浏览器控制
相比传统的Selenium API,DevTools提供了更底层的浏览器控制能力。通过直接访问CDP,开发者可以获取更详细的浏览器状态信息,或执行更复杂的操作。
更高的灵活性
DevTools的灵活性是它最大的优势之一。通过CDP,开发者可以根据需求自定义浏览器的行为,而不受传统API的限制。
更广泛的应用场景
DevTools的功能涵盖了从性能分析到网络代理,从页面调试到设备模拟等多个方面。这种多样化的功能使得DevTools在自动化测试、性能优化、网络调试等领域都有广泛的应用。
DevTools的核心概念
DevTools Server
DevTools Server是DevTools的核心,它负责与浏览器的CDP交互。开发者可以通过DevTools Server发送指令,并接收浏览器的响应。DevTools Server的创建与管理是使用DevTools的前提条件。
DevTools Command
DevTools Command是DevTools的操作单元。通过发送特定的命令,开发者可以执行各种操作,如获取页面内容、模拟用户交互、设置浏览器配置等。DevTools Command可以通过DevTools Server发送,并通过回调接收执行结果。
Event Listener
DevTools支持通过事件监听器(Event Listener)来监听浏览器的各种事件。例如,开发者可以监听页面加载完成、网络请求完成、页面元素更新等事件。这使得开发者可以在特定事件发生时执行自定义逻辑。
实际应用场景
1. 获取页面性能数据
通过DevTools,开发者可以轻松获取页面的性能数据,如加载时间、内存使用情况、CPU使用情况等。这些数据对于性能优化非常有价值。
示例代码:
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.events.Event;
import org.openqa.selenium.devtools.events.PerformanceMetric;// 创建DevTools实例
DevTools devTools = new Chrome().getDevTools();// 监听性能指标事件
devTools.onPerformanceMetric(new Consumer<Event<PerformanceMetric>>() {@Overridepublic void accept(Event<PerformanceMetric> event) {PerformanceMetric metric = event.getData();System.out.println("Metric Name: " + metric.getName());System.out.println("Value: " + metric.getValue());}
});// 启动DevTools会话
devTools.send(Performance.startProfiling());
2. 获取页面截图
通过DevTools,开发者可以获取页面的截图,并将其保存为图片文件。这种功能对于自动化测试中的视觉验证非常有用。
示例代码:
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.browser.Target;// 创建DevTools实例
DevTools devTools = new Chrome().getDevTools();// 获取当前窗口截图
String screenshot = devTools.send(Browser.getViewport()).getScreenshot();// 将截图保存为PNG文件
File file = new File("screenshot.png");
Files.write(file.toPath(), Base64.getDecoder().decode(screenshot));
3. 模拟设备和屏幕
DevTools允许开发者模拟不同的设备和屏幕分辨率。这种功能对于响应式设计测试非常有用。
示例代码:
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.browser.Viewport;// 创建DevTools实例
DevTools devTools = new Chrome().getDevTools();// 设置视口
Viewport viewport = new Viewport();
viewport.setDeviceScaleFactor(2);
viewport.setDeviceWidth(375);
viewport.setDeviceHeight(667);// 发送设置指令
devTools.send(Browser.setDeviceMetrics(viewport));
4. 自定义浏览器行为
DevTools允许开发者自定义浏览器的行为,例如设置浏览器的user agent、模拟网络条件等。这种功能对于跨浏览器测试和网络调试非常有用。
示例代码:
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.network.NetworkConditions;// 创建DevTools实例
DevTools devTools = new Chrome().getDevTools();// 设置网络条件
NetworkConditions conditions = new NetworkConditions();
conditions.setOffline(true);
conditions.setLatency(1000);
conditions.setDownloadThroughput(50000);// 发送网络条件设置指令
devTools.send(Network.setNetworkConditions(conditions));
5. 调试和分析
DevTools提供了丰富的调试和分析工具,例如堆栈跟踪、JavaScript执行、资源加载分析等。开发者可以利用这些工具来调试自动化测试脚本,或者分析浏览器的行为。
示例代码:
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.runtime.Runtime;// 创建DevTools实例
DevTools devTools = new Chrome().getDevTools();// 执行JavaScript代码
String script = "console.log('Hello from DevTools!');";
devTools.send(Runtime.evaluate(script));// 获取执行结果
String result = devTools.send(Runtime.getHeapStatistics()).getUsedHeapSize();
System.out.println("Used Heap Size: " + result);
Selenium 4中的DevTools集成
Selenium 4对DevTools进行了深度集成,使得开发者可以更方便地使用这些功能。在Selenium 4中,DevTools被设计为一个独立的模块,开发者可以根据需求选择是否加载它。
启用DevTools
在Selenium 4中,启用DevTools非常简单。开发者只需要创建一个DevTools实例即可开始使用。
示例代码:
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;// 创建Chrome选项
ChromeOptions options = new ChromeOptions();// 启用DevTools
options.addArguments("--remote-debugging-port=9222");// 创建Chrome驱动
ChromeDriver driver = new ChromeDriver(options);// 获取DevTools实例
DevTools devTools = driver.getDevTools();
使用DevTools API
Selenium 4提供了丰富的DevTools API,涵盖了从浏览器控制到性能分析、从网络调试到设备模拟等多个方面。
示例代码:
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.browser.Browser;
import org.openqa.selenium.devtools.domain.runtime.Runtime;// 获取浏览器版本信息
String version = devTools.send(Browser.getVersion());
System.out.println("Browser Version: " + version);// 获取运行时信息
String runtimeInfo = devTools.send(Runtime.getRuntimeInfo());
System.out.println("Runtime Info: " + runtimeInfo);
自定义DevTools命令
除了使用Selenium提供的API,开发者还可以通过DevTools发送自定义的CDP命令。这种功能对于需要低级别控制的场景非常有用。
示例代码:
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.custom.CustomCommand;// 创建自定义命令
CustomCommand<String> command = new CustomCommand<>("Runtime.evaluate", request -> {request.body().put("expression", "window.innerWidth");request.body().put("contextId", 1);
});// 发送自定义命令
String result = devTools.send(command);
System.out.println("Custom Command Result: " + result);
总结
org.openqa.selenium.devtools.DevTools是Selenium 4版本中一个非常强大的功能模块。通过它,开发者可以直接与浏览器的DevTools协议交互,获取更底层的浏览器控制能力和更灵活的操作方式。无论是自动化测试、性能优化,还是网络调试,DevTools都能提供丰富的功能支持。
相关文章:
浅入浅出Selenium DevTools
前言 在自动化测试领域,Selenium一直是主流工具之一。随着前端技术的不断发展,浏览器的功能也在不断丰富。 Selenium 3版本前,一套通用的采集流程如上图所示: 打开Charles,设置Session自动导出频次及导出路径Seleniu…...
软件工程---净室软件工程
净室软件工程是一种软件开发方法,旨在通过形式化的数据和严格的测试来提高软件的可靠性和减少缺陷的数量。它的核心思想是在软件开发过程中最小化或消除软件缺陷,从而提高软件的质量和可靠性。这种方法强调在软件生命周期的早期阶段使用形式化方法进行规…...
OpenHarmony图形子系统
OpenHarmony图形子系统 图形子系统主要包括UI组件、布局、动画、字体、输入事件、窗口管理、渲染绘制等模块,构建基于轻量OS应用框架满足硬件资源较小的物联网设备或者构建基于标准OS的应用框架满足富设备的OpenHarmony系统应用开发。 1.1 轻量系统 简介 图形子…...
如何获取Mac OS 安装盘
发现虚拟机VirtualBox支持Mac虚拟,就想尝试一下。但是发现Mac的安装盘特别难拿到,因此留档。发现有几种方法,最简单的方法,是在有Mac 机器的情况下,直接到App Store里,根据Mac版本的名字查找并下载。另外还…...
【弹性计算】弹性裸金属服务器和神龙虚拟化(一):功能特点
弹性裸金属服务器和神龙虚拟化(一):功能特点 特征一:分钟级交付特征二:兼容 VPC、SLB、RDS 等云平台全业务特征三:兼容虚拟机镜像特征四:云盘启动和数据云盘动态热插拔特征五:虚拟机…...
大白话前端性能优化方法的分类与具体实现
大白话前端性能优化方法的分类与具体实现 一、资源加载优化 1. 压缩与合并文件 大白话解释: 咱们的网页代码里,就像一个房间堆满了东西,有很多没用的“杂物”,比如代码里的空格、注释啥的。压缩文件就是把这些“杂物”清理掉&a…...
Rabbit MQ 高频面试题【刷题系列】
文章目录 一、公司生产环境用的什么消息中间件?二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点?三、解耦、异步、削峰是什么?四、消息队列有什么缺点?五、RabbitMQ一般用在什么场景?六、简单说RabbitMQ有哪些角…...
ES6 特性全面解析与应用实践
1、let let 关键字用来声明变量,使用let 声明的变量有几个特点: 1) 不允许重复声明 2) 块儿级作用域 3) 不存在变量提升 4) 不影响作用域链 5) 暂时性死区 6)不与顶级对象挂钩 在代码块内,使用let命令声明变量之前&#x…...
有关数据库表的冗余字段
有关数据库表的冗余字段 之前看一个开发人员的技术研讨视频,提到了一个数据库表设计中的表拆分字段冗余问题,就是一张表做纵向分表,拆分为a和b以做冷热数据分离存储,但是会有一种情况就是相同的字段值在a,b表中重复出现…...
知识图谱补全KGC
目录 基础知识知识图谱补全概念性能指标 一、翻译模型的知识图谱补全1.TransE2.TransH3.RotatE 二、张量分解的知识补全1.RESCAL2.ComplEx 三、神经网络的知识图谱补全1.卷积神经网络CNN(一般用于二维图像处理)ConvE 2.循环神经网络RNN3.图神经网络GNN1&…...
独立开发者的内容营销教程
内容营销对于独立开发者来说,是一种低成本、高效的方式来推广产品、建立品牌影响力和吸引潜在用户。通过分享有价值、相关性强的内容,您可以吸引用户的注意力,增强用户黏性,并最终将他们转化为忠实用户或客户。以下是详细的独立开…...
Mysql——约束与多表查询
一、约束 1.1定义 约束是对表中的数据进行限制的一套规则,用于防止用户向数据库中输入无效数据。它可以保证表中的数据满足特定业务规则和逻辑,从而维护数据的准确性和可靠性。 1.2作用 数据完整性 :约束可以确保数据在插入、更新或删除时符…...
DockerでOracle Database 23ai FreeをセットアップしMAX_STRING_SIZEを拡張する手順
DockerでOracle Database 23c FreeをセットアップしMAX_STRING_SIZEを拡張する手順 はじめに環境準備ディレクトリ作成Dockerコンテナ起動 データベース設定変更コンテナ内でSQL*Plus起動PDB操作と文字列サイズ拡張設定検証 管理者ユーザー作成注意事項まとめ はじめに Oracle…...
Unity 运用正则表达式保留字符串中的中文英文字母和数字
正则表达 正则表达式 – 语法 | 菜鸟教程 Regex 类 (System.Text.RegularExpressions) | Microsoft Learn 保留字符串中的中英数 中英数的正则表达。 patten "[\u4e00-\u9fa5A-Za-z0-9]"; 使用Regex 类匹配正则并保留。 matches Regex.Matches(str, patten)…...
vue el-table-column 单元表格的 省略号 实现
要对 el-table-column 的某一列中的每个单元格值进行处理,使其在文本内容超出指定宽度时显示省略号(…),可以通过以下方法实现: 使用 scoped slots:利用 Element UI 提供的 scoped slots 自定义单元格内容…...
企业微信里可以使用的企业内刊制作工具,FLBOOK
如何让员工及时了解公司动态、行业资讯、学习专业知识,并有效沉淀企业文化?一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网,注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…...
【数据挖掘】Pandas
Pandas 是 Python 进行 数据挖掘 和 数据分析 的核心库之一,提供了强大的 数据清洗、预处理、转换、分析 和 可视化 功能。它通常与 NumPy、Matplotlib、Seaborn、Scikit-Learn 等库结合使用,帮助构建高效的数据挖掘流程。 📌 1. 读取数据 P…...
explore与explode词源故事
英语单词explore来自古法语,源自拉丁语,由前缀ex-(出来)加词根plor-(叫喊)以及末尾的小尾巴-e组成,字面意思就是“喊出来,通过叫喊声赶出来”。它为什么能表示“探索”呢?…...
CAM350_安装
版本:V14.5 一、安装 打开.exe文件 选择不重启,然后再打开这个.exe 再来一次类似的操作 二、配置 复制patch文件夹中的这三个 ,粘贴到掉安装目录中 设置ACT_INC_LICENSE_FILE用户环境变量来设置license管理 打开电脑的环境变量 破解完毕&am…...
51c自动驾驶~合集22
我自己的原文哦~ https://blog.51cto.com/whaosoft/11870502 #自动驾驶数据闭环最前沿论文 近几年,自动驾驶技术的发展日新月异。从ECCV 2020的NeRF问世再到SIGGRAPH 2023的3DGS,三维重建走上了快速发展的道路!再到自动驾驶端到端技术的…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
