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

