Android 自动化测试 脚本运行
Android 自动化测试 脚本运行
ADB基本使用方法
连接
adb connect 192.168.0.100
进入设备的shell
adb -s 192.168.0.100 shell
退出adb
exit
断开连接
adb disconnect
抓取log
adb -s 192.168.0.100 logcat> /Users/kun/Desktop/adb_log/db/有线电视/1.txt
自动化脚本
首先要了解手机(TV)的众多输入设备
命令:
1
| adb shell cat /proc/bus/input/devices
|
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| I: Bus=0010 Vendor=0001 Product=0001 Version=0100 N: Name="aml_keypad" P: Phys=keypad/input0 S: Sysfs=/devices/meson-remote.12/input/input0 U: Uniq= H: Handlers=kbd mouse0 event0 B: PROP=0 B: EV=f B: KEY=7fffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe B: REL=103 B: ABS=0
I: Bus=0010 Vendor=0001 Product=0001 Version=0100 N: Name="gpio_keypad" P: Phys=gpio_keypad/input0 S: Sysfs=/devices/gpio_keypad.53/input/input1 U: Uniq= H: Handlers=kbd event1 B: PROP=0 B: EV=100003 B: KEY=1 0 0 0 0 0
I: Bus=0010 Vendor=1b8e Product=0cec Version=0001 N: Name="cec_input" P: Phys= S: Sysfs=/devices/virtual/input/input2 U: Uniq= H: Handlers=kbd event2 B: PROP=0 B: EV=3 B: KEY=1 0 0 0 0 100000 0 0 0
|
显示了这台电视盒子上的3个输入设备
如果是手机可能会显示更多
设备名称 说明 HANDLER
mxt224_ts_input 屏幕触摸输入 event0
Gyro 陀螺仪 event1
herring-keypad 键盘 event2
proximity 近距离感应器(脸颊感应) event3
lightsensor-level 光感应器 event4
compass 定位仪 event5
注意:每台设备上的输入设备分布和名称都可能不一样
模拟事件
选择一个合适的设备来进行我们的输入测试,对于大多数情况来说,一般只需要用到键盘和屏幕触摸输入,下面我们以屏幕触摸输入为例。将用到两个对应的命令:getevent和sendevent,顾名思义,一个是获取事件,另一个则是发送模拟事件。
用getevent了解设备运作
首先我们随便执行一条getevent来监听Handler event0(event0为屏幕事件):
adb shell getevent /dev/input/event0
然后点击一下桌面上某一个app(使其进入),会看到类似以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 0001 0067 00000001 0000 0000 00000000 0001 0067 00000000 0000 0000 00000000 0001 006c 00000001 0000 0000 00000000 0001 006c 00000000 0000 0000 00000000 0001 0069 00000001 0000 0000 00000000 0001 0069 00000000 0000 0000 00000000 0001 006a 00000001 0000 0000 00000000 0001 006a 00000000 0000 0000 00000000 0001 0061 00000001 0000 0000 00000000 0001 0061 00000000 0000 0000 00000000 0001 007d 00000001 0000 0000 00000000 0001 007d 00000000 0000 0000 00000000
|
以上内容的格式为:[type] [code] [value]
但这些type和code究竟是什么意思呢?输入以下指令
add device 1: /dev/input/event0
name: “mxt224_ts_input”
events:
SYN (0000): 0000 0003
ABS (0003): 0030 value 0, min 0, max 255, fuzz 0 flat 0
0032 value 0, min 0, max 30, fuzz 0 flat 0
0035 value 0, min 0, max 1023, fuzz 0 flat 0
0036 value 0, min 0, max 950, fuzz 0 flat 0
0039 value 0, min 0, max 4, fuzz 0 flat 0
这个依然有点晦涩,大意为:
type类型可能出现两种,分别是 0000 代表 SYN,0003 代表 ABS
ABS type下的code 类型可能出现若干种,包括 0030,0032,0035,0036,0039
这五种code的意义可以参见 /frameworks/base/include/ui/EventHub.h
记录你点击时所发生的事情
例如:
上键
1 2 3 4
| 0001 0067 00000001 0000 0000 00000000 0001 0067 00000000 0000 0000 00000000
|
使用sendevent模拟事件
先看看sendevent的使用方法
adb shell sendevent –h
use: sendevent device type code value
先做个简单的测试,我们回到桌面准备模拟一遍刚才点击的动作,如果成功的话会进入刚刚那个app。利用sendevent编写模拟事件脚本x.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #!/system/bin/sh sendevent /dev/input/event0 1 $((0x67)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x67)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1 sendevent /dev/input/event0 1 $((0x6c)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x6c)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1 sendevent /dev/input/event0 1 $((0x69)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x69)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1 sendevent /dev/input/event0 1 $((0x6a)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x6a)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1
|
现在执行
adb push x.sh /sdcard/
adb shell sh /sdcard/x.sh
观察设备,发现之前的app被点击了
这样我们成功的模拟了一个最简单的点击,如果想模拟其他的动作,可以尝试自己动手观察一下设备接收到的事件,再重复出来即可
本来到这里应该已经完了,但作为一位懒惰的程序员,是无法接受平时写自动化测试脚本需要编写如此多如此重复的代码的,于是我总结了一下,抽象了一个小库,用于模拟屏幕上各种基础的动作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #!/system/bin/sh # Script to execute automatical test. # By using: adb shell sendevent [device] [type] [code] [value] up(){ echo "up_key_begin" sendevent /dev/input/event0 1 $((0x67)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x67)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1 echo "up_key_end" } down(){ echo "down_key_begin" sendevent /dev/input/event0 1 $((0x6c)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x6c)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1 echo "down_key_end" } left(){ echo "left_key_begin" sendevent /dev/input/event0 1 $((0x69)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x69)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1 echo "left_key_end" } right(){ echo "right_key_begin" sendevent /dev/input/event0 1 $((0x6a)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x6a)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1 echo "right_key_end" } ok(){ echo "ok_key_begin" sendevent /dev/input/event0 1 $((0x61)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x61)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1 echo "ok_key_end" } back(){ echo "back_key_begin" sendevent /dev/input/event0 1 $((0x1)) $((0x1)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sendevent /dev/input/event0 1 $((0x1)) $((0x0)) sendevent /dev/input/event0 0 $((0x0)) $((0x0)) sleep 1 echo "back_key_end" } upordown(){ for (( i = 0; i < 4; i++ )); do down up done for (( i = 0; i < 5; i++ )); do down done
for (( i = 0; i < 5; i++ )); do up done }
while true do right upordown left left down right right upordown left left left upordown right ok sleep 10 ok sleep 5 upordown done
|