.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(); } }
验证方式
- 运行整个测试类,检查每个测试的控制台输出或日志文件,确认都有请求/响应日志。
- 模拟一个返回408的请求,测试页面是否自动刷新,且后续测试的日志正常生成。
内容的提问来源于stack exchange,提问作者jvu
相关产品推荐
相关产品推荐

