【失败截图】selenium运行失败后自动截图

时间:2022-09-20 15:23:50

思路:

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>