如何在Selenium中像Chrome DevTools一样捕获网络请求?
Selenium捕获Chrome网络请求的解决方案
一、修复现有代码(解决RequestIntercepted无效问题)
你的代码仅监听了ResponseReceived事件,若要实现类似Chrome DevTools的请求拦截功能,需额外配置拦截规则并正确处理RequestIntercepted事件。另外必须保证Chrome浏览器版本与你使用的DevTools版本(V107)严格匹配,这是事件触发的核心前提。
修改后的完整代码:
Imports OpenQA.Selenium Imports OpenQA.Selenium.Chrome Imports OpenQA.Selenium.DevTools Imports OpenQA.Selenium.DevTools.V107.Network Imports System.Threading.Tasks Public Class SeleniumTest Private Driver As IWebDriver Private Session As DevToolsSession Private WithEvents Network As NetworkAdapter Public Async Sub Load(Url As String) Dim options As New ChromeOptions() ' 可选:禁用缓存,确保捕获所有请求 options.AddArgument("--disable-cache") Driver = New ChromeDriver(options) Dim devTools As IDevTools = DirectCast(Driver, IDevTools) Session = devTools.GetDevToolsSession() Network = Session.GetVersionSpecificDomains(Of DevToolsSessionDomains).Network ' 1. 启用Network域 Await Network.Enable(New EnableCommandSettings()) ' 2. 设置请求拦截规则:拦截所有类型的请求 Await Network.SetRequestInterception(New SetRequestInterceptionCommandSettings() With { .Patterns = New List(Of RequestPattern) From { New RequestPattern() With { .UrlPattern = "*", .ResourceType = ResourceType.All, .InterceptionStage = InterceptionStage.HeadersReceived } } }) Driver.Navigate.GoToUrl(Url) End Sub Public Sub Click() Try Dim elem As IWebElement = Driver.FindElement(By.ClassName("video-holder")) elem.Click() Catch ex As Exception Debug.WriteLine($"点击元素失败:{ex.Message}") End Try End Sub ' 监听请求拦截事件(捕获所有请求) Private Async Sub Network_RequestIntercepted(sender As Object, e As RequestInterceptedEventArgs) Handles Network.RequestIntercepted Debug.WriteLine($"拦截到请求:{e.Request.Url}") Debug.WriteLine($"请求方法:{e.Request.Method}") ' 必须继续请求,否则页面会卡住 Await Network.ContinueInterceptedRequest(New ContinueInterceptedRequestCommandSettings() With { .InterceptionId = e.InterceptionId }) End Sub ' 监听响应事件(可选,捕获返回内容) Private Sub Network_ResponseReceived(sender As Object, e As ResponseReceivedEventArgs) Handles Network.ResponseReceived Debug.WriteLine($"收到响应:{e.Response.Url},状态码:{e.Response.Status}") End Sub End Class
关键修复点:
- 新增
SetRequestInterception配置,指定拦截所有URL和资源类型,这是RequestIntercepted事件触发的必要条件 - 在
RequestIntercepted事件处理中必须调用ContinueInterceptedRequest,否则请求会被挂起,页面无法正常加载 - 确保Chrome浏览器版本与引用的DevTools版本(V107)完全一致,版本不匹配是事件不触发的常见原因
- 可选添加
--disable-cache参数,避免缓存导致部分请求不被捕获
二、替代库推荐
如果Selenium的DevTools使用过于繁琐,可考虑以下更专注于网络捕获的工具:
- Playwright:微软出品的自动化工具,内置强大的网络拦截与捕获功能,API简洁直观,支持多浏览器,无需手动匹配DevTools版本
- Puppeteer Sharp:.NET版本的Puppeteer,基于Chrome DevTools Protocol开发,原生支持请求拦截、修改与捕获,比Selenium更轻量
三、常见问题排查
- 事件不触发:通过
chrome://version查看Chrome版本,安装对应版本的Selenium DevTools包 - 部分请求未捕获:确认拦截规则的
ResourceType设置为All,且已禁用缓存 - 页面卡住:检查
RequestIntercepted事件中是否调用了ContinueInterceptedRequest,每个拦截的请求都需要手动放行
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

