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

Selenium C# NUnit:失败测试截图保存至指定文件夹问题求助

Selenium+C#+NUnit 失败测试截图保存方案

原代码的问题

  1. 生命周期钩子错误:用了[OneTimeTearDown],这个是所有测试跑完才执行,没法捕获单个测试的失败状态,应该用[TearDown](每个测试结束后触发)。
  2. 逻辑判断反转:原代码写的是!= ResultState.Failure,等于只有测试成功才截图,完全搞反了需求。
  3. 路径不完整:只指定了文件夹,没给具体文件名,SaveAsFile需要完整的文件路径才能保存。
  4. 格式枚举未正确引用:Png要写成ScreenshotImageFormat.Png,得确保引用了OpenQA.Selenium命名空间。
  5. 未检查文件夹存在:如果目标文件夹不存在,截图会保存失败。

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:15:40