文档章节

uiautomator中UiWatcher学习笔记(6)

我爱睡觉
 我爱睡觉
发布于 2017/06/24 17:36
字数 936
阅读 88
收藏 0

转:http://blog.csdn.net/itfootball/article/details/24054455


4.1版本


UiWatcher接口就一个方法


checkForCondition()


我们可以为一个UiObject注册一个UiWatcher,通过UiDevice.registerWatcher()方法。UiWatcher前辈总结文章。UiWatcher处理一些在ui测试过程中一些突发情况,这时候可以通过在checkForCondition做一些处理。让它返回到正常情况,继续让case跑下去。



可以看一下我用这个接口实现的一个接电话的case


uiautomator实现接电话的case

转:http://blog.csdn.net/itfootball/article/details/42464875


1.UiWatcher


该接口中只有一个方法


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public abstract boolean checkForCondition ()  

当我们通过UiSelector匹配控件的时候,如果失败后,会进入该方法进行验证。意思只要我们的控件找不到,都会进入该方法中,那么我们就可以在该方法中判断是否有电话打进来。首先我们去查看有电话打进来的界面,找到一个可以确定是接听界面就行。我们以拒绝接听按钮为标识(不缺钱的可以用接听电话为标识)。


case的写法


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class InCallTest extends UiAutomatorTestCase {  
  2.     private static final long TIME_OUT = 10 * 60 * 1000;  
  3.     private long currentTime;  
  4.     private boolean flag = true;  
  5.   
  6.     long eslcape = 0;  
  7.   
  8.     public void test_Call() throws InterruptedException,  
  9.             UiObjectNotFoundException {  
  10.         UiWatcher inComingWatcher = new MyWatcher();  
  11.         getUiDevice().registerWatcher("来电", inComingWatcher);  
  12.          
  13.         getUiDevice().pressBack();  
  14.         UiObject dialButton = new UiObject(  
  15.                 new UiSelector()  
  16.                         .resourceId("com.android.sprdlauncher1:id/workspace"));  
  17.         System.out.println("waiting for incoming");  
  18.         currentTime = System.currentTimeMillis();  
  19.         while (flag && eslcape < TIME_OUT) {  
  20.             dialButton.clickAndWaitForNewWindow();  
  21.             eslcape = System.currentTimeMillis() - currentTime;  
  22.         }  
  23.         assertFalse("没有收到来电", flag);  
  24.     }  
  25.   
  26.     class MyWatcher implements UiWatcher {  
  27.   
  28.         @Override   
  29.         public boolean checkForCondition() {  
  30.             UiObject inCall = new UiObject(  
  31.                     new UiSelector()  
  32.                             .resourceId("com.android.dialer:id/IncomingCallRejectButton"));  
  33.              
  34.             while (eslcape < TIME_OUT) {  
  35.                 if (inCall.exists()) {  
  36.                     System.out.println("you have a call");  
  37.                     try {  
  38.                         inCall.clickAndWaitForNewWindow();  
  39.                         flag = false;  
  40.                         return true;  
  41.                     } catch (UiObjectNotFoundException e) {  
  42.                         e.printStackTrace();  
  43.                     }  
  44.                 }  
  45.                 eslcape = System.currentTimeMillis() - currentTime;  
  46.             }  
  47.             return false;  
  48.         }  
  49.     }  
  50. }  


case解释


首先要了解进入uiwatcher方法中的机制,是在你某个控件找不到的情况下会进入。但是你得保证进入以后处理完来电界面以后,这条case得保证正确,那么说明回来以后这个控件要能找到。刚开始的时候,我认为来电后,点击接听,会出现通话画面,这个时候我们来判断该界面上的某一个控件是否存在,这样我们就能保证这条case执行完毕了。但是实验后,是不可以的。uiautomator只会在开始的界面上寻找,像通话界面它只会认为它是个弹出框。所以它会认为case执行失败。

