0

0

使用Selenium 4 DevTools API拦截并获取HTTP请求头

DDD

DDD

发布时间:2025-11-21 10:47:34

|

285人浏览过

|

来源于php中文网

原创

使用Selenium 4 DevTools API拦截并获取HTTP请求头

本文旨在指导读者如何利用selenium 4内置的devtools api来高效地拦截并获取浏览器发出的http请求头。传统上,我们可能依赖browsermob proxy等外部工具,但在selenium 4中,通过直接与浏览器开发工具协议交互,可以更直接、灵活地捕获网络流量,从而解决在ui自动化测试或数据采集过程中获取请求详情的需求,避免了外部代理可能带来的配置复杂性或兼容性问题。

1. 引言:网络流量拦截在自动化中的重要性

在Web自动化测试和数据抓取场景中,经常需要监控或分析浏览器与服务器之间的网络通信。获取HTTP请求头信息对于调试、验证请求参数、模拟用户行为或提取特定令牌等任务至关重要。传统上,开发者常借助BrowserMob Proxy等第三方代理工具与Selenium结合使用。然而,随着Selenium 4的发布,其内置的DevTools API提供了一种更为原生和高效的方式来直接与浏览器开发工具协议(CDP)进行交互,从而实现网络流量的精细控制和数据捕获。

2. Selenium 4 DevTools API概述

Selenium 4引入了对Chrome DevTools Protocol (CDP) 的原生支持,允许测试脚本直接访问浏览器的底层功能,包括网络、性能、安全等多个领域。通过DevTools API,我们可以监听各种浏览器事件,例如页面加载、DOM修改、以及本文重点关注的——网络请求和响应。这使得在不依赖外部代理的情况下,实现复杂的网络拦截和数据提取成为可能。

3. 环境准备

要使用Selenium 4 DevTools API,您需要以下依赖:

  • Java开发环境: 推荐使用Java 8或更高版本。
  • Maven 或 Gradle: 用于项目构建和依赖管理。
  • Selenium Java 库: 版本需为4.0.0或更高。
  • WebDriverManager (可选但推荐): 自动管理浏览器驱动,简化配置。

在 pom.xml 中添加Selenium Java依赖(以Maven为例):


    
        org.seleniumhq.selenium
        selenium-java
        4.7.0 
    
    
        io.github.bonigarcia
        webdrivermanager
        5.3.2 
    

4. 核心实现:拦截HTTP请求头

以下代码示例展示了如何使用Selenium 4 DevTools API来启动浏览器、创建DevTools会话,并监听网络请求事件以捕获请求的URL、方法和所有请求头。

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v119.network.Network; // 根据Selenium版本调整vXXX
import org.openqa.selenium.devtools.v119.network.model.Request; // 根据Selenium版本调整vXXX

import java.util.Optional;
import java.util.concurrent.TimeUnit;

public class NetworkInterceptorExample {

    public static void main(String[] args) throws InterruptedException {
        // 1. 设置 ChromeDriver
        WebDriverManager.chromedriver().setup();
        ChromeOptions options = new ChromeOptions();
        // options.addArguments("--headless"); // 如果不需要显示浏览器界面,可以启用无头模式

        ChromeDriver driver = new ChromeDriver(options);

        // 2. 创建 DevTools 会话
        DevTools devTools = driver.getDevTools();
        devTools.createSession();

        // 3. 启用 Network 域
        // Optional.empty() 表示不设置特定的最大请求/响应大小
        devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));

        // 4. 添加监听器以捕获请求事件
        // Network.requestWillBeSent 事件在请求即将发送时触发
        devTools.addListener(Network.requestWillBeSent(), requestWillBeSent -> {
            Request request = requestWillBeSent.getRequest();
            System.out.println("----------------------------------------");
            System.out.println("请求 URL: " + request.getUrl());
            System.out.println("请求方法: " + request.getMethod());
            System.out.println("请求头: " + request.getHeaders().toJson()); // 将Headers Map转换为JSON字符串
            // 可以进一步解析 headers.toJson() 获取特定头部信息
            // 例如: String userAgent = request.getHeaders().get("User-Agent");
        });

        // 5. 导航到目标网站
        driver.get("https://www.google.com");

        // 6. 等待一段时间,让请求被捕获
        TimeUnit.SECONDS.sleep(10); // 实际应用中应使用WebDriverWait等待页面元素或特定事件

        // 7. 关闭浏览器和 DevTools 会话
        driver.quit();
        devTools.close();
    }
}

