1. 程式人生 > >Android 測試 之adb shell

Android 測試 之adb shell

一次 eve focus pad eth andro event rod RoCE

一、發送鍵盤事件:

命令格式1:adb shell input keyevent "value"

其中value以及對應的key code如下表所列:

KeyEvent Value

KEYCODE

Comment

0

KEYCODE_UNKNOWN

1

KEYCODE_MENU

在SDK2.1的模擬器中命令失效,sendevent命令可行

2

KEYCODE_SOFT_RIGHT

3

KEYCODE_HOME

4

KEYCODE_BACK

5

KEYCODE_CALL

6

KEYCODE_ENDCALL

7

KEYCODE_0

8

KEYCODE_1

9

KEYCODE_2

10

KEYCODE_3

11

KEYCODE_4

12

KEYCODE_5

13

KEYCODE_6

14

KEYCODE_7

15

KEYCODE_8

16

KEYCODE_9

17

KEYCODE_STAR

18

KEYCODE_POUND

19

KEYCODE_DPAD_UP

20

KEYCODE_DPAD_DOWN

21

KEYCODE_DPAD_LEFT

22

KEYCODE_DPAD_RIGHT

23

KEYCODE_DPAD_CENTER

24

KEYCODE_VOLUME_UP

25

KEYCODE_VOLUME_DOWN

26

KEYCODE_POWER

27

KEYCODE_CAMERA

28

KEYCODE_CLEAR

29

KEYCODE_A

30

KEYCODE_B

31

KEYCODE_C

32

KEYCODE_D

33

KEYCODE_E

34

KEYCODE_F

35

KEYCODE_G

36

KEYCODE_H

37

KEYCODE_I

38

KEYCODE_J

39

KEYCODE_K

40

KEYCODE_L

41

KEYCODE_M

42

KEYCODE_N

43

KEYCODE_O

44

KEYCODE_P

45

KEYCODE_Q

46

KEYCODE_R

47

KEYCODE_S

48

KEYCODE_T

49

KEYCODE_U

50

KEYCODE_V

51

KEYCODE_W

52

KEYCODE_X

53

KEYCODE_Y

54

KEYCODE_Z

55

KEYCODE_COMMA

56

KEYCODE_PERIOD

57

KEYCODE_ALT_LEFT

58

KEYCODE_ALT_RIGHT

59

KEYCODE_SHIFT_LEFT

60

KEYCODE_SHIFT_RIGHT

61

KEYCODE_TAB

62

KEYCODE_SPACE

63

KEYCODE_SYM

64

KEYCODE_EXPLORER

65

KEYCODE_ENVELOPE

66

KEYCODE_ENTER

67

KEYCODE_DEL

68

KEYCODE_GRAVE

69

KEYCODE_MINUS

70

KEYCODE_EQUALS

71

KEYCODE_LEFT_BRACKET

72

KEYCODE_RIGHT_BRACKET

73

KEYCODE_BACKSLASH

74

KEYCODE_SEMICOLON

75

KEYCODE_APOSTROPHE

76

KEYCODE_SLASH

77

KEYCODE_AT

78

KEYCODE_NUM

79

KEYCODE_HEADSETHOOK

80

KEYCODE_FOCUS

81

KEYCODE_PLUS

82

KEYCODE_MENU

83

KEYCODE_NOTIFICATION

84

KEYCODE_SEARCH

85

TAG_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 Name CODE

MENU 229

HOME 102

BACK (back button) 158

CALL (call button) 231

END (end call button) 107

二、發送鼠標事件(Touch):

命令格式:adb shell sendevent [device] [type] [code] [value]

1.在某坐標點上touch

如在屏幕的x坐標為40,y坐標為210的點上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 //it must have

adb shell sendevent /dev/input/event0 1 330 0 //untouch

adb shell sendevent /dev/input/event0 0 0 0 //it must have

註:以上六組命令必須配合使用,缺一不可

2.模擬滑動軌跡

如下例是在aPaint軟件上畫出一條開始於(100,200),止於(108,200)的水平直線

adb shell sendevent /dev/input/event0 3 0 100 //start from 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 //step to point (101,200)

adb shell sendevent /dev/input/event0 0 0 0

…………………… //must list each step, here just skip

adb shell sendevent /dev/input/event0 3 0 108 //end point(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進行Python封裝

adb_shell = "adb shell sendevent /dev/input/event0 3 0 "+str(PointX)

os.system(adb_shell)

這個方法有一個問題,就是每執行一次指令,都會有一個CMD窗口一閃而過,於是改用下面的方法。

2.通過subprocess進行Python封裝

adb_shell = "adb shell sendevent /dev/input/event0 3 1 "+str(PointX1)

subprocess.Popen(adb_shell, stdout=subprocess.PIPE, shell=True)

這個方法可以避免彈窗的出現。

四、真機與模擬器上的模擬觸控差異

將上述指令應用在模擬器上,確實很有效,但是當搬到真機上時,你會發現,這些指令都失效了,經過仔細分析,原因有兩點:

1.event

模擬器上只有一個/dev/input/event0,但是真機上不是(如果還真是,那你這設備還是別出廠了-_-||)。

用cat獲得設備對應的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 0 0B: ABS=2750000 11030003"qtouch-touchscreen"不是規定死的event幾,話說1234567都有可能,看你設備了。

2.觸控參數數據

#探究原因的時候,通過:

#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

這和我之前所想象的坐標信息不一樣,看到c,應該是16進制數,轉化成10進制可以得到:

3 53 1992

3 54 1905

3 56 1

0 2 0

3 55 16

0 0 0

然後按照原來的方法做個測試驗證下結果:

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

結果可以實現點擊!!

(倘若操作的數據特別大,那我們可以利用vi,在腳本中實現批量數據轉換:vim ‘+%normal gg‘ ‘+.,$g/^/s//adb shell sendevent //dev//input//event5 /g‘ ‘+wq‘ value)

Android 測試 之adb shell