在C#环境下使用Selenium捕获API请求的指定请求头
解决方案:用Selenium 4+Chrome DevTools Protocol捕获请求头
Selenium原生没有GetNetworkRequests()这类方法,你之前的代码无法运行。针对.NET 6环境,推荐用**Chrome DevTools Protocol(CDP)**来监听网络请求,这是Selenium 4原生支持的方案,无需依赖BrowserMobProxy这类第三方工具。
实现步骤:
- 初始化ChromeDriver时,创建CDP会话
- 订阅
Network.requestWillBeSent事件,该事件会在每个请求发送前触发,包含完整的请求头信息 - 登录完成后,等待目标API请求出现,提取指定请求头
完整代码示例(.NET 6):
using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.DevTools; using OpenQA.Selenium.DevTools.V119.Network; // 版本需和你的Chrome版本匹配 class Program { static void Main(string[] args) { ChromeOptions options = new ChromeOptions(); options.AddArgument("user-data-dir=C:\\Users\\Test\\AppData\\Local\\Google\\Chrome\\User Data"); using IWebDriver driver = new ChromeDriver(options); var devTools = driver as IDevTools; DevToolsSession session = devTools.GetDevToolsSession(); // 启用Network域 session.SendCommand(new EnableCommandSettings()); // 存储目标请求的特定头信息 string targetHeaderValue = null; string targetApiUrl = "https://test.com/api/your-target-endpoint"; // 替换为你的目标API // 订阅请求发送事件 session.AddListener<RequestWillBeSentEvent>(e => { if (e.Request.Url.Contains(targetApiUrl) && (e.Request.Method == "GET" || e.Request.Method == "POST")) { // 提取你需要的请求头,比如Authorization e.Request.Headers.TryGetValue("Authorization", out targetHeaderValue); // 如果需要多个头,可在此处继续处理 } }); // 导航到站点并完成登录(替换为你的实际登录逻辑) driver.Navigate().GoToUrl("https://test.com/"); // driver.FindElement(By.Id("username")).SendKeys("your-username"); // driver.FindElement(By.Id("password")).SendKeys("your-password"); // driver.FindElement(By.Id("login-btn")).Click(); // 等待目标请求触发,生产环境建议用WebDriverWait替代Thread.Sleep System.Threading.Thread.Sleep(10000); // 输出提取到的请求头 if (!string.IsNullOrEmpty(targetHeaderValue)) { Console.WriteLine($"目标API的指定请求头值:{targetHeaderValue}"); } else { Console.WriteLine("未捕获到目标请求或请求头"); } driver.Quit(); } }
注意事项:
- 确保Selenium版本为4.x,ChromeDriver版本与本地Chrome浏览器版本匹配
Network命名空间的版本(如V119)需对应Chrome版本,可通过chrome://version查看浏览器版本- 替换
targetApiUrl为你要捕获的API地址,以及要提取的请求头键名 - 生产环境建议用
WebDriverWait替代Thread.Sleep,根据页面加载状态或请求触发条件等待
内容的提问来源于stack exchange,提问作者Mohammad Ebrahimi
相关产品推荐
相关产品推荐

