如何用Selenium 4.3.0和.NET6.0捕获Web API POST请求体?
使用Selenium 4.3.0 + .NET 6.0捕获POST请求体与响应体的解决方案
Selenium 4.x的.NET版本对DevTools的API做了调整,旧的CreateDevToolsSession方法已被移除,你可以通过以下方式实现POST请求体和响应体的捕获:
核心实现步骤
- 初始化ChromeDriver时启用DevTools支持
- 订阅网络请求监听事件,过滤目标POST请求
- 提取请求载荷与响应体
- 和预期的tinyMCE生成HTML内容做对比验证
完整代码示例
using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.DevTools; using OpenQA.Selenium.DevTools.V114.Network; // 版本需与Chrome浏览器对应 using System.Text.Json; // 初始化ChromeDriver var options = new ChromeOptions(); // 可选:调试阶段禁用无头模式,生产环境可开启 // options.AddArgument("--headless=new"); var driver = new ChromeDriver(options); // 获取并创建DevTools会话 var devTools = driver.DevTools; await devTools.CreateSessionAsync(); // 异步方法需用await // 启用网络监听 await devTools.Network.EnableAsync(new EnableCommandSettings()); // 存储捕获到的请求体和响应体 string capturedRequestBody = string.Empty; string capturedResponseBody = string.Empty; // 订阅请求事件,捕获POST请求体 devTools.Network.RequestWillBeSent += (sender, e) => { // 过滤目标请求,替换为你的实际请求URL特征 if (e.Request.Method == "POST" && e.Request.Url.Contains("/send-email")) { if (e.Request.PostData != null) { capturedRequestBody = e.Request.PostData; } } }; // 订阅响应事件,捕获响应体 devTools.Network.ResponseReceived += async (sender, e) => { // 匹配对应的请求 if (e.Request.Method == "POST" && e.Request.Url.Contains("/send-email")) { var responseBody = await devTools.Network.GetResponseBodyAsync(new GetResponseBodyCommandSettings { RequestId = e.RequestId }); capturedResponseBody = responseBody.Body; } }; // 执行UI操作:操作tinyMCE并发送邮件 // 1. 切换到tinyMCE的iframe并编辑内容 driver.SwitchTo().Frame(driver.FindElement(By.CssSelector("iframe[title='Rich Text Area']"))); // 替换为你的tinyMCE iframe选择器 var editorBody = driver.FindElement(By.TagName("body")); editorBody.SendKeys("one"); driver.SwitchTo().DefaultContent(); // 执行加粗操作(替换为实际页面的加粗按钮选择器) driver.FindElement(By.CssSelector("button[aria-label='Bold']")).Click(); // 2. 点击发送邮件按钮 driver.FindElement(By.Id("send-email-btn")).Click(); // 替换为实际发送按钮ID // 等待请求完成,根据实际场景调整等待时长 await Task.Delay(3000); // 验证请求体内容 string expectedHtml = "<p><strong>one</strong></p>"; // 替换为你预期的tinyMCE生成HTML if (capturedRequestBody.Contains(expectedHtml)) { Console.WriteLine("验证通过:tinyMCE格式符合预期"); } else { Console.WriteLine($"验证失败:预期内容「{expectedHtml}」,实际捕获「{capturedRequestBody}」"); } // 清理资源 driver.Quit();
注意事项
- 版本匹配:确保
OpenQA.Selenium.DevTools的版本与你的Chrome浏览器版本一致,版本不匹配会导致API调用失败。 - 异步处理:Selenium 4的DevTools API多为异步方法,必须使用
await关键字处理。 - 请求过滤:根据实际业务调整URL过滤规则,避免捕获无关请求。
- iframe切换:操作tinyMCE时需先切换到对应的iframe,完成操作后切回主文档。
内容的提问来源于stack exchange,提问作者Mufasa
相关产品推荐
相关产品推荐

