Selenium:能否在Chromium浏览器新标签页打开时触发前置回调
可以实现,核心依赖Chromium的DevTools Protocol(CDP)
Selenium本身没有原生API支持这种"在新标签页发请求前阻塞并执行代码"的需求,但通过Chromium的CDP可以实现,以下是C#的实现思路和示例:
关键步骤
- 利用Selenium的
IDevTools接口与浏览器的CDP通信 - 监听新标签页(Target)的创建事件,在新标签页初始化阶段就挂载网络拦截逻辑
- 通过CDP的
Network.setRequestInterception开启请求拦截,在回调中执行自定义代码,完成后再放行网络请求
C# 示例代码
using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.DevTools; using OpenQA.Selenium.DevTools.V118.Network; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { // 初始化ChromeDriver,启用CDP支持 var options = new ChromeOptions(); using var driver = new ChromeDriver(options); var devTools = driver.GetDevTools(); await devTools.CreateSession(); // 监听新目标(新标签页)的创建事件 devTools.Target.AttachToTargetCompleted += async (sender, e) => { // 获取新标签页的DevTools会话 var newTargetSession = await devTools.Target.AttachToTargetAsync(e.TargetInfo.TargetId, false); var newNetwork = newTargetSession.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V118.DevToolsSessionDomains>().Network; // 开启请求拦截,配置拦截所有请求 await newNetwork.SetRequestInterceptionAsync(new SetRequestInterceptionCommandSettings { Patterns = new[] { new RequestPattern { UrlPattern = "*", ResourceType = ResourceType.Document, InterceptionStage = InterceptionStage.HeadersReceived } } }); // 注册请求拦截回调,这里是执行自定义代码的地方 newNetwork.RequestIntercepted += async (sender, interceptionArgs) => { // -------------------------- // 这里执行你需要的指定代码 // 比如修改请求头、注入脚本、打印日志等 System.Console.WriteLine($"新标签页即将请求: {interceptionArgs.Request.Url}"); // -------------------------- // 执行完代码后,放行当前请求(阻塞到此结束) await newNetwork.ContinueInterceptedRequestAsync(new ContinueInterceptedRequestCommandSettings { InterceptionId = interceptionArgs.InterceptionId }); }; }; // 导航到初始页面,点击打开新标签页的链接 driver.Navigate().GoToUrl("https://example.com"); var link = driver.FindElement(By.LinkText("More information...")); // 示例链接,替换成你的目标链接 link.Click(); // 等待操作完成,可根据实际需求调整等待逻辑 await Task.Delay(10000); } }
注意事项
- 确保使用的Selenium版本与Chrome/Edge版本兼容,CDP的版本号(示例中是V118)需要匹配浏览器版本
InterceptionStage可以根据需求调整,比如HeadersReceived是在收到响应头但未加载响应体时拦截,RequestSent是在发送请求前拦截- 自定义代码执行期间,浏览器的网络请求会被阻塞,直到调用
ContinueInterceptedRequestAsync或FailInterceptedRequestAsync - 新标签页创建后会立即被监听并挂载拦截逻辑,确保在任何网络请求发送前执行代码
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