代码解释:

MCP Market
MCP Market

MCP Servers集合平台,帮你找到最好的MCP服务器

下载
  • WebDriverManager.chromedriver().setup(): 自动下载并配置ChromeDriver。
  • ChromeDriver driver = new ChromeDriver(options);: 初始化Chrome浏览器实例。
  • DevTools devTools = driver.getDevTools(); devTools.createSession();: 获取DevTools实例并创建一个新的DevTools会话,这是与浏览器DevTools协议通信的入口。
  • devTools.send(Network.enable(...));: 启用Network域。这是告诉浏览器我们希望监听网络相关事件的必要步骤。Optional.empty()表示使用默认参数。
  • devTools.addListener(Network.requestWillBeSent(), ...);: 注册一个监听器,当Network.requestWillBeSent事件发生时(即请求即将被发送),会执行Lambda表达式中的代码。
  • requestWillBeSent.getRequest(): 从事件对象中获取Request详情,其中包含了请求的URL、方法、头部信息等。
  • request.getHeaders().toJson(): 获取请求头,并将其转换为JSON字符串输出。

5. 扩展与注意事项

5.1 捕获响应信息

除了请求头,DevTools API也能捕获响应信息。您可以监听 Network.responseReceived 事件来获取响应状态码、响应头等,以及 Network.loadingFinished 来获取响应体内容。

// 监听响应头
devTools.addListener(Network.responseReceived(), responseReceived -> {
    System.out.println("响应 URL: " + responseReceived.getResponse().getUrl());
    System.out.println("响应状态: " + responseReceived.getResponse().getStatus());
    System.out.println("响应头: " + responseReceived.getResponse().getHeaders().toJson());
});

// 监听响应体(需要先启用并捕获请求ID)
// 通常需要结合 requestWillBeSent 获取 requestId,然后通过 Network.getResponseBody(requestId) 获取
devTools.addListener(Network.loadingFinished(), loadingFinished -> {
    // 获取请求ID,然后通过 devTools.send(Network.getResponseBody(loadingFinished.getRequestId())) 获取响应体
    // 注意:获取响应体可能需要额外的逻辑来确保请求ID可用且未过期
});

5.2 过滤请求

如果您只对特定URL或类型的请求感兴趣,可以在监听器内部添加条件判断进行过滤。

devTools.addListener(Network.requestWillBeSent(), requestWillBeSent -> {
    String url = requestWillBeSent.getRequest().getUrl();
    if (url.contains("api.example.com")) { // 仅处理包含特定域名的请求
        System.out.println("API Request URL: " + url);
    }
});

5.3 导出为HAR文件

Selenium DevTools API本身不直接提供将捕获的数据导出为HAR(HTTP Archive)文件的功能。HAR文件是一种JSON格式,用于记录浏览器与网站交互的所有HTTP请求和响应。如果您需要HAR文件,可以:

  1. 手动构建: 收集所有 requestWillBeSent 和 responseReceived 事件的数据,然后按照HAR规范手动构建JSON结构。这需要对HAR格式有深入理解。
  2. 结合其他工具: 如果对HAR文件的需求非常强烈,且手动构建过于复杂,可以考虑继续使用BrowserMob Proxy,或者在Selenium DevTools捕获到关键信息后,再通过其他方式生成HAR。但对于仅获取请求头信息而言,DevTools API已足够。

5.4 兼容性

DevTools API主要支持基于Chromium的浏览器(Chrome, Edge)以及部分Firefox版本。在使用时,请确保您的Selenium版本和浏览器版本兼容。org.openqa.selenium.devtools.vXXX.network.Network 中的 vXXX 会根据您使用的Selenium版本和浏览器版本而变化,通常Selenium会自动选择合适的版本,但如果遇到问题,可能需要手动检查。

6. 总结

Selenium 4的DevTools API为网络流量拦截提供了强大而灵活的解决方案,尤其适用于需要直接与浏览器底层协议交互的场景。通过启用Network域并监听相关事件,我们可以轻松地捕获HTTP请求头、响应信息等,从而在自动化测试、数据采集等任务中获得更精细的控制和更丰富的数据。相比于外部代理工具,DevTools API的集成度更高,配置更简洁,是现代Selenium自动化项目中的首选方案。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

842

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

740

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

400

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

6

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.7万人学习

C# 教程
C# 教程

共94课时 | 7.3万人学习

Java 教程
Java 教程

共578课时 | 49.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号