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

Selenium C#实现测试失败(输错密码时)自动截图功能咨询

在Selenium C#中实现截图功能

Selenium C# 提供了原生截图能力,结合你代码中使用的 MSTest 框架,既可以手动触发截图(比如输入错误密码后立即执行),也能在测试失败时自动截图。以下是具体实现方案:

一、手动触发截图(输入错误密码后立即执行)

通过 ITakesScreenshot 接口实现截图,将 IWebDriver 实例转换为该接口后,即可调用截图方法。你可以封装一个复用的截图函数,在输入错误密码后直接调用。

修改后的完整代码示例:

namespace UITest
{
    [TestClass]
    public class Firefox
    {
        private IWebDriver Driver;
        private readonly int _waitingTime = 1000; // 示例等待时间(毫秒)
        private readonly By _soeUserLocator = By.Id("username"); // 替换为实际用户名定位器
        private readonly By _soePwLocator = By.Id("password"); // 替换为实际密码定位器

        [TestInitialize]
        public void Setup()
        {
            // 初始化Firefox驱动(需确保已配置geckodriver环境)
            Driver = new FirefoxDriver();
        }

        [TestMethod]
        public void AMDP()
        {
            Driver.Navigate().GoToUrl("https://Google.de");
            Driver.Manage().Window.Maximize();

            // 等待并输入用户名(建议用显式等待替代Thread.Sleep)
            Thread.Sleep(_waitingTime);
            Driver.FindElement(_soeUserLocator).SendKeys("TestUser");

            // 输入错误密码
            Thread.Sleep(_waitingTime);
            Driver.FindElement(_soePwLocator).SendKeys("WrongTestPassword");

            // 立即触发截图
            CaptureScreenshot("WrongPassword_Input");
        }

        private void CaptureScreenshot(string screenshotName)
        {
            if (Driver is not ITakesScreenshot screenshotDriver) return;

            var screenshot = screenshotDriver.GetScreenshot();
            // 定义截图保存路径(项目目录下的Screenshots文件夹)
            var screenshotDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Screenshots");
            Directory.CreateDirectory(screenshotDir); // 确保文件夹存在
            var savePath = Path.Combine(screenshotDir, $"{screenshotName}_{DateTime.Now:yyyyMMddHHmmss}.png");
            
            screenshot.SaveAsFile(savePath, ScreenshotImageFormat.Png);
        }

        [TestCleanup]
        public void Teardown()
        {
            Driver?.Quit();
        }
    }
}

核心要点:

  • 主流浏览器驱动(Firefox/Chrome/Edge等)都实现了 ITakesScreenshot 接口,可直接转换使用
  • 截图文件名添加时间戳,避免重复覆盖
  • 推荐用 WebDriverWait 显式等待替代 Thread.Sleep,提升测试稳定性:
    var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10));
    wait.Until(d => d.FindElement(_soeUserLocator).Displayed);
    

二、测试失败时自动截图

如果需要在测试断言失败、抛出异常时自动截图,可通过 MSTest 的 TestCleanup 方法结合 TestContext 实现:

修改后的测试类示例:

namespace UITest
{
    [TestClass]
    public class Firefox
    {
        private IWebDriver Driver;
        private readonly int _waitingTime = 1000;
        private readonly By _soeUserLocator = By.Id("username");
        private readonly By _soePwLocator = By.Id("password");

        // MSTest会自动注入TestContext,用于获取测试结果
        public TestContext TestContext { get; set; }

        [TestInitialize]
        public void Setup()
        {
            Driver = new FirefoxDriver();
        }

        [TestMethod]
        public void AMDP()
        {
            Driver.Navigate().GoToUrl("https://Google.de");
            Driver.Manage().Window.Maximize();

            Thread.Sleep(_waitingTime);
            Driver.FindElement(_soeUserLocator).SendKeys("TestUser");

            Thread.Sleep(_waitingTime);
            Driver.FindElement(_soePwLocator).SendKeys("Testpw");

            // 示例断言:如果登录失败(URL不包含dashboard),测试会失败并触发自动截图
            Assert.IsTrue(Driver.Url.Contains("dashboard"), "登录验证失败");
        }

        private void CaptureScreenshot(string screenshotName)
        {
            if (Driver is not ITakesScreenshot screenshotDriver) return;

            var screenshot = screenshotDriver.GetScreenshot();
            var screenshotDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Screenshots");
            Directory.CreateDirectory(screenshotDir);
            var savePath = Path.Combine(screenshotDir, $"{screenshotName}_{DateTime.Now:yyyyMMddHHmmss}.png");
            
            screenshot.SaveAsFile(savePath, ScreenshotImageFormat.Png);
        }

        [TestCleanup]
        public void Teardown()
        {
            // 判断当前测试是否失败,是则触发截图
            if (TestContext.CurrentTestOutcome == UnitTestOutcome.Failed)
            {
                CaptureScreenshot($"TestFailed_{TestContext.TestName}");
            }
            Driver?.Quit();
        }
    }
}

核心要点:

  • TestContext 是 MSTest 提供的测试上下文对象,需在测试类中声明公共属性,框架会自动赋值
  • 在 TestCleanup(测试结束后执行)中检查测试结果,失败则调用截图函数

注意事项

  • 确保截图保存目录有写入权限,否则会抛出 IO 异常
  • 若需全局监听所有测试失败事件,可实现 ITestListener 接口,适合大规模测试项目统一配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:06:25