zoukankan      html  css  js  c++  java
  • Android 测试 之adb shell

    一、发送键盘事件:

    命令格式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)

  • 相关阅读:
    Python神库分享之geoip2 IP定位库
    科普一下推荐引擎
    浏览器插件之王-Tampermonkey(油猴脚本)
    Swagger入门教程
    使用SonarQube+Eclipse来分析python代码
    什么是搜索引擎蜘蛛?
    让所有网站都提供API的Python库:Toapi
    如何提高自己的逻辑思维能力?
    推荐系统和搜索引擎的关系
    html 后台页面布局
  • 原文地址:https://www.cnblogs.com/mcboy/p/8963784.html
Copyright © 2011-2022 走看看