appium之事件监听(二)

来源:互联网 发布:精通matlab混合编程 编辑:程序博客网 时间:2024/06/06 03:23

续上一篇appium之事件监听(一)

写起,代码上!

/** * @version:1.0 * @description:appium事件监听 * @author songer.xing * @date:2017-4-19 * @history: */public class AppiumEventListener implements AppiumWebDriverEventListener {static Logger log = LogManager.getLogger(AppiumEventListener.class.getCanonicalName());private String locator = null;private MyDriver myDriver;@Overridepublic void beforeChangeValueOf(WebElement arg0, WebDriver arg1) {}@Overridepublic void afterChangeValueOf(WebElement arg0, WebDriver arg1) {}@Overridepublic void beforeFindBy(final By by, WebElement element, WebDriver driver) {try {locator = splitBy(by);} catch (Exception e) {log.error("by不能按格式切割!");}try {WebDriverWait wait = new WebDriverWait(driver,10);wait.until(new ExpectedCondition<WebElement>() {@Overridepublic WebElement apply(WebDriver driver) {return driver.findElement(by);}}).isDisplayed();log.info("beforeFindBy:seaching............"+ driver.findElement(by));} catch (Exception e) {try {log.error("beforeFindBy监听" + Constant.LISTENER_WAIT_SECONDS+ "秒" + " " + splitBy(by) + "不可见");} catch (Exception e2) {log.error("beforeFindBy监听" + Constant.LISTENER_WAIT_SECONDS+ "秒,by不能按格式切割!");}}}@Overridepublic void afterFindBy(By by, WebElement element, WebDriver driver) {}@Overridepublic void beforeClickOn(WebElement element, WebDriver driver) {try {log.info("beforeClickOn:Clicking............"+ splitElement(element));} catch (Exception e) {log.error("element不能按格式切割!");}}@Overridepublic void afterClickOn(WebElement element, WebDriver driver) {}@Overridepublic void beforeNavigateBack(WebDriver arg0) {}@Overridepublic void afterNavigateBack(WebDriver arg0) {}@Overridepublic void beforeNavigateForward(WebDriver arg0) {}@Overridepublic void afterNavigateForward(WebDriver arg0) {}@Overridepublic void beforeNavigateRefresh(WebDriver arg0) {}@Overridepublic void afterNavigateRefresh(WebDriver arg0) {}@Overridepublic void beforeNavigateTo(String arg0, WebDriver arg1) {}@Overridepublic void afterNavigateTo(String arg0, WebDriver arg1) {}@Overridepublic void beforeScript(String arg0, WebDriver arg1) {}@Overridepublic void afterScript(String arg0, WebDriver arg1) {}@Overridepublic void onException(Throwable error, WebDriver arg1) {}
private String splitElement(WebElement element) {String str = element.toString().split("-> ")[1];return str.substring(0, str.length() - 1);}private String splitBy(By by) {String str = by.toString().split("-")[1].toString().split(":")[3];return str.substring(0, str.length() - 3);}}

以上功能还没加完,以后想到什么再接着加,这里只写了element的等待跟部分log,大家可以自行往里面加功能,比如异常截图等啊,截图我在testng里面做了,就没写在这里。

监听如下业务代码,我是用po模式写的页面类,大家可以不用我这种方式,只要随便写点业务代码调试即可,我这里贴业务代码是为了方便对照下面的日志看,更好理解appium监听器,不用照搬。

/** * @version:1.0 * @description: 登录页面类 * @author songer.xing * @date:2017-4-17 * @history: */public class Login extends BasePage {@AndroidFindBy(id = "com.fxicrazy.sjml:id/etName")private AndroidElement etName;@AndroidFindBy(id = "com.fxicrazy.sjml:id/etPwd")private AndroidElement etPwd;@AndroidFindBy(id = "com.fxicrazy.sjml:id/btnLogin")private WebElement btnLogin;static Logger log = LogManager.getLogger(Login.class.getCanonicalName());public Login(AndroidDriver<WebElement> driver) {super(driver);}public void login(String iphone, String password,String appPackage,String appActivity) {etName.sendKeys(iphone);etPwd.sendKeys(password);for (int i = 1; i <= 10; i++) {if (btnLogin.isEnabled()) {log.info("等待秒数:"+i);break;} else {Commonways.sleep(i);}}if (!btnLogin.isEnabled()) {log.error("等待10秒,登录按钮仍然不可点击");log.error("重启app...........");driver.startActivity(appPackage,appActivity);} else {btnLogin.click();}}}

