浏览器冻结时终止测试执行?Playwright+.net+SpecFlow+NUnit方案咨询
解决Playwright+.NET+SpecFlow+NUnit测试无限运行的超时终止方案
1. NUnit原生超时特性
直接给测试方法绑定[Timeout]特性,指定超时毫秒数,到时间NUnit会自动终止测试并标记失败:
[Test] [Timeout(60000)] // 设置60秒超时 public async Task TestThatMayFreeze() { // 你的测试逻辑代码 }
SpecFlow的绑定方法也可以直接加这个特性,因为底层由NUnit执行。
2. SpecFlow全局超时配置
如果要给所有测试统一设置超时,无需逐个方法加特性,可通过配置文件实现:
- 用
specflow.json配置:
{ "nUnit": { "timeout": 60000 // 全局设置60秒超时 } }
- 用
App.config配置:
<specFlow> <unitTestProvider name="nUnit"> <settings> <add key="Timeout" value="60000" /> </settings> </unitTestProvider> </specFlow>
3. Playwright操作级超时控制
针对浏览器操作单独设置超时,避免单一步骤卡住整个测试:
- 设置页面所有操作的默认超时:
await page.SetDefaultTimeout(30000); // 所有页面操作默认30秒超时
- 给特定导航操作设置超时:
await page.GotoAsync("your-app-url", new PageGotoOptions { Timeout = 30000 });
- 等待元素时单独设置超时并处理:
try { await page.WaitForSelectorAsync("#target-element", new PageWaitForSelectorOptions { Timeout = 10000 }); } catch (TimeoutException) { // 超时后可先做截图留存再抛出异常 await page.ScreenshotAsync(new PageScreenshotOptions { Path = "timeout-screenshot.png" }); throw; }
4. 自定义超时终止逻辑
如果需要超时前强制清理浏览器进程(比如顽固冻结的情况),可以用Task.WhenAny实现灵活控制:
[Test] public async Task TestWithCustomTimeoutHandling() { var testTask = ExecuteTestLogic(); var timeoutTask = Task.Delay(60000); var completedTask = await Task.WhenAny(testTask, timeoutTask); if (completedTask == timeoutTask) { // 超时后强制关闭浏览器并清理进程 await browser?.CloseAsync(); // 杀死残留浏览器进程(替换为你使用的浏览器进程名,如msedge、firefox) foreach (var process in Process.GetProcessesByName("chrome")) { process.Kill(); } Assert.Fail("测试超时,浏览器冻结"); } await testTask; // 确保测试任务完成,抛出内部异常 } private async Task ExecuteTestLogic() { using var playwright = await Playwright.CreateAsync(); await using var browser = await playwright.Chromium.LaunchAsync(); var page = await browser.NewPageAsync(); await page.GotoAsync("your-app-url"); // 触发可能导致冻结的操作 await page.ClickAsync("#freeze-trigger-button"); }
内容的提问来源于stack exchange,提问作者laxsore
相关产品推荐
相关产品推荐

