1、創建監聽器類TestNGListener,重寫onTestFailure方法,里面定義了 監聽的driver ,截圖文件路徑和名稱
package utils;
import cases.AppiumBasic;
import io.appium.java_client.AppiumDriver;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestNGListener extends TestListenerAdapter{
@Override
public void onTestFailure(ITestResult tr){
try {
super.onTestFailure(tr);
//調用屏幕截圖方法
captureScreenShot(tr,tr.getMethod().getMethodName());
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
public void captureScreenShot(ITestResult result,String name) {
AppiumDriver driver = AppiumBasic.getDriver(); File srcFile = driver.getScreenshotAs(OutputType.FILE);
String filepath = "E:\\appimage\\education_test";
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmss");
try {
FileUtils.copyFile(srcFile, new File(filepath + File.separator +name+"-"+ dateFormat.format(new Date()) + ".png"));
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
2、driver的來源
package cases;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.BeforeClass;
import java.net.MalformedURLException;
import java.net.URL;
public class AppiumBasic {
public static AndroidDriver driver;
@BeforeClass
public void beforeClass() throws MalformedURLException {
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability(CapabilityType.BROWSER_NAME,"");
caps.setCapability("platformName","Android"); //測試平台
caps.setCapability("deviceName","127.0.0.1:62025"); //指定測試機的ID
caps.setCapability("appPackage","ai.avatec.android"); //被測APP包名
caps.setCapability("appActivity","ai.avatec.android.ui.main.view.MainActivity"); //被測APP入口activity
caps.setCapability("appWaitActivity","ai.avatec.android.ui.main.view.MainActivity");
caps.setCapability("noSign",true); //noSign表示不重簽名,設置為true表示不重簽名app
caps.setCapability(AndroidMobileCapabilityType.NO_SIGN,true);
//UNICODE_KEYBOARD表示unicode輸入法,支持中文輸入,支持鍵盤隱藏
caps.setCapability(AndroidMobileCapabilityType.UNICODE_KEYBOARD,true);
//重置輸入法為設備原來的
caps.setCapability(AndroidMobileCapabilityType.RESET_KEYBOARD,true);
caps.setCapability("automationName", "UiAutomator2");
//每次啟動時覆蓋session,否則第二次后運行會報錯不能新建session
caps.setCapability("sessionOverride",true);
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), caps);
}
public static AppiumDriver getDriver() { return driver; }
}
3、配置監聽器
有兩種配置方法
(1)有兩種配置方法在需要捕捉的類上方
(2)在testng.xml里配置監聽器

兩種方式的差別在於,類上方配置,只能抓獲這個類報錯的截圖。