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

Selenium C#(NUnit):异常未捕获,[OneTimeTearDown]仍执行

Selenium 浏览器清理逻辑优化方案

核心问题梳理

当前代码存在两个关键问题:

  • 手动调用TearDown()和框架[TearDown]注解重复执行,导致异常捕获逻辑失效
  • [OneTimeTearDown]的extent.Flush()未做异常兜底,且执行时机未与浏览器清理逻辑联动

优化后的代码实现

1. 重构单测试清理逻辑(自动执行)

把异常处理直接嵌入框架自动调用的[TearDown]方法中,避免手动调用导致的重复执行问题:

[TearDown]
public void TearDown()
{
    try
    {
        // 尝试关闭当前测试窗口
        driver.Close();
    }
    catch (Exception e)
    {
        // 记录异常日志,并强制终止浏览器进程
        test.Info($"窗口关闭失败: {e.Message}");
        test.Info(e.StackTrace);
        Console.WriteLine($"窗口关闭异常详情: {e.ToString()}");
        ForceTearDown();
    }
}

// 强制销毁浏览器进程的兜底方法
public void ForceTearDown()
{
    try
    {
        driver.Quit();
    }
    catch (Exception ex)
    {
        // 防止Quit操作也抛出异常,做最后日志兜底
        test.Info($"强制退出浏览器失败: {ex.Message}");
        Console.WriteLine($"强制退出异常详情: {ex.ToString()}");
    }
}

2. 全局清理与日志刷入的可靠执行

给[OneTimeTearDown]添加异常捕获,确保即使前面出现异常,日志也能尽可能被刷入;如果是单实例复用浏览器的场景,可把Quit()也移到这里统一执行:

[OneTimeTearDown]
public void GlobalCleanup()
{
    try
    {
        // 如果是多测试复用同一个Driver,在这里统一退出浏览器
        // driver.Quit();
        
        // 确保测试日志被刷入文件
        extent.Flush();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"全局清理/日志刷入失败: {ex.ToString()}");
    }
}

额外优化建议

  • 避免重复执行清理逻辑:不要手动调用带有[TearDown]/[OneTimeTearDown]注解的方法,框架会自动按生命周期执行
  • Driver实例复用策略:如果测试用例较多,建议在[OneTimeSetUp]中初始化一次Driver,[OneTimeTearDown]中统一Quit,仅在[TearDown]中关闭当前窗口(多窗口场景),减少浏览器销毁重建的开销
  • 异常类型精准捕获:可以捕获具体的InvalidSessionIdException而非泛型Exception,避免误捕获其他无关异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:45:49