You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:15:33