在SpecRun / SpecFlow测试执行报告中插入屏幕截图

时间:2013-08-29 13:53:39

标签: c# selenium specflow test-reporting specrun

我正在使用 SpecFlow Selenium WebDriver SpecRun 作为测试运行器来创建和执行自动化测试用例我正在寻找在测试执行报告中插入屏幕截图的解决方案。

我写了一个方法来在每个Assert函数之后创建截图。图像保存到特定位置,但是当我进行结果分析时,我必须遵循报告和图像。将它们放在同一位置(恰好在报告html中)会很高兴。

有没有办法执行此操作(类似于控制台输出)?

3 个答案:

答案 0 :(得分:11)

(从https://groups.google.com/forum/#!topic/specrun/8-G0TgOBUbY重新发布)

是的,这是可能的。您必须执行以下步骤:

  1. 将屏幕截图保存到输出文件夹(这是运行测试的当前工作文件夹)。
  2. 从测试中向控制台写出一个文件行:Console.WriteLine(“file:/// C:\ fullpath-of-the-file.png”);
  3. 确保生成的图像也作为工件保存在构建服务器上
  4. 在生成报告期间,SpecRun会扫描测试输出以查找此类文件URL并将其转换为具有相对路径的锚标记,以便在分发报告文件的任何位置(只要图像位于其旁边)都可以使用这些文件。您当然也可以将图像添加到子文件夹中。

    以下是与Selenium WebDriver配合使用的代码段。这也将HTML源与屏幕截图一起保存。

        [AfterScenario]
        public void AfterWebTest()
        {
            if (ScenarioContext.Current.TestError != null)
            {
                TakeScreenshot(cachedWebDriver);
            }
        }
    
        private void TakeScreenshot(IWebDriver driver)
        {
            try
            {
                string fileNameBase = string.Format("error_{0}_{1}_{2}",
                                                    FeatureContext.Current.FeatureInfo.Title.ToIdentifier(),
                                                    ScenarioContext.Current.ScenarioInfo.Title.ToIdentifier(),
                                                    DateTime.Now.ToString("yyyyMMdd_HHmmss"));
    
                var artifactDirectory = Path.Combine(Directory.GetCurrentDirectory(), "testresults");
                if (!Directory.Exists(artifactDirectory))
                    Directory.CreateDirectory(artifactDirectory);
    
                string pageSource = driver.PageSource;
                string sourceFilePath = Path.Combine(artifactDirectory, fileNameBase + "_source.html");
                File.WriteAllText(sourceFilePath, pageSource, Encoding.UTF8);
                Console.WriteLine("Page source: {0}", new Uri(sourceFilePath));
    
                ITakesScreenshot takesScreenshot = driver as ITakesScreenshot;
    
                if (takesScreenshot != null)
                {
                    var screenshot = takesScreenshot.GetScreenshot();
    
                    string screenshotFilePath = Path.Combine(artifactDirectory, fileNameBase + "_screenshot.png");
    
                    screenshot.SaveAsFile(screenshotFilePath, ImageFormat.Png);
    
                    Console.WriteLine("Screenshot: {0}", new Uri(screenshotFilePath));
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine("Error while taking screenshot: {0}", ex);
            }
        }
    

答案 1 :(得分:1)

尽管这篇文章已有3年历史,但它确实帮助了我,我发现如何将图像直接嵌入到HTML报告中,而不仅仅是显示为链接,从而无需从报告中逐个打开图像。

我认为这对其他人也有用。这是通过更新默认报告模板来完成的。 请参阅&#34;包括屏幕截图&#34; Tutorial:-Customising-Reports部分。我跟着一样但我没有什么问题。我通过修改报告模板中的行来修复它们 <pre class="log">@Raw(FormatTechMessages(traceEvent.TechMessages.TrimEnd()).Replace("SCREENSHOT[ <a href=","<img width=100% src=").Replace("</a> ]SCREENSHOT", "</img>"))</pre>

我已将图像的宽度更新为100%,因为这将适合单元格中的图像。

希望完全有帮助。

答案 2 :(得分:1)

我今天遇到了完全相同的问题

使用带有“[”符号的Screenshot方法另外破坏模板我必须分别使用'和'来模板工作,而在我的情况下,最终的模板代码看起来是:

<pre class="log">@Raw(FormatTechMessages(traceEvent.TechMessages.TrimEnd()).Replace("SCREENSHOTXX", "<img width=50% src='").Replace("XXSCREENSHOT", "'>"))</pre>

课堂上的代码:

Console.WriteLine($"SCREENSHOTXX {tempFileName} XXSCREENSHOT");