简单的自动化测试小程序(一)

需求:

                在休眠时唤醒设备,解锁。然后执行拍照、拨打电话、下载数据,执行一个应用(浮点运算、gpu等),在执行20分钟后将其关闭,然后进入休眠。

 

实现:

                因为模拟的是用户操作,所以并不是在自己的应用中实现如上需求描述,而是调用当前系统的现有应用,模拟用户交互。所以就在Activity的onCreate中,直接开启了一个服务,由服务来进行控制,随后将Activity finish()掉。

                服务开始之后就进行状态判定,如果是锁屏的情况下,进行解锁。inKeyguardRestrictedInputMode就可以实现状态判定,如果是在锁屏的情况下,我就发送一个keyevent 26 \\power   间隔1s之后  keyevent 82 \\unlock.              

                随后开启使用startActivity开启相机、拨号、浏览器(如果传递的网址是下载的文件,就可以直接走浏览器的下载了)等。这里注意intent要加上Intent.FLAG_ACTIVITY_NEW_TASK 。

                最后设置了一下定时器,在一定时间之后再次启动这个Activity,注意我这里说的是“再次启动Activity”而不是service,这里是根据setRepeating中的参数决定的。其实也可以启动服务。

 

知识点:

               1,event? getevent/sendevent? input keyevent?  

                不打算分析事件机制、源码解析。第一步就是拿着自己的手机adb shell getevent,能看到如/dev/input/event5: 0003 0002 000003bc类似的在滚动输出,点两下触屏,和按键会发现event后面的都在发生变化,但是有一定规律,譬如在滑动触屏的时候,始终是输出的是event1(你的可能是别的),如此一来我们可以确定的是触屏事件是event1,那么是这样么,我们再次输入adb shell getevent -p来查看,找到even1的描述

                        add device 8: /dev/input/event1

                        name:     “goodix-ts”                 

我的这个name还是比较直白的 touch screen,所以还真是这样。同时也可以查看其他的event都对应的是什么设备,譬如我一直滚动的event5是accelerometer。

                至此,我们再来分析一下后面的数据,以触屏事件为例:                        

               adb shell getevent /dev/input/event1  (获取当前触屏事件)

得到                 0001 014a 00000001
                        0003 0035 00000173
                        0003 0036 000003d5
                        0003 0030 0000003b

                这三列分别代表type、code、value,这列数据中就包含你触摸位置的坐标,0x35 是x轴、0x36是y轴。转化为10进制就变成了371,949。(当前我的0x35 max、 0x36 max值与我当前实际分辨率相等,所以没有比例转换的问题)

                使用sendevent可以模拟用户完成一次点击事件。例如下面就是一次完整的点击返回。

               shell@msm8916_32:/ $ sendevent /dev/input/event1 1 158 1
               sendevent /dev/input/event1 1 158 1
               shell@msm8916_32:/ $ sendevent /dev/input/event1 0 0 0
               sendevent /dev/input/event1 0 0 0
               shell@msm8916_32:/ $ sendevent /dev/input/event1 1 158 0
               sendevent /dev/input/event1 1 158 0
               shell@msm8916_32:/ $ sendevent /dev/input/event1 0 0 0
               sendevent /dev/input/event1 0 0 0

                上面的输入太繁琐,好在还有简化点的。

                input tap  200 300     //点击200、300坐标

                input swipe 200 300 1200 300 //由200、300向 1200、300滑动

                input keyevent 3   //home

                input keyevent 4   //back

                不同厂商的keyevent实际上可能有所不同,还请各位同学去framework/native/include/input/KeycodeLables.h中去查看。

                至此,我们就能使用在adb shell中做灭屏,唤醒,点击,滑屏…一系列动作。

                                                                                                            ----to be continued

 

    原文作者:移动开发
    原文地址: https://my.oschina.net/shaula/blog/677681
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