7

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

到目前为止,我可以通过执行以下操作将我的屏幕截图附加到 Reporter Output:

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

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

我能够实现侦听器并拦截最初在此处建议的 onTestFailure 操作: 如何在 testNG 报告中包含失败屏幕截图

这是一个例子:

    @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 日):我附上了屏幕截图以澄清我的问题。问题不在于捕获屏幕截图并将其附加到报告中。那部分工作正常。问题是屏幕截图附加到报告的测试输出部分,但我想在结果 - > 失败方法中看到它。

在此处输入图像描述

4

8 回答 8

0

除了上面不要忘记将以下行添加到您的 testng 套件 xml

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

或者

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

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

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

于 2013-05-15T20:52:05.527 回答
0

我还实现了相同的扩展 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);
于 2012-06-21T04:18:36.500 回答
0

我有同样的问题,但它解决了。通过实施 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);
于 2014-04-16T01:46:49.553 回答
0

如果问题仅与获取屏幕截图有关,您可以尝试像这样获取它:

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上应该差不多)

于 2020-01-12T13:35:58.310 回答
0

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

于 2016-06-20T06:04:15.737 回答
0

在此处输入图像描述您可以使用 @After 方法获取失败的测试用例屏幕截图,其中包含失败的测试类的名称。使用下面的代码段 在此处输入图像描述

于 2020-06-18T12:13:58.417 回答
0

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

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 报告中添加屏幕截图以及通过更新 testng TestNgListener-

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);

}

在此处输入图像描述

于 2017-09-08T07:26:17.943 回答
0

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

于 2018-03-12T06:24:18.370 回答