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为例):

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.7.0</version> <!-- 推荐使用最新稳定版,此处示例为4.7.0 -->
    </dependency>
    <dependency>
        <groupId>io.github.bonigarcia</groupId>
        <artifactId>webdrivermanager</artifactId>
        <version>5.3.2</version> <!-- 推荐使用最新稳定版 -->
    </dependency>
</dependencies>

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();
    }
}

代码解释:

PathFinder
PathFinder

AI驱动的销售漏斗分析工具

下载
  • 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自动化项目中的首选方案。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1059

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

840

2023.11.06

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1059

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

840

2023.11.06

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

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

精品课程

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

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81.5万人学习

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

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