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

C# XUnit SpecFlow Selenium中WireMock拦截API响应失败求助

解决WireMock代理拦截API时出现"No matching mapping found"的问题

我基于C# XUnit SpecFlow Selenium开展UI自动化测试项目,网站支持面包屑展示模式与单页应用模式,已实现面包屑模式用例的并行执行。现在需要通过WireMock修改网站初始化时的API响应,强制切换到单页模式以实现两类用例并行,但配置后始终收到{"Status":"No matching mapping found"}错误,以下是针对性的排查和解决方法:


1. 修正API路径匹配逻辑

WireMock的WithPath默认是精确匹配,如果实际请求的路径包含查询参数、域名前缀或路径大小写不一致,都会导致匹配失败:

  • 开启WireMock请求日志,查看实际请求的完整路径:
    // 在请求发起后打印日志
    foreach (var entry in _server.LogEntries)
    {
        Console.WriteLine($"Request Path: {entry.RequestMessage.Path}");
    }
    
  • 改用模糊匹配或正则匹配适配实际路径:
    // 通配符匹配任意前缀的/api-endpoint
    _server.Given(Request.Create()
            .WithPathMatching("*/api-endpoint")
            .UsingGet())
          .RespondWith(...)
    

2. 调整映射配置的执行顺序

你的代码中先创建ChromeDriver再配置WireMock映射,可能导致请求发起时映射还未生效。先完成映射配置,再初始化Driver:

public void NavigateToOPApplication(string url)
{
    _server = WireMockServer.Start();

    // 先配置映射规则
    _server
        .Given(Request.Create().WithPath("/api-endpoint").UsingGet())
        .RespondWith(WireMock.ResponseBuilders.Response.Create()
            .WithStatusCode(200)
            .WithBody(@"{""enableOnePageApplication"": true}"));

    var chromeOptions = new ChromeOptions();
    chromeOptions.AddArgument($"--proxy-server={_server.Url}");
    
    // 再创建WebDriver实例
    _driver1 = new ChromeDriver(chromeOptions);

    _driver1.Navigate().GoToUrl(url);
}

3. 处理HTTPS请求的证书问题

如果目标网站是HTTPS,Chrome会因为WireMock的自签名证书不信任而拦截请求,导致WireMock收不到请求:

  • 添加Chrome参数忽略证书错误:
    chromeOptions.AddArgument("--ignore-certificate-errors");
    

4. 补充请求方法与头部匹配条件

确认实际API请求的方法(GET/POST)和必要请求头与配置一致,比如API要求带特定Content-Type:

_server.Given(Request.Create()
        .WithPath("/api-endpoint")
        .UsingGet()
        .WithHeader("Content-Type", "application/json"))
      .RespondWith(...)

5. 配置WireMock为透明代理

如果网站的API请求是指向完整域名(如https://your-site.com/api-endpoint),需要让WireMock转发未匹配的请求到原网站,避免返回404:

_server.ProxyAndRecordSettings = new ProxyAndRecordSettings
{
    Url = url, // 目标网站的根URL
    SaveMapping = false
};

内容的提问来源于stack exchange,提问作者ARYAN JAIN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:32:07