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

本文关键字:报告 插入 屏幕截图 执行 测试 SpecRun SpecFlow | 更新日期: 2023-09-27 18:29:26

我正在使用SpecFlowSelenium WebDriverSpecRun作为测试运行程序来创建和执行自动化测试用例,我正在寻找在测试执行报告中插入屏幕截图的解决方案。

我写了一个方法来创建每个Assert函数后的屏幕截图。图像被保存到特定的位置,但当我进行结果分析时,我必须遵循报告和图像。如果能把它们放在同一个位置(正好在报表html中),那就太好了。

是否有任何方法可以执行此操作(类似于控制台输出)?

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

(转发自https://groups.google.com/forum/#!主题/specrun/8-G0TgOBUbY)

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

  1. 将屏幕截图保存到输出文件夹(这是运行测试的当前工作文件夹)
  2. 从测试中向控制台写入一个文件行:console.WriteLine("file:///C:''文件的完整路径.png")
  3. 确保生成的图像也作为工件保存在构建服务器上

在生成报告的过程中,SpecRun会扫描测试输出中的此类文件URL,并将其转换为具有相对路径的锚标记,这样,无论您在哪里分发报告文件(只要图像在其旁边),这些标签都可以工作。当然,您也可以将图像映射到子文件夹中。

下面是一个使用SeleniumWebDriver的代码片段。这也将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);
        }
    }

尽管这篇文章已经发布了3年,但它确实帮助了我和我找到了如何将图像直接嵌入HTML报告中,而不仅仅是显示为链接,从而消除了从报告中逐个打开图像的需要。

我认为这对其他人也有用。这是通过更新默认报告模板来完成的。请参阅教程中的"包括屏幕截图"部分:-自定义报告。我也遵循了同样的做法,但我没有遇到什么问题。我通过将报表模板中的行固定为<pre class="log">@Raw(FormatTechMessages(traceEvent.TechMessages.TrimEnd()).Replace("SCREENSHOT[ <a href=","<img width=100% src=").Replace("</a> ]SCREENSHOT", "</img>"))</pre>

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

希望这能帮上忙。

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

使用带有"["符号的截屏方法破坏了模板,另外我必须分别使用"answers"才能使模板工作,在我的情况下,最终的模板代码看起来是:

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

类中的代码:

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