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
相关产品推荐
相关产品推荐

