Selenium C# NUnit:失败测试截图保存至指定文件夹问题求助
Selenium+C#+NUnit 失败测试截图保存方案
原代码的问题
- 生命周期钩子错误:用了
[OneTimeTearDown],这个是所有测试跑完才执行,没法捕获单个测试的失败状态,应该用[TearDown](每个测试结束后触发)。 - 逻辑判断反转:原代码写的是
!= ResultState.Failure,等于只有测试成功才截图,完全搞反了需求。 - 路径不完整:只指定了文件夹,没给具体文件名,
SaveAsFile需要完整的文件路径才能保存。 - 格式枚举未正确引用:
Png要写成ScreenshotImageFormat.Png,得确保引用了OpenQA.Selenium命名空间。 - 未检查文件夹存在:如果目标文件夹不存在,截图会保存失败。
修正后的完整代码
using NUnit.Framework; using OpenQA.Selenium; using System.IO; [TestFixture] public class YourTestClass { private IWebDriver driver; [SetUp] public void Setup() { // 初始化你的WebDriver,这里以Chrome为例 driver = new OpenQA.Selenium.Chrome.ChromeDriver(); } [TearDown] public void TearDown() { // 仅在测试失败时执行截图 if (TestContext.CurrentContext.Result.Outcome == ResultState.Failure) { // 定义截图存储路径,用当前工作目录+Screenshots文件夹 var screenshotDir = Path.Combine(Directory.GetCurrentDirectory(), "Screenshots"); // 自动创建文件夹(不存在则创建) Directory.CreateDirectory(screenshotDir); // 生成唯一文件名,避免重复覆盖 var fileName = $"Fail_{TestContext.CurrentContext.Test.Name}_{DateTime.Now:yyyyMMdd_HHmmss}.png"; var fullFilePath = Path.Combine(screenshotDir, fileName); // 捕获截图并保存 if (driver is ITakesScreenshot screenshotDriver) { var screenshot = screenshotDriver.GetScreenshot(); screenshot.SaveAsFile(fullFilePath, ScreenshotImageFormat.Png); // 把截图附加到测试结果,让Azure DevOps能识别显示 TestContext.AddTestAttachment(fullFilePath, $"[{TestContext.CurrentContext.Test.Name}] 失败截图"); } } // 关闭浏览器驱动 driver?.Quit(); } // 示例失败测试 [Test] public void DemoFailedTest() { driver.Navigate().GoToUrl("https://example.com"); Assert.Fail("模拟测试失败场景"); } }
关键说明
[TearDown]的作用:每个测试用例执行结束后都会运行这个方法,能精准捕获单个测试的失败状态。- 唯一文件名:用测试名称+时间戳命名,避免不同测试的截图互相覆盖。
- 自动创建文件夹:
Directory.CreateDirectory会自动处理文件夹不存在的情况,不用手动提前创建。 - Azure DevOps适配:
TestContext.AddTestAttachment会把截图和当前测试结果绑定,流水线运行时,只要测试任务开启了“上传测试附件”选项,就能在Azure DevOps的“测试结果”模块里看到对应的截图。
Azure DevOps流水线配置注意
在流水线的测试任务(比如Visual Studio Test或NUnit任务)中,确保勾选“上传测试附件”选项,这样流水线会自动收集测试相关的附件(包括截图)并展示在测试结果里。
内容的提问来源于stack exchange,提问作者Mariia
相关产品推荐
相关产品推荐

