前言:
最近剛開始學(xué)習(xí)android的自動(dòng)化測(cè)試上真,看了很多種方法,各有各的優(yōu)點(diǎn)羹膳,各有各的缺點(diǎn)睡互,覺得要找到最合適的方法,其實(shí)并不容易溜徙。
本文為菜鳥的個(gè)人總結(jié)湃缎,純屬拋磚引玉,如果有什么錯(cuò)誤蠢壹,請(qǐng)大家抱著寬容為主,欣賞為輔的原則九巡,批評(píng)指正图贸。
Android還有一種更底層的模擬鍵盤鼠標(biāo)事件的方法,那就是通過使用adb?shell?命令冕广。?
一疏日、發(fā)送鍵盤事件:
命令格式1:adb?shell?inputkeyevent"value"
其中value以及對(duì)應(yīng)的key?code如下表所列:
KeyEvent?ValueKEYCODEComment
0KEYCODE_UNKNOWN?
1KEYCODE_MENU在SDK2.1的模擬器中命令失效,sendevent命令可行
2KEYCODE_SOFT_RIGHT?
3KEYCODE_HOME?
4KEYCODE_BACK?
5KEYCODE_CALL?
6KEYCODE_ENDCALL?
7KEYCODE_0?
8KEYCODE_1?
9KEYCODE_2?
10KEYCODE_3?
11KEYCODE_4?
12KEYCODE_5?
13KEYCODE_6?
14KEYCODE_7?
15KEYCODE_8?
16KEYCODE_9?
17KEYCODE_STAR?
18KEYCODE_POUND?
19KEYCODE_DPAD_UP?
20KEYCODE_DPAD_DOWN?
21KEYCODE_DPAD_LEFT?
22KEYCODE_DPAD_RIGHT?
23KEYCODE_DPAD_CENTER?
24KEYCODE_VOLUME_UP?
25KEYCODE_VOLUME_DOWN?
26KEYCODE_POWER?
27KEYCODE_CAMERA?
28KEYCODE_CLEAR?
29KEYCODE_A?
30KEYCODE_B?
31KEYCODE_C?
32KEYCODE_D?
33KEYCODE_E?
34KEYCODE_F?
35KEYCODE_G?
36KEYCODE_H?
37KEYCODE_I?
38KEYCODE_J?
39KEYCODE_K?
40KEYCODE_L?
41KEYCODE_M?
42KEYCODE_N?
43KEYCODE_O?
44KEYCODE_P?
45KEYCODE_Q?
46KEYCODE_R?
47KEYCODE_S?
48KEYCODE_T?
49KEYCODE_U?
50KEYCODE_V?
51KEYCODE_W?
52KEYCODE_X?
53KEYCODE_Y?
54KEYCODE_Z?
55KEYCODE_COMMA?
56KEYCODE_PERIOD?
57KEYCODE_ALT_LEFT?
58KEYCODE_ALT_RIGHT?
59KEYCODE_SHIFT_LEFT?
60KEYCODE_SHIFT_RIGHT?
61KEYCODE_TAB?
62KEYCODE_SPACE?
63KEYCODE_SYM?
64KEYCODE_EXPLORER?
65KEYCODE_ENVELOPE?
66KEYCODE_ENTER?
67KEYCODE_DEL?
68KEYCODE_GRAVE?
69KEYCODE_MINUS?
70KEYCODE_EQUALS?
71KEYCODE_LEFT_BRACKET?
72KEYCODE_RIGHT_BRACKET?
73KEYCODE_BACKSLASH?
74KEYCODE_SEMICOLON?
75KEYCODE_APOSTROPHE?
76KEYCODE_SLASH?
77KEYCODE_AT?
78KEYCODE_NUM?
79KEYCODE_HEADSETHOOK?
80KEYCODE_FOCUS?
81KEYCODE_PLUS?
82KEYCODE_MENU?
83KEYCODE_NOTIFICATION?
84KEYCODE_SEARCH?
85TAG_LAST_KEYCODE?
命令格式2:adb?shell?sendevent?[device]?[type]?[code]?[value]
如:adb?shell?sendevent?/dev/input/event0?1?229?1代表按下按下menu鍵
adb?shell?sendevent?/dev/input/event0?1?229?0代表按下松開menu鍵
說明:上述的命令需組合使用
另外所知道的命令如下:
Key?NameCODE
MENU229
HOME102
BACK?(back?button)158
CALL?(call?button)231
END?(end?call?button)107
二撒汉、發(fā)送鼠標(biāo)事件(Touch):
命令格式:adb?shell?sendevent?[device]?[type]?[code]?[value]
1.在某坐標(biāo)點(diǎn)上touch
如在屏幕的x坐標(biāo)為40沟优,y坐標(biāo)為210的點(diǎn)上touch一下,命令如下
adb?shell?sendevent?/dev/input/event0?3?0?40
adb?shell?sendevent?/dev/input/event0?3?1?210
adb?shell?sendevent?/dev/input/event0?1?330?1?//touch
adb?shell?sendevent?/dev/input/event0?0?0?0???????//itmust?have
adb?shell?sendevent?/dev/input/event0?1?330?0?//untouch
adb?shell?sendevent?/dev/input/event0?0?0?0?//it?musthave
注:以上六組命令必須配合使用睬辐,缺一不可
2.模擬滑動(dòng)軌跡
如下例是在aPaint軟件上畫出一條開始于(100,200)挠阁,止于(108,200)的水平直線
adb?shell?sendevent?/dev/input/event0?3?0?100?//startfrom?point?(100,200)
adb?shell?sendevent?/dev/input/event0?3?1?200
adb?shell?sendevent?/dev/input/event0?1?330?1?//touch
adb?shell?sendevent?/dev/input/event0?0?0?0
adb?shell?sendevent?/dev/input/event0?3?0?101?//stepto?point?(101,200)
adb?shell?sendevent?/dev/input/event0?0?0?0
……………………//must?list?each?step,?here?justskip
adb?shell?sendevent?/dev/input/event0?3?0?108?//endpoint(108,200)
adb?shell?sendevent?/dev/input/event0?0?0?0
adb?shell?sendevent?/dev/input/event0?1?330?0?//untouch
adb?shell?sendevent?/dev/input/event0?0?0?0
三宾肺、CMD指令Python封裝
1.通過os進(jìn)行Python封裝
adb_shell?=?"adb?shellsendevent?/dev/input/event0?30?"+str(PointX)
os.system(adb_shell)
這個(gè)方法有一個(gè)問題,就是每執(zhí)行一次指令侵俗,都會(huì)有一個(gè)CMD窗口一閃而過锨用,于是改用下面的方法。
2.通過subprocess進(jìn)行Python封裝
adb_shell?=?"adb?shellsendevent?/dev/input/event0?31?"+str(PointX1)
subprocess.Popen(adb_shell,stdout=subprocess.PIPE,?shell=True)
這個(gè)方法可以避免彈窗的出現(xiàn)隘谣。
四增拥、真機(jī)與模擬器上的模擬觸控差異
將上述指令應(yīng)用在模擬器上,確實(shí)很有效寻歧,但是當(dāng)搬到真機(jī)上時(shí)掌栅,你會(huì)發(fā)現(xiàn),這些指令都失效了码泛,經(jīng)過仔細(xì)分析渣玲,原因有兩點(diǎn):
1.event
模擬器上只有一個(gè)/dev/input/event0,但是真機(jī)上不是(如果還真是弟晚,那你這設(shè)備還是別出廠了-_-||)忘衍。
用cat獲得設(shè)備對(duì)應(yīng)的event信息:
#?cat?/proc/bus/input/devicesI:?Bus=0000?Vendor=0000?Product=0000?Version=0000N:?Name="qtouch-touchscreen"P:?Phys=S:?Sysfs=/devices/virtual/input/input5U:Uniq=H:?Handlers=event5B:?EV=bB:?KEY=400?0?4?0?0?0?0?0?0?00B:?ABS=2750000?11030003"qtouch-touchscreen"不是規(guī)定死的event幾,話說1234567都有可能卿城,看你設(shè)備了枚钓。
2.觸控參數(shù)數(shù)據(jù)
#探究原因的時(shí)候,通過:
#adb?shell?getevent/dev/input/event5?>?getvalue
可以得到:
0003?0035?000007c8
0003?0036?00000771
0003?0038?00000001
0000?0002?00000000?
0003?0037?00000010
0000?0000?00000000
這和我之前所想象的坐標(biāo)信息不一樣瑟押,看到c搀捷,應(yīng)該是16進(jìn)制數(shù),轉(zhuǎn)化成10進(jìn)制可以得到:
3??53??1992?
3??54??1905?
3??56??1?
0??2???0?
3??55??16
0??0???0
然后按照原來的方法做個(gè)測(cè)試驗(yàn)證下結(jié)果:
adb?shell?sendevent?/dev/input/event5?3?53?1992
adb?shell?sendevent?/dev/input/event5?3?54?1905
adb?shell?sendevent?/dev/input/event5?3?56?1
adb?shell?sendevent?/dev/input/event5?0?2?0
adb?shell?sendevent?/dev/input/event5?3?55?16
adb?shell?sendevent?/dev/input/event5?0?0?0
結(jié)果可以實(shí)現(xiàn)點(diǎn)擊6嗤嫩舟!
(倘若操作的數(shù)據(jù)特別大,那我們可以利用vi怀偷,在腳本中實(shí)現(xiàn)批量數(shù)據(jù)轉(zhuǎn)換:vim?'+%normal?gg''+.,$g/^/s//adb?shellsendevent?//dev//input//event5?/g'?'+wq'?value)