在C# Selenium中如何动态获取Network面板的请求URL?
可行方案及C#实现方法
完全可行,你可以通过Selenium的DevTools协议捕获点击按钮后发起的动态API请求,获取带时间戳的URL后再调用接口获取响应体做断言。以下是具体的C#实现步骤和代码:
核心思路
- 启用浏览器DevTools监听网络请求
- 触发报表生成操作后,捕获目标API的请求URL
- 用HttpClient调用该URL获取响应,完成参数断言
代码实现
using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.DevTools; using OpenQA.Selenium.DevTools.V114.Network; // 版本需与ChromeDriver匹配 using System; using System.Net.Http; using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; public class ReportValidationTest { public static async Task RunTest() { // 初始化Chrome浏览器选项 var chromeOptions = new ChromeOptions(); chromeOptions.AddArgument("--start-maximized"); using var driver = new ChromeDriver(chromeOptions); var devTools = driver.GetDevTools(); await devTools.CreateSession(); // 启用网络监控 await devTools.SendCommand(new EnableCommandSettings()); string targetReportApiUrl = null; var waitForApiSignal = new ManualResetEvent(false); // 订阅网络请求事件,筛选目标API devTools.Network.RequestWillBeSent += (sender, eventArgs) => { // 根据实际API的路径特征调整判断条件,比如包含"/report/generate" if (eventArgs.Request.Url.Contains("/api/report/generate")) { targetReportApiUrl = eventArgs.Request.Url; waitForApiSignal.Set(); // 捕获到目标请求后触发信号 } }; // 导航到报表页面并完成参数选择 driver.Navigate().GoToUrl("你的报表系统页面URL"); // 示例:选择日期参数 // driver.FindElement(By.Id("startDate")).SendKeys("2024-05-20"); // driver.FindElement(By.Id("reportType")).SelectByText("月度报表"); // 点击生成报表按钮 driver.FindElement(By.CssSelector("button#GetReport")).Click(); // 等待捕获API请求,超时时间根据实际情况调整 if (!waitForApiSignal.WaitOne(TimeSpan.FromSeconds(15))) { throw new TimeoutException("未捕获到报表生成API请求"); } // 初始化HttpClient,继承浏览器的认证信息(Cookie/Token) var cookieContainer = new CookieContainer(); foreach (var cookie in driver.Manage().Cookies.AllCookies) { cookieContainer.Add(new Cookie( cookie.Name, cookie.Value, cookie.Path, cookie.Domain )); } using var httpClientHandler = new HttpClientHandler { CookieContainer = cookieContainer }; using var httpClient = new HttpClient(httpClientHandler); // 获取API响应体 var apiResponse = await httpClient.GetAsync(targetReportApiUrl); apiResponse.EnsureSuccessStatusCode(); var responseBody = await apiResponse.Content.ReadAsStringAsync(); // 执行断言逻辑,示例:验证响应中包含所选参数 // 若响应是JSON格式,可使用Newtonsoft.Json或System.Text.Json解析后断言 // var reportData = System.Text.Json.JsonSerializer.Deserialize<ReportDto>(responseBody); // Assert.AreEqual("2024-05-20", reportData.StartDate); // Assert.AreEqual("月度报表", reportData.ReportType); Console.WriteLine($"成功捕获报表API:{targetReportApiUrl}"); Console.WriteLine("响应体验证完成"); } } // 可根据API响应定义对应的DTO类 // public class ReportDto // { // public string StartDate { get; set; } // public string ReportType { get; set; } // }
关键注意事项
- DevTools版本匹配:必须使用与ChromeDriver版本一致的DevTools命名空间(如V114对应Chrome 114版本),否则会出现兼容性错误。
- API筛选条件:要根据实际系统的API路径调整
Contains中的特征字符串,确保精准捕获目标请求。 - 认证信息传递:如果报表API需要登录态,必须将Selenium中的Cookie同步到HttpClient,否则会返回未授权错误。
- 超时设置:等待捕获API的超时时间要匹配报表生成的实际耗时,避免过早抛出超时异常。
- 请求类型适配:如果报表API是POST请求,需要在事件中捕获请求体,调用时改用
PostAsync方法发送对应参数。
内容的提问来源于stack exchange,提问作者Glen Butcher
相关产品推荐
相关产品推荐

