思路:
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>