思路:
1.写一个类继承TestListenerAdapter,覆写onTestFailure()方法
2.在onTestFailure方法里,调用selenium的TakesScreenShot的getScreenshotAs()方法,完成截图
3.在testng.xml里注册监听器<listener class-name="com.util.TakeScreenshotListener" />
具体实现:
1.写一个类继承TestListenerAdapter,覆写onTestFailure()方法
package com.util; import org.openqa.selenium.WebDriver; import org.testng.ITestResult; import org.testng.TestListenerAdapter; import knife.BrowserEmulator; public class TakeScreenshotListener extends TestListenerAdapter { @Override public void onTestFailure(ITestResult tr) { // TODO Auto-generated method stub super.onTestFailure(tr); // 类名为全类名,包含包名:com.testcases.LoginTest String classname = tr.getTestClass().getName(); // 方法名为执行的方法:testWrongPasswordLogin String methodname = tr.getMethod().getMethodName(); // 此处为获取当前的driver,可以写一个静态方法来获取当前driver,然后来调用 WebDriver driver = BrowserEmulator.getWebDriver(); TakeScreenshot shot = new TakeScreenshot(driver); shot.takeScreenShot(classname, methodname); } }
2.在onTestFailure方法里,调用selenium的TakesScreenShot的getScreenshotAs()方法,完成截图
package com.util; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; public class TakeScreenshot { WebDriver driver; String filePath; public TakeScreenshot(WebDriver driver) { this.driver = driver; } public void takeScreenShot(String classname, String methodname) { // 获取截图file File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); try { // 将图片移动到指定位置 FileUtils.moveFile(file, new File(getFilePath(classname, methodname))); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public String getFilePath(String classname, String methodname) { // 创建储存图片的路径,不存在则创建 File dir = new File("test-output/snapshot"); if (!dir.exists()) { dir.mkdirs(); } SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss"); String dateStr = dateFormat.format(new Date()); // 获取新的文件名,包含时间,类名,方法名 String fileName = dateStr + "_" + classname + "_" + methodname + ".jpg"; // 获取文件路径 String filePath = dir.getAbsolutePath() + "/" + fileName; return filePath; } }
3.在testng.xml里注册监听器<listener class-name="com.util.TakeScreenshotListener" />
<listeners> <!-- 如果用例断言失败进行截图 --> <listener class-name="com.util.TakeScreenshotListener" /> </listeners>