当前位置: 首页 > news >正文

浅入浅出Selenium DevTools

前言

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

在这里插入图片描述

Selenium 3版本前,一套通用的采集流程如上图所示:

  1. 打开Charles,设置Session自动导出频次及导出路径
  2. Selenium模拟操作Chrome网页页面,待网页页面渲染出需采集的数据
  3. 解析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 ServerDevTools的核心,它负责与浏览器的CDP交互。开发者可以通过DevTools Server发送指令,并接收浏览器的响应。DevTools Server的创建与管理是使用DevTools的前提条件。

DevTools Command

DevTools CommandDevTools的操作单元。通过发送特定的命令,开发者可以执行各种操作,如获取页面内容、模拟用户交互、设置浏览器配置等。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

前言 在自动化测试领域&#xff0c;Selenium一直是主流工具之一。随着前端技术的不断发展&#xff0c;浏览器的功能也在不断丰富。 Selenium 3版本前&#xff0c;一套通用的采集流程如上图所示&#xff1a; 打开Charles&#xff0c;设置Session自动导出频次及导出路径Seleniu…...

软件工程---净室软件工程

净室软件工程是一种软件开发方法&#xff0c;旨在通过形式化的数据和严格的测试来提高软件的可靠性和减少缺陷的数量。它的核心思想是在软件开发过程中最小化或消除软件缺陷&#xff0c;从而提高软件的质量和可靠性。这种方法强调在软件生命周期的早期阶段使用形式化方法进行规…...

OpenHarmony图形子系统

OpenHarmony图形子系统 图形子系统主要包括UI组件、布局、动画、字体、输入事件、窗口管理、渲染绘制等模块&#xff0c;构建基于轻量OS应用框架满足硬件资源较小的物联网设备或者构建基于标准OS的应用框架满足富设备的OpenHarmony系统应用开发。 1.1 轻量系统 简介 图形子…...

如何获取Mac OS 安装盘

发现虚拟机VirtualBox支持Mac虚拟&#xff0c;就想尝试一下。但是发现Mac的安装盘特别难拿到&#xff0c;因此留档。发现有几种方法&#xff0c;最简单的方法&#xff0c;是在有Mac 机器的情况下&#xff0c;直接到App Store里&#xff0c;根据Mac版本的名字查找并下载。另外还…...

【弹性计算】弹性裸金属服务器和神龙虚拟化(一):功能特点

弹性裸金属服务器和神龙虚拟化&#xff08;一&#xff09;&#xff1a;功能特点 特征一&#xff1a;分钟级交付特征二&#xff1a;兼容 VPC、SLB、RDS 等云平台全业务特征三&#xff1a;兼容虚拟机镜像特征四&#xff1a;云盘启动和数据云盘动态热插拔特征五&#xff1a;虚拟机…...

大白话前端性能优化方法的分类与具体实现

大白话前端性能优化方法的分类与具体实现 一、资源加载优化 1. 压缩与合并文件 大白话解释&#xff1a; 咱们的网页代码里&#xff0c;就像一个房间堆满了东西&#xff0c;有很多没用的“杂物”&#xff0c;比如代码里的空格、注释啥的。压缩文件就是把这些“杂物”清理掉&a…...

Rabbit MQ 高频面试题【刷题系列】

文章目录 一、公司生产环境用的什么消息中间件&#xff1f;二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点&#xff1f;三、解耦、异步、削峰是什么&#xff1f;四、消息队列有什么缺点&#xff1f;五、RabbitMQ一般用在什么场景&#xff1f;六、简单说RabbitMQ有哪些角…...

ES6 特性全面解析与应用实践

1、let let 关键字用来声明变量&#xff0c;使用let 声明的变量有几个特点&#xff1a; 1) 不允许重复声明 2) 块儿级作用域 3) 不存在变量提升 4) 不影响作用域链 5) 暂时性死区 6&#xff09;不与顶级对象挂钩 在代码块内&#xff0c;使用let命令声明变量之前&#x…...

有关数据库表的冗余字段

有关数据库表的冗余字段 之前看一个开发人员的技术研讨视频&#xff0c;提到了一个数据库表设计中的表拆分字段冗余问题&#xff0c;就是一张表做纵向分表&#xff0c;拆分为a和b以做冷热数据分离存储&#xff0c;但是会有一种情况就是相同的字段值在a&#xff0c;b表中重复出现…...

知识图谱补全KGC

目录 基础知识知识图谱补全概念性能指标 一、翻译模型的知识图谱补全1.TransE2.TransH3.RotatE 二、张量分解的知识补全1.RESCAL2.ComplEx 三、神经网络的知识图谱补全1.卷积神经网络CNN&#xff08;一般用于二维图像处理&#xff09;ConvE 2.循环神经网络RNN3.图神经网络GNN1&…...

独立开发者的内容营销教程

内容营销对于独立开发者来说&#xff0c;是一种低成本、高效的方式来推广产品、建立品牌影响力和吸引潜在用户。通过分享有价值、相关性强的内容&#xff0c;您可以吸引用户的注意力&#xff0c;增强用户黏性&#xff0c;并最终将他们转化为忠实用户或客户。以下是详细的独立开…...

Mysql——约束与多表查询

一、约束 1.1定义 约束是对表中的数据进行限制的一套规则&#xff0c;用于防止用户向数据库中输入无效数据。它可以保证表中的数据满足特定业务规则和逻辑&#xff0c;从而维护数据的准确性和可靠性。 1.2作用 数据完整性 &#xff1a;约束可以确保数据在插入、更新或删除时符…...

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 的某一列中的每个单元格值进行处理&#xff0c;使其在文本内容超出指定宽度时显示省略号&#xff08;…&#xff09;&#xff0c;可以通过以下方法实现&#xff1a; 使用 scoped slots&#xff1a;利用 Element UI 提供的 scoped slots 自定义单元格内容…...

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识&#xff0c;并有效沉淀企业文化&#xff1f;一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网&#xff0c;注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…...

【数据挖掘】Pandas

Pandas 是 Python 进行 数据挖掘 和 数据分析 的核心库之一&#xff0c;提供了强大的 数据清洗、预处理、转换、分析 和 可视化 功能。它通常与 NumPy、Matplotlib、Seaborn、Scikit-Learn 等库结合使用&#xff0c;帮助构建高效的数据挖掘流程。 &#x1f4cc; 1. 读取数据 P…...

explore与explode词源故事

英语单词explore来自古法语&#xff0c;源自拉丁语&#xff0c;由前缀ex-&#xff08;出来&#xff09;加词根plor-&#xff08;叫喊&#xff09;以及末尾的小尾巴-e组成&#xff0c;字面意思就是“喊出来&#xff0c;通过叫喊声赶出来”。它为什么能表示“探索”呢&#xff1f…...

CAM350_安装

版本&#xff1a;V14.5 一、安装 打开.exe文件 选择不重启&#xff0c;然后再打开这个.exe 再来一次类似的操作 二、配置 复制patch文件夹中的这三个 &#xff0c;粘贴到掉安装目录中 设置ACT_INC_LICENSE_FILE用户环境变量来设置license管理 打开电脑的环境变量 破解完毕&am…...

51c自动驾驶~合集22

我自己的原文哦~ https://blog.51cto.com/whaosoft/11870502 #自动驾驶数据闭环最前沿论文 近几年&#xff0c;自动驾驶技术的发展日新月异。从ECCV 2020的NeRF问世再到SIGGRAPH 2023的3DGS&#xff0c;三维重建走上了快速发展的道路&#xff01;再到自动驾驶端到端技术的…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

Spring事务传播机制有哪些?

导语&#xff1a; Spring事务传播机制是后端面试中的必考知识点&#xff0c;特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发&#xff0c;全面剖析Spring事务传播机制&#xff0c;帮助你答得有…...