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