将屏幕截图附加到 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 失败的方法结果的主要内容,如果未能解决你的问题,请参考以下文章
我们可以将屏幕截图作为附件添加到 Azure 管道中的测试结果吗