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

.NET下Playwright+NUnit端到端测试HTTP请求监控异常排查

修复Playwright+NUnit批量测试时仅首个测试生成请求日志的问题

问题根源

单个测试运行时,每次都会重新初始化Playwright上下文并绑定请求监听;但批量运行整个测试类时,要么是事件订阅没在每个测试前重新注册,要么是Playwright资源没完全隔离,导致后续测试的请求事件根本没被捕获到。

具体修复步骤

1. 每个测试都独立初始化Playwright资源

别复用全局的Playwright实例,每个测试都从头创建:

private IPlaywright _playwright;
private IBrowser _browser;
private IBrowserContext _context;
private IPage _page;

[SetUp]
public async Task Setup()
{
    // 每个测试都重新启动Playwright
    _playwright = await Playwright.CreateAsync();
    _browser = await _playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
    {
        Headless = false // 按需调整
    });
    _context = await _browser.NewContextAsync();
    _page = await _context.NewPageAsync();

    // 每次测试都重新绑定请求/响应监听
    await BindRequestResponseHandlers();
}

[TearDown]
public async Task Teardown()
{
    // 按顺序销毁资源,杜绝泄漏
    await _page.CloseAsync();
    await _context.CloseAsync();
    await _browser.CloseAsync();
    _playwright.Dispose();
}

2. 给每个测试的页面重新注册事件监听

把事件处理抽成单独方法,确保每个测试的页面都能捕获请求和响应:

private async Task BindRequestResponseHandlers()
{
    // 监听所有请求,打日志
    _page.Request += (sender, e) =>
    {
        Console.WriteLine($"请求: {e.Method} {e.Url}");
        // 这里可以把日志写到文件或其他存储
        return Task.CompletedTask;
    };

    // 监听响应,处理408超时自动刷新
    _page.Response += async (sender, e) =>
    {
        Console.WriteLine($"响应: {e.Status} {e.Url}");
        if (e.Status == 408)
        {
            await _page.ReloadAsync();
        }
    };
}

3. 绝对不要用静态共享资源

如果之前图省事用了静态的IPage或IBrowserContext,全部改成测试类的私有实例变量,保证每个测试的资源完全独立,不会互相干扰。

4. 检查NUnit的并行设置

要是测试类开了并行执行,要么在[TestFixture]上加[Parallelizable(ParallelScope.None)]确保顺序执行时资源不冲突,要么给每个测试分配独立的Playwright实例,避免并行导致的事件订阅混乱。

5. 显式清理事件订阅(可选但稳妥)

在Teardown时主动移除事件订阅,防止残留的订阅影响后续测试:

[TearDown]
public async Task Teardown()
{
    // 移除事件绑定
    _page.Request -= OnRequestLogged;
    _page.Response -= OnResponseHandled;

    await _page.CloseAsync();
    await _context.CloseAsync();
    await _browser.CloseAsync();
    _playwright.Dispose();
}

// 把事件处理改成独立方法,方便移除
private Task OnRequestLogged(object sender, IRequestEventArgs e)
{
    Console.WriteLine($"请求: {e.Method} {e.Url}");
    return Task.CompletedTask;
}

private async Task OnResponseHandled(object sender, IResponseEventArgs e)
{
    Console.WriteLine($"响应: {e.Status} {e.Url}");
    if (e.Status == 408)
    {
        await _page.ReloadAsync();
    }
}

验证方式

  1. 运行整个测试类,检查每个测试的控制台输出或日志文件,确认都有请求/响应日志。
  2. 模拟一个返回408的请求,测试页面是否自动刷新,且后续测试的日志正常生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:27:42