UIAutomator2.0详解(UIDevice篇----UIWatcher)
来源:互联网 发布:手机钢琴谱制作软件 编辑:程序博客网 时间:2024/05/21 22:53
UIWatcher,是UIAutomator的接口类,用于处理测试中出现的“意外打断”情况(若不对意外情况进行处理,将导致CASE Failed,影响测试结果)。例如电话打入,闹钟之类的界面插入。
该类只有一个函数需要实现。
public boolean checkForCondition();
该方法的返回值为布尔类型。若为true,则表示该Watcher符合条件,被触发。否则,表示不符合条件,未被触发。当然,返回结果由coder自己说了算。
那什么时候,触发UIWatcher呢?官方文档给出了说明。
仅在未找到以UISelector为查询条件的UI控件时,才由系统框架触发,按照UIWatcher的注册顺序,逐一执行。并根据checkForCondition方法的返回值,认定该UIWatcher是否被触发(是否符合触发条件)。
UIDevice共提供了6个相关方法,分别是
public void registerWatcher(String name, UiWatcher watcher)//用于注册public boolean hasAnyWatcherTriggered() //判断是否有任何一个UIWatcher被触发public boolean hasWatcherTriggered(String watcherName)//判断某个UIWatcher是否被触发public void resetWatcherTriggers()//重置所有UIWatcher的Trigger标记public void removeWatcher(String name) //移除UIWatcherpublic void runWatchers()//手动运行所有UIWatcher
我们还是使用示例来演示方法的使用。
测试过程
1.创建三个UIWatcher
2.启动APP1(test),并连续点击check1
3.启动APP2(salaryshow),以打断连续的点击
LogAndFalseUIWatcher 类
public class LogAndFalseUIWatcher implements UiWatcher { private final String TAG=getClass().getName(); @Override public boolean checkForCondition() { Log.i(TAG, "only return false"); return false; }}
LogAndTrueUIWatcher 类
public class LogAndTrueUIWatcher implements UiWatcher { private final String TAG=getClass().getName(); @Override public boolean checkForCondition() { Log.i(TAG, "only return true"); return true; }}
PressBackUIWatcher 类
public class PressBackUIWatcher implements UiWatcher { private final String TAG=getClass().getName(); private UiDevice mUIDevice; public PressBackUIWatcher(UiDevice mUIDevice) { this.mUIDevice = mUIDevice; } @Override public boolean checkForCondition() { Log.i(TAG, "press back"); mUIDevice.pressBack(); return false; }}
核心测试代码
public class UIWatcherTest extends UIDeviceTest { private String mPackageName="com.breakloop.test"; private String mSalaryPackageName="com.breakloop.salaryshow"; private String mActivityName=".MainActivity"; private String text_check="check"; private long timeout=1000l; @Before public void start(){ Utils.startAPP(mDevice,mPackageName,mActivityName); waitForAMoment(); } private void waitForAMoment(){ mDevice.waitForWindowUpdate(mPackageName,timeout); } @After public void end(){ Utils.closeAPP(mDevice,mPackageName); waitForAMoment(); } @Test public void test1(){ boolean result=true; UiObject ui=mDevice.findObject(new UiSelector().textStartsWith(text_check)); //注册UIWatcher mDevice.registerWatcher("LogTrue",new LogAndTrueUIWatcher()); mDevice.registerWatcher("LogFalse",new LogAndFalseUIWatcher()); mDevice.registerWatcher("PressBack", new PressBackUIWatcher(mDevice)); Assert.assertFalse(mDevice.hasAnyWatcherTriggered()); //创建线程,在2秒后,启动其他APP,以打断现有操作 new Thread() { @Override public void run() { Log.i(TAG, "run: start Salary APP"); try { sleep(timeout*2); } catch (InterruptedException e) { Log.i(TAG, "Sleep failed"); e.printStackTrace(); } Utils.startAPP(mDevice,mSalaryPackageName,mActivityName); } }.start(); //连续点击checkbox,之后将被打断 for(int loop=0;loop<10;loop++){ try { Log.i(TAG, "Click Check "+loop); ui.click(); waitForAMoment(); } catch (UiObjectNotFoundException e) { e.printStackTrace(); result=false; } } //查看UIWatcher触发情况,即各UIWatcher的checkForCondition方法返回值 Assert.assertTrue("LogTrue was Triggered", mDevice.hasWatcherTriggered("LogTrue")); Assert.assertFalse("LogFalse was not Triggered",mDevice.hasWatcherTriggered("LogFalse")); Assert.assertFalse("PressBack was not Triggered",mDevice.hasWatcherTriggered("PressBack")); //重置各UIWatcher的触发标志位 mDevice.resetWatcherTriggers(); //再次查看UIWatcher触发情况 Assert.assertFalse("LogTrue was not Triggered",mDevice.hasWatcherTriggered("LogTrue")); Assert.assertFalse("LogFalse was not Triggered",mDevice.hasWatcherTriggered("LogFalse")); Assert.assertFalse("PressBack was not Triggered",mDevice.hasWatcherTriggered("PressBack")); //移除LogTrue,然后运行剩余UIWatcher mDevice.removeWatcher("LogTrue"); mDevice.runWatchers(); //移除LogFalse,然后运行剩余UIWatcher mDevice.removeWatcher("LogFalse"); mDevice.runWatchers(); //移除PressBack,然后运行剩余UIWatcher mDevice.removeWatcher("PressBack"); mDevice.runWatchers(); //查看打断后的CASE是否能够PASS assertTrue(result); }}
执行效果如下
执行结果如下
11-29 19:31:25.404 I/TestRunner: started: test1(com.breakloop.u2demo.uidevice.UIWatcherTest)11-29 19:31:28.283 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 011-29 19:31:28.284 I/com.breakloop.u2demo.uidevice.UIWatcherTest: run: start Salary APP11-29 19:31:30.287 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 111-29 19:31:32.312 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 211-29 19:31:32.327 I/com.breakloop.u2demo.uidevice.uiwatcher.LogAndTrueUIWatcher: only return true11-29 19:31:32.327 I/com.breakloop.u2demo.uidevice.uiwatcher.LogAndFalseUIWatcher: only return false11-29 19:31:32.328 I/com.breakloop.u2demo.uidevice.uiwatcher.PressBackUIWatcher: press back11-29 19:31:36.302 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 311-29 19:31:38.305 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 411-29 19:31:40.316 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 511-29 19:31:42.325 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 611-29 19:31:44.333 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 711-29 19:31:46.337 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 811-29 19:31:48.351 I/com.breakloop.u2demo.uidevice.UIWatcherTest: Click Check 911-29 19:31:50.362 I/com.breakloop.u2demo.uidevice.uiwatcher.LogAndFalseUIWatcher: only return false11-29 19:31:50.362 I/com.breakloop.u2demo.uidevice.uiwatcher.PressBackUIWatcher: press back11-29 19:31:50.436 I/com.breakloop.u2demo.uidevice.uiwatcher.PressBackUIWatcher: press back11-29 19:31:56.078 I/TestRunner: finished: test1(com.breakloop.u2demo.uidevice.UIWatcherTest)
参考博文
https://testerhome.com/topics/465
http://blog.csdn.net/itfootball/article/details/42464875
http://blog.chengyunfeng.com/?p=505
阅读全文
0 0
- UIAutomator2.0详解(UIDevice篇----UIWatcher)
- UIAutomator2.0详解(UIDevice篇---- 序)
- UIAutomator2.0详解(UIDevice篇----Wait)
- UIAutomator2.0详解(UIDevice篇----waitForIdle)
- UIAutomator2.0详解(UIDevice篇----waitForWindowUpdate)
- UIAutomator2.0详解(UIDevice篇----Hierarchy)
- UIAutomator2.0详解(UIDevice篇----截屏)
- UIAutomator2.0详解(UIDevice篇----performActionAndWait)
- UIAutomator2.0详解(UIDevice篇----获取UIDevice对象)
- UIAutomator2.0详解(UIDevice篇----Screen操作)
- UIAutomator2.0详解(UIDevice篇----触屏操作1)
- UIAutomator2.0详解(UIDevice篇----触屏操作2)
- UIAutomator2.0详解(UIDevice篇----触屏操作3)
- UIAutomator2.0详解(UIDevice篇----获取控件)
- UIAutomator2.0详解(UIDevice篇----LastTraversedText质疑)(未解)
- UIAutomator2.0详解(UIDevice篇----获取设备名称和Package名称)
- UIAutomator2.0详解(入门篇)
- UIAutomator2.0详解(JUnit Annotation篇)
- java中JFrame类中函数addWindowListener(new WindowAdapter)
- PHP 新闻列表实例(数据库读取 删除数据,页面跳转)
- Python之异常处理
- responsebody.contentLength()获取到的值为-1
- Android中GOT表HOOK手动实现续
- UIAutomator2.0详解(UIDevice篇----UIWatcher)
- Java的for循环与for循环的嵌套
- docker windows 阿里镜像加速器设置
- G1,CMS及PARALLEL GC的比较
- 通用代码审计思路
- 对抗神经网络GAN
- 服务计算作业6——cloudgo-data
- 如何开启WIN10的windows defender?
- 使用百度地图API实现地图生成、标记以及标注