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

浏览器冻结时终止测试执行?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:12:06