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

时间:2012-06-20 14:53:45

标签: java selenium screenshot testng

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

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

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

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

我能够实现Listener并拦截最初建议的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输出日志中推送我的信息,但是在结果 - >失败的方法 - >失败的方法日志中没有。

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

enter image description here

8 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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

答案 2 :(得分: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);

答案 3 :(得分:0)

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

答案 4 :(得分: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 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);

}

enter image description here

答案 5 :(得分:0)

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

答案 6 :(得分: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上应该几乎相同)

答案 7 :(得分:0)

enter image description here,您可以使用@After方法获取失败的测试用例屏幕快照,其中包含失败的测试类的名称。 在以下代码段中使用 enter image description here