testNG里有一个异常监听类,失败时会执行类里的相关方法
DriverBase 截图类
TestngListenerScreen 异常监听类
Test1 测试类
1.DriverBase类
package com.cmall.screenshot; import com.cmall.appium.DriverFactory; import com.cmall.appium.Helper; import com.cmall.jdjr.pages.Modules.Integration.HomePage; import com.cmall.utils.LogUtil; import com.cmall.utils.PropertyUtil; import io.appium.java_client.MobileElement; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.pagefactory.AppiumFieldDecorator; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.support.PageFactory; import org.testng.annotations.Test; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.concurrent.TimeUnit; public class DriverBase { private static AndroidDriver<MobileElement> driver = null; private Helper helper; private LogUtil log = new LogUtil(DriverBase.class); /** * 获取driver * */ public AndroidDriver<MobileElement> getDriver() { return Test1.mdriver; } /** * 自动截图 * */ public void takeScreenShot(String methodName) { SimpleDateFormat sf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); Calendar cal = Calendar.getInstance(); Date date = cal.getTime(); String dateStr = sf.format(date);//上面几行代码的意思都是获取时间,并且格式化,用来作为图片的名称 String path = this.getClass().getSimpleName() + "_" + methodName + "_" + dateStr + ".png"; //因为我们截图是需要用到driver的,所以这里需要获取driver,这个driver是获取的当前对象的driver takeScreenShot((TakesScreenshot) this.getDriver(), path); } /** * 传入参数截图 * */ public void takeScreenShot(TakesScreenshot drivername, String path) { String currentPath = PropertyUtil.getString("screenPic_dir"); File scrFile = drivername.getScreenshotAs(OutputType.FILE); try { FileUtils.copyFile(scrFile, new File(currentPath + "\" + path)); } catch (Exception e) { e.printStackTrace(); } finally { log.error("<a href=" + currentPath + " target=_blank>Failed Screen Shot</a>"); System.out.println("截图成功"); } } public void setDriver(AndroidDriver<MobileElement> driver){ this.driver = driver; } }
2.TestngListenerScreen类
package com.cmall.screenshot; import org.testng.ITestContext; import org.testng.ITestResult; import org.testng.TestListenerAdapter; public class TestngListenerScreen extends TestListenerAdapter { @Override public void onTestSuccess(ITestResult tr) { super.onTestSuccess(tr); } // 主要是用到这个方法了,当你报错时他会监听到,然后就会执行截图操作 @Override public void onTestFailure(ITestResult tr) { super.onTestFailure(tr); System.out.println("####################################################"); System.out.println(tr); System.out.println("####################################################"); takeScreenShot(tr,tr.getMethod().getMethodName());//第二个参数表示哪个类产生的异常 } @Override public void onTestSkipped(ITestResult tr) { super.onTestSkipped(tr); } @Override public void onTestStart(ITestResult result) { super.onTestStart(result); } @Override public void onStart(ITestContext testContext) { super.onStart(testContext); } @Override public void onFinish(ITestContext testContext) { super.onFinish(testContext); } private void takeScreenShot(ITestResult tr,String methodName) { DriverBase driverBase = (DriverBase) tr.getInstance(); driverBase.takeScreenShot(methodName); } }
3.Test1测试类
package com.cmall.screenshot; import com.cmall.appium.DriverFactory; import com.cmall.appium.Helper; import com.cmall.appium.MultideviceManage; import com.cmall.http.LogUtil; import com.cmall.jdjr.pages.Modules.Integration.HomePage; import io.appium.java_client.MobileElement; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.pagefactory.AppiumFieldDecorator; import org.openqa.selenium.support.PageFactory; import org.testng.annotations.Listeners; import java.util.concurrent.TimeUnit; import org.testng.annotations.Test; @Listeners({ TestngListenerScreen.class }) public class Test1 extends DriverBase { static AndroidDriver<MobileElement> mdriver = null; private LogUtil log = new LogUtil(Test.class); MultideviceManage m = new MultideviceManage(); Helper helper; public Test1(){ log.info("---------屏幕截图测试类---------------"); } @Test public void test(){ mdriver = DriverFactory.initDriver(4723,"TWGDU16B26001079"); HomePage homePage = new HomePage(); PageFactory.initElements(new AppiumFieldDecorator(mdriver, 20 , TimeUnit.SECONDS), homePage); // int a=1/0;//没预测到的--会截图 try { Thread.sleep(2000); helper = new Helper(mdriver); helper.clickonElement(homePage.精选); // Assert.assertEquals(1,2);//会截图 //throw new IllegalArgumentException("参数长度不是7位"); //不会截图 int b=1/0;//能预测到被catch到的 不会截图 } catch (Exception e) { e.printStackTrace(); } } }
4.配置xml文件
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="TestngListenerScreen" verbose="1" > <listeners> <listener class-name="com.cmall.screenshot.TestngListenerScreen"></listener> </listeners> <test name = "Test" > <classes> <class name="com.cmall.screenshot.ScreenTest"/> </classes> </test> </suite>
5.把xml文件配置在pom.xml里