下面看下运行效果

------------------------------------------------------- T E S T S-------------------------------------------------------Running TestSuite[2017-04-21 11:52:18:330] [INFO] - com.lzmh.autoTest.util.listenter.TestNGListener.onStart(TestNGListener.java:59) - Test Start[2017-04-21 11:52:28:368] [INFO] - com.lzmh.autoTest.util.UIScreenShot.uiScreenShotInit(UIScreenShot.java:45) - 初始化拍照类===========Start AndroidDriver四月 21, 2017 11:52:28 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefreshINFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@42cf3555: startup date [Fri Apr 21 11:52:28 CST 2017]; root of context hierarchy四月 21, 2017 11:52:28 上午 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring[INFO] - com.lzmh.autoTest.util.listenter.TestNGListener.onTestStart(TestNGListener.java:53) - Test Finsh
[INFO] - com.lzmh.autoTest.util.listenter.AppiumEventListener.beforeFindBy - beforeFindBy:seaching............[[AndroidDriver:  on LINUX 
      (8db1c9f7-0126-4789-aec5-b5c95825aed2)] -> id: com.fxicrazy.sjml:id/etName][INFO] - com.lzmh.autoTest.util.listenter.AppiumEventListener.beforeFindBy - beforeFindBy:seaching............[[AndroidDriver:  on LINUX 
      (8db1c9f7-0126-4789-aec5-b5c95825aed2)] -> id: com.fxicrazy.sjml:id/etPwd][INFO] - com.lzmh.autoTest.util.listenter.AppiumEventListener.beforeFindBy - beforeFindBy:seaching............[[AndroidDriver:  on LINUX 
      (8db1c9f7-0126-4789-aec5-b5c95825aed2)] -> id: com.fxicrazy.sjml:id/btnLogin][INFO] - com.lzmh.autoTest.pages.Login.login(Login.java:40) - 等待秒数:1[INFO] - com.lzmh.autoTest.util.listenter.AppiumEventListener.beforeFindBy - beforeFindBy:seaching............[[AndroidDriver:  on LINUX 
      (8db1c9f7-0126-4789-aec5-b5c95825aed2)] -> id: com.fxicrazy.sjml:id/btnLogin][INFO] - com.lzmh.autoTest.util.listenter.AppiumEventListener.beforeFindBy - beforeFindBy:seaching............[[AndroidDriver:  on LINUX 
      (8db1c9f7-0126-4789-aec5-b5c95825aed2)] -> id: com.fxicrazy.sjml:id/btnLogin][INFO] - com.lzmh.autoTest.util.listenter.AppiumEventListener.beforeClickOn - beforeClickOn:Clicking............id: com.fxicrazy.sjml:id/btnLogin[INFO] - com.lzmh.autoTest.util.listenter.AppiumEventListener.beforeFindBy - beforeFindBy:seaching............[[AndroidDriver:  on LINUX 
      (8db1c9f7-0126-4789-aec5-b5c95825aed2)] -> id: com.fxicrazy.sjml:id/tv_login][INFO] - com.lzmh.autoTest.util.listenter.AppiumEventListener.beforeFindBy - beforeFindBy:seaching............[[AndroidDriver:  on LINUX 
      (8db1c9f7-0126-4789-aec5-b5c95825aed2)] -> id: com.fxicrazy.sjml:id/tv_login][INFO] - com.lzmh.autoTest.pages.Mys.isLogin(Mys.java:46) - 登录成功[INFO] - com.lzmh.autoTest.util.listenter.TestNGListener.onTestSuccess(TestNGListener.java:25) - Test Success[INFO] - com.lzmh.autoTest.util.listenter.TestNGListener.onTestStart(TestNGListener.java:53) - Test Finsh

日志太长了,一行写不下,被我手动换行了。可能看的有点别扭。

看到日志后有没有豁然开朗?再也不用为错误发生后,排错定位不准而浪费时间,每一步操作都自动打印,而且是无需将appium二次封装的像粽子似的,就可以做到更好的效果,而且可以自动监听进行等待,如看上面FindBy有的同一个element,打印多次log,就是在等待element isDisplayed,调试还发现如果设置wait 10s还没有找到element,它会自动重跑一次方法再找,当我把wait 设置5s,他会重跑三次,应该是appium哪个方法有设置了监听失败重跑多少时间,具体是哪个方法设置了,我还没找到,大家有找到可以分享出来。




0 0
原创粉丝点击