浅入浅出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都能提供丰富的功能支持。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04 路由表的IP分组传输过程

目录 1、路由表的核心结构 2、IP分组传输过程和数据包转发过程 2.1、IP分组传输过程 2.2、数据包转发过程 2.3、IP分组传输过程和数据包转发的区别 3、数据包的变化 3.1、拓扑结构 3.2、传输过程详解&#xff08;主机A → 主机B&#xff09; 3.2.1、主机A发送数据 3.2…

【子网掩码计算器:Python + Tkinter 实现】

子网掩码计算器&#xff1a;Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…

【练习】【贪心】力扣1005. K 次取反后最大化的数组和

题目 1005 K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可…

3dsmax中使用python创建PBR材质并挂接贴图

前言 笔者处理模型时下载到一个pbr材质库贴图包&#xff0c;手动每次创建材质过于麻烦&#xff0c;因此计划使用自动化脚本根据贴图名自动创建材质。 3dsmax的原本脚本使用的是maxscript&#xff0c;语法有点奇怪懒得学&#xff0c;发现也支持使用python编写脚本&#…

Metal学习笔记九:光照基础

光和阴影是使场景流行的重要要求。通过一些着色器艺术&#xff0c;您可以突出重要的对象、描述天气和一天中的时间并设置场景的气氛。即使您的场景由卡通对象组成&#xff0c;如果您没有正确地照亮它们&#xff0c;场景也会变得平淡无奇。 最简单的光照方法之一是 Phong 反射模…

JAVA学习笔记038——bean的概念和常见注解标注

什么是bean? Bean 就是 被 Spring 管理的对象&#xff0c;就像工厂流水线上生产的“标准产品”。这些对象不是你自己 new 出来的&#xff0c;而是由 Spring 容器&#xff08;一个超级工厂&#xff09;帮你创建、组装、管理。 由 Component、Service、Controller 等注解标记的…

start DL from stratch (2)!!!

start DL from stratch &#xff08;2&#xff09;!!! 一、CPU and GPUcpuGPU安培架构爱达洛夫莱斯架构 二、使用conda创建一个新的虚拟环境三、autodl操作先知Linux复习目录文件和数据上传对于整个镜像的操作守护进程Tips 四、autodl租用创建实例<big>没有所需要的版本的…

机器学习:线性回归,梯度下降

线性回归模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的数学公式

论文笔记-NeurIPS2017-DropoutNet

论文笔记-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet&#xff1a;解决推荐系统中的冷启动问题摘要1.引言2.前言3.方法3.1模型架构3.2冷启动训练3.3推荐 4.实验4.1实验设置4.2在CiteULike上的实验结果4.2.1 Dropout率的影响4.2.2 实验结…

nvm的学习

学习 nvm&#xff08;Node Version Manager&#xff09; 是掌握 Node.js 开发的关键技能之一。以下是系统的学习路径和实战指南&#xff0c;涵盖从基础到进阶的内容&#xff1a; 一、基础入门 1. nvm 的核心作用 多版本共存&#xff1a;安装和管理多个 Node.js 版本&#xff…

GPT-4.5实际性能评测:实际探索

摘要 经过数万轮严格测试&#xff0c;GPT-4.5的性能并未超越其前代产品GPT-4。此前发布的《GPT-4.5 一手实测&#xff1a;垃圾》一文中存在不准确描述&#xff0c;在此向读者致歉。尽管GPT-4.5在价格上有所提升且响应速度较慢&#xff0c;但测试结果显示其模型素质并未达到预期…

从UNIX到Linux:操作系统进化史与开源革命

从UNIX到Linux&#xff1a;操作系统进化史与开源革命 一、操作系统&#xff1a;数字世界的基石 1.1 什么是操作系统&#xff1f; 操作系统&#xff08;OS&#xff09;是计算机系统的核心管理者&#xff0c;承担着三大核心使命&#xff1a; 硬件指挥官&#xff1a;直接管理C…

如何修改安全帽/反光衣检测AI边缘计算智能分析网关V4的IP地址?

TSINGSEE青犀推出的智能分析网关V4&#xff0c;是一款集成了BM1684芯片的高性能AI边缘计算智能硬件。其内置的高性能8核ARM A53处理器&#xff0c;主频可高达2.3GHz&#xff0c;INT8峰值算力更是达到了惊人的17.6Tops。此外&#xff0c;该硬件还预装了近40种AI算法模型&#xf…

【全栈开发】----Mysql基本配置与使用

本篇是在已下载Mysql的情况下进行的&#xff0c;若还未下载或未创建Mysql服务&#xff0c;请转到这篇: 2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易&#xff08;保姆级&#xff09;_mysql8.0.40下载安装教程-CSDN博客 本文对于mysql的操作均使用控制台sql原生代码…

C++ primer plus 第四节 复合类型

本章内容包括: • 创建和使用数组 • 创建和使用 c-风格字符串 • 创建和使用 string 类字符串 • 使用方法getline( )和 get( )读取字符串 • 混合输入字符串和数字 • 创建和使用结构 • 创建和使用共用休 • 创建和使用枚举 • 创建和使用指针 • 使用 new和delete 管理动态…

Java中的泛型类 --为集合的学习做准备

学习目标 ● 掌握在集合中正确使用泛型 ● 了解泛型类、泛型接口、泛型方法 ● 了解泛型上下限 ● 了解基本的使用场景 1.有关泛型 1.1泛型的概念 泛型&#xff08;Generics&#xff09;是Java中引入的参数化类型机制&#xff0c;允许在定义类、接口或方法时使用类型参数&a…

VUE3+Vite使用TailwindCSS【若依前后端分离框架】

参考&#xff1a;https://tailwind.nodejs.cn/docs/guides/vite#vue 和 https://blog.csdn.net/hjl_and_djj/article/details/144694485依次运行命令&#xff1a; cnpm install -D tailwindcss3.4.17 postcss autoprefixernpx tailwindcss init -p修改配置文件tailwind.config.…

FFmpeg入门:最简单的音频播放器

FFmpeg入门&#xff1a;最简单的音频播放器 欢迎大家来到FFmpeg入门的第二章&#xff0c;今天只做一个最简单的FFmpeg音频播放器&#xff1b;同样&#xff0c;话不多说&#xff0c;先上流程图 流程图 以上流程和视频播放器的解码过程基本上是一致的&#xff1b; 不同点在于 S…

在Ubuntu下,源码编译安装Python

在Ubuntu下&#xff0c;源码编译安装Python 知识点 知识点1&#xff1a;在 Linux 系统里&#xff0c;/usr 目录通常用于存放一些共享的、只读的程序和数据&#xff0c;是系统安装软件的一个重要位置。而 /usr/src 目录一般是用来存放系统源代码以及一些软件包的源代码的地方 …

《每天读一个JDK源码》之HashMap解读

&#x1f4cc;《每天读一个JDK源码》之HashMap解读 &#x1f517;源码定位&#xff1a;java.util.HashMap&#xff08;建议IDE对照阅读&#xff09; 今天我们来破解Java集合框架中最精妙的艺术品——HashMap&#xff01;它不仅是面试必考题&#xff08;出现率99%&#xff09;&…