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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:18:17