将屏幕截图附加到 TestNG 失败的方法结果

Posted

技术标签:

【中文标题】将屏幕截图附加到 TestNG 失败的方法结果【英文标题】:Attaching screenshots to TestNG Failed methods results 【发布时间】:2012-06-22 17:58:59 【问题描述】:

我正在寻找一种将屏幕截图附加到 TestNG 报告的“结果”部分以获取失败方法的方法。

到目前为止,我能够通过实现以下功能将屏幕截图附加到 Reporter Output:

Reporter.log("<br> <img src=.\\screenshots\\" + fileName + " /> <br>");

但仍在努力将它们添加到失败方法的测试结果部分。

我能够实现侦听器并拦截最初在此处建议的 onTestFailure 操作: How can I include a failure screenshot to the testNG report

这是一个例子:

    @Override
public void onTestFailure(ITestResult result)  
    Reporter.setCurrentTestResult(result); 
    Reporter.log("<br> <img src=.\\screenshots\\Untitled.png /> <br>");
    Reporter.setCurrentTestResult(null); 

但是 Reporter.log 功能仍然将我的信息推送到 Reporter 输出日志中,但不在 Results->Failed methods->Failed method log 中。

更新(2014 年 3 月 14 日):我附上了屏幕截图以澄清我的问题。问题不在于捕获屏幕截图并将其附加到报告中。那部分工作正常。问题是屏幕截图附加到报告的测试输出部分,但我想在结果 -> 失败的方法中看到它。

【问题讨论】:

【参考方案1】:

我也实现了相同的扩展Testng TestListenerAdapter。通过捕获屏幕截图,然后使用 onTestFailure 将其附加到尺寸为 height=100 和 width=100 的图像的 Testng 报告中。如果这有助于解决您的问题,请参阅下文

    File scrFile = ((TakesScreenshot) WebdriverManager.globalDriverInstance).getScreenshotAs(OutputType.FILE);
      //Needs Commons IO library
      try 
        FileUtils.copyFile(scrFile, new File(file.getAbsolutePath()+ "/selenium-reports/html/" + result.getName() + ".jpg"));
        Reporter.log("<a href='"+ file.getAbsolutePath()+"/selenium-reports/html/" + result.getName() + ".jpg'> <img src='"+ file.getAbsolutePath()+"/selenium-reports/html/"+ result.getName() + ".jpg' height='100' width='100'/> </a>");
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    Reporter.setCurrentTestResult(null);

【讨论】:

嗨 Satish,谢谢你的回答,但我想我问的是另一个问题。我修改了我的原始评论以澄清我的问题。【参考方案2】:

除了上述之外,别忘了在你的 testng 套件 xml 中添加以下几行

<listeners>
    <listener class-name="com.tests.DotTestListener" />
</listeners>

如果您从命令行执行它,则作为列表器参数传递

java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -listener com.tests.DotTestListener test\testng.xml

参考:http://testng.org/doc/documentation-main.html#logging-listeners

【讨论】:

感谢卡马尔的回复。我用更多细节和屏幕截图修改了我的问题以说明我的问题。【参考方案3】:

我也遇到过同样的问题,但解决了。通过实施 SuitePanel,您将能够根据需要添加屏幕截图 https://github.com/cbeust/testng/blob/master/src/main/java/org/testng/reporters/jq/SuitePanel.java

除了

,我几乎不改原代码
... 
// Description?
String description = tr.getMethod().getDescription();
if (! Strings.isNullOrEmpty(description)) 
    xsb.push("em");
    xsb.addString("(" + description + ")");
    xsb.pop("em");

// Add screen shot here
xsb.push(“img”,”src”,imagePath);
xsb.pop(“img”);

xsb.pop(D);
xsb.pop(D);

【讨论】:

【参考方案4】:

如果要显示失败方法的屏幕截图,则必须捕获异常并修改其消息内容并将 img html 添加到该异常中,然后它才会出现。如果您需要示例,请告诉我

【讨论】:

【参考方案5】:

我有同样的问题,但现在已解决。我在基类中制作了一种捕捉屏幕截图的方法。此方法返回屏幕截图的完整路径。

public String getScreenshot (String screenshotName, WebDriver driver) throws IOException
    DateFormat dateformate = new SimpleDateFormat("dd-mm-yy-hh-mm-ss");
    Date date = new Date();
    String currentdate = dateformate.format(date);
    String imageName =screenshotName+currentdate;
    TakesScreenshot ts=(TakesScreenshot)driver;
    File source=ts.getScreenshotAs(OutputType.FILE);
    String location =System.getProperty("user.dir")+"\\testOutput\\screenshot\\"+imageName+".png";
    File screenshotLocation =new File (location);
    FileUtils.copyFile(source, screenshotLocation);
    return location;


通过更新testng TestNgListener-添加使用此路径在testng报告和报告日志中添加屏幕截图-

public void onTestFailure(ITestResult arg0) 
    Object currentClass = arg0.getInstance();
    WebDriver driver = ((BrowserSetup) currentClass).getDriver();
    String name = arg0.getName();
    System.out.println(name);
    try 
        String screenshotPath =getScreenshot(name, driver);
        System.out.println("Screenshot taken");
        String path = "<img src=\"file://" + screenshotPath + "\" alt=\"\"/>";
        System.out.println(screenshotPath+" and path - "+path);
        Reporter.log("Capcher screenshot path is "+path);
     catch (Exception e) 
        System.out.println("Exception while takescreenshot "+e.getMessage());
    
    printTestResults(arg0);


【讨论】:

【参考方案6】:

我建议您使用 ReportNG 而不是原始的 TestNG 报告。

【讨论】:

【参考方案7】:

如果问题只是截屏,你可以尝试这样获取:

private static byte[] GetCropImg(IWebDriver targetChrome, IWebElement targetElement)
        
            var screenshot = ((ITakesScreenshot)targetChrome).GetScreenshot();
            var location = targetElement.Location;
            using (MemoryStream stream = new MemoryStream(screenshot.AsByteArray))
            
                var rect = new Rectangle(location.X, location.Y, targetElement.Size.Width, targetElement.Size.Height);
                using (Bitmap bmpImage = new Bitmap(stream))
                
                    using (Bitmap cropedImag = bmpImage.Clone(rect, bmpImage.PixelFormat))
                    
                        using (MemoryStream ms = new MemoryStream())
                        
                            cropedImag.Save(ms, ImageFormat.Jpeg);

                            byte[] byteImage = ms.ToArray();
                            return byteImage;
                        
                    
                
            
        

然后你可以保存文件或保存 sting64

var imgString64 = Convert.ToBase64String(byteImage); //Get Base64

PS:在JAVA上应该差不多)

【讨论】:

【参考方案8】:

you 可以使用@After 方法获取失败的测试用例屏幕截图,其中包含失败的测试类的名称。 使用下面的代码段

【讨论】:

以上是关于将屏幕截图附加到 TestNG 失败的方法结果的主要内容,如果未能解决你的问题,请参考以下文章

将 TestNG 屏幕截图输出到 Jenkins

TestNG 中的非静态驱动程序和屏幕截图侦听器

我们可以将屏幕截图作为附件添加到 Azure 管道中的测试结果吗

Appium-测试失败后屏幕截图的

如何在 Jenkins 中将屏幕截图附加到 XCUITest 报告。只有通过 XCODE 运行才能看到截图

如何在 Cucumber Report 中自定义软断言期间附加/嵌入捕获的屏幕截图?