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

如何在C#版Selenium中将API响应体存储到变量?

问题描述

我需要在前端应用中点击生成报告的按钮后,将API响应体存储到变量或字符串中。我知道有其他API测试工具,且这通常不属于前端自动化测试范畴,但我司应用的报告组件仅返回图片元素,无法验证报告参数是否与请求一致,而API响应体包含这些参数。我查阅了大量资料,尝试过IDevTools和Network接口,但没找到正确的实现方式,我认为需要在点击按钮前启动网络监听器,但不知道具体怎么操作。

以下是我尝试的代码片段:

IDevTools devTools = (IDevTools)driver;
DevToolsSession session = devTools.GetDevToolsSession();
session.Domains.Network.EnableNetwork();
            
driver.FindElement(By.CssSelector("report button")).Click();
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("chart")));

session.DevToolsEventReceived += Session_DevToolsEventReceived;
static void Session_DevToolsEventReceived(object? sender, DevToolsEventReceivedEventArgs e)
{
    Console.WriteLine(e.EventData);
}
解决方案

你的核心思路是对的:必须在触发请求之前完成网络监听器的注册,否则会错过目标API的响应。以下是修正后的可执行方案:

关键调整点

  • 提前注册DevToolsEventReceived事件,确保不会遗漏请求
  • 过滤目标API请求,避免捕获无关响应
  • 通过DevTools API主动获取完整响应体内容

修正后的代码示例

// 用于存储目标API的响应体
string reportApiResponseBody = null;

IDevTools devTools = (IDevTools)driver;
DevToolsSession session = devTools.GetDevToolsSession();

// 1. 先注册网络事件监听
session.DevToolsEventReceived += (sender, e) =>
{
    // 只处理响应接收事件
    if (e.EventName != "Network.ResponseReceived") return;

    var responseArgs = e.EventData.ToObject<Network.ResponseReceivedEventArgs>();
    // 替换为你的报告API的URL特征,比如包含"/api/generate-report"
    if (responseArgs.Response.Url.Contains("/api/generate-report"))
    {
        // 请求获取响应体内容
        var getBodyParams = new Network.GetResponseBodyCommandSettings
        {
            RequestId = responseArgs.RequestId
        };
        var bodyResult = session.Domains.Network.GetResponseBody(getBodyParams).Result;
        
        // 处理base64编码的响应体
        reportApiResponseBody = bodyResult.Base64Encoded 
            ? System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(bodyResult.Body))
            : bodyResult.Body;
    }
};

// 2. 启用Network域监听
session.Domains.Network.EnableNetwork();

// 3. 触发报告生成操作
driver.FindElement(By.CssSelector("report button")).Click();
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("chart")));

// 4. 使用响应体进行参数验证
if (!string.IsNullOrEmpty(reportApiResponseBody))
{
    // 示例:解析JSON并验证参数(需引用JSON库如Newtonsoft.Json)
    // var reportParams = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(reportApiResponseBody);
    // Assert.AreEqual("预期的参数值", reportParams.targetParam);
    Console.WriteLine("获取到报告API响应体:\n" + reportApiResponseBody);
}

注意事项

  • 确保安装的Selenium.WebDriver.DevTools包版本与Selenium核心版本一致
  • 替换代码中的URL特征字符串为实际报告API的路径标识
  • 如果响应体是JSON格式,可使用JSON序列化库解析后进行参数校验

内容的提问来源于stack exchange,提问作者Glen Butcher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:34:50