所以后来我想到的解决方案是首先在主页面上找一个控件,点击后是没反应的,这样我就循环去点击。设定一个超时时间和一个标志位flag,让case一直等待着。当来电界面触发后,会进入uiwatcher后,处理完来电界面后,将标志flag设置为false。这样回来后这个控件仍然存在,但是这个时候flag已经为false。所以就不会再循环点击主界面上的控件了。case也会被认为是执行成功了,当不再进入循环后,我们判断一下flag的值。如果为true。说明没有被改变,那么也就没有接收到来电的界面。这个时候也应该判断为case失败。




执行case后的输出


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.  [exec] INSTRUMENTATION_STATUS: numtests=1  
  2.      [exec] INSTRUMENTATION_STATUS: stream=  
  3.      [exec] com.sprd.test.uiautomator.call.InCallTest:  
  4.      [exec] INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner  
  5.      [exec] INSTRUMENTATION_STATUS: test=test_Call  
  6.      [exec] INSTRUMENTATION_STATUS: class=com.sprd.test.uiautomator.call.InCallTest  
  7.      [exec] INSTRUMENTATION_STATUS: current=1  
  8.      [exec] INSTRUMENTATION_STATUS_CODE: 1  
  9.      [exec] waiting for incoming  
  10.      [exec] you have a call  
  11.      [exec] INSTRUMENTATION_STATUS: numtests=1  
  12.      [exec] INSTRUMENTATION_STATUS: stream=.  
  13.      [exec] INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner  
  14.      [exec] INSTRUMENTATION_STATUS: test=test_Call  
  15.      [exec] INSTRUMENTATION_STATUS: class=com.sprd.test.uiautomator.call.InCallTest  
  16.      [exec] INSTRUMENTATION_STATUS: current=1  
  17.      [exec] INSTRUMENTATION_STATUS_CODE: 0  
  18.      [exec] INSTRUMENTATION_STATUS: stream=  
  19.      [exec] Test results for WatcherResultPrinter=.  
  20.      [exec] Time: 17.053  
  21.      [exec] OK (1 test)  
  22.      [exec] INSTRUMENTATION_STATUS_CODE: -1  
  23. BUILD SUCCESSFUL  


后续的扩展


既然能监听到来电,那么下一步要实现控制2台机器实现A给B打电话的功能。这个要用到框架啦。




本文转载自:http://blog.csdn.net/zhangmiaoping23/article/details/52084410

我爱睡觉
粉丝 3
博文 2120
码字总数 0
作品 0
南昌
私信 提问
UIAutomator2.0记录

UIAutomator是不支持HyBrid项目的UI测试的,各种爬楼之后找到了一种方法,特此记录 去应用商店下载一款叫TalkBack的软件, 装到手机上,是没有页面的,有的手机需要的设置-辅助功能中开启,开启之后...

Magic_锋
03/06
39
0
万物有源_Appium框架原理浅析

其实我觉得Appium的Log已经格外人性化了,直接看debugLog,就可以了解流程和原理了。 一、安卓平台图解 二、原理 Appium是由Nodejs编写的,集成了现有优秀框架,以Selenium WebDriver的协议统...

维他ViTa
03/17
50
0
Uiautomator_Eclispe_Build_Run_plugins 插件安装和配置指南

UiautomatorEclispeBuildRunplugins 插件安装和配置指南 * Uiautomator自动化框架的缺点是编译和运行起来非常麻烦,需要手动执行CMD指令 * 这个插件主要是为了解决Uiautomator框架编译和运行...

乱取名字
2016/07/13
44
0
Appium for Android元素定位方法

Appium定位元素的方法有很多,比如经常用的byname、byresource-id、by_classname 下面介绍下通过UI Automator方法来定位元素的方法,而且这些方法定位都比较准。 先假设我们通过UiAutomator...

niedongri
2017/12/18
0
0
uiautomator的简单应用

Uiautomator一直想找时间去学习,但是不得空。 来了一个十一假,单身狗没有约会,只能默默在家待着了,在android的sdk目录下的tools目录中有这么一个特别好用的工具,这个事它的主界面: 然后...

Bony
2016/10/06
304
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
7
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
9
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部