zoukankan      html  css  js  c++  java
  • 基于UI Automation的自动化测试框架(四)

    (转)http://blog.csdn.net/roger_ge/archive/2010/05/03/5551812.aspx

    模拟键盘鼠标事件(Socket+Instrumentation实现)

    通过Socket + Instrumentation实现模拟键盘鼠标事件主要通过以下三个部分组成:

    l Socket编程:实现PC和Emulator通讯,并进行循环监听

    l Service服务:将Socket的监听程序放在Service中,从而达到后台运行的目的。这里要说明的是启动服务有两种方式,bindService和startService,两者的区别是,前者会使启动的Service随着启动Service的Activity的消亡而消亡,而startService则不会这样,除非显式调用stopService,否则一直会在后台运行因为Service需要通过一个Activity来进行启动,所以采用startService更适合当前的情形

    l Instrumentation发送键盘鼠标事件:Instrumentation提供了丰富的以send开头的函数接口来实现模拟键盘鼠标,如下所述:

    sendCharacterSync(int keyCode) //用于发送指定KeyCode的按键

    sendKeyDownUpSync(int key) //用于发送指定KeyCode的按键

    sendPointerSync(MotionEvent event) //用于模拟Touch

    sendStringSync(String text) //用于发送字符串

    注意:以上函数必须通过Message的形式抛到Message队列中。如果直接进行调用加会导致程序崩溃。

    对于Socket编程和Service网上有很多成功的范例,此文不再累述,下面着重介绍一下发送键盘鼠标模拟事件的代码:

    1. 发送键盘KeyCode

    步骤1. 声明类handler变量

    private static Handler handler;

    步骤2. 循环处理Message

    //在Activity的onCreate方法中对下列函数进行调用

    private void createMessageHandleThread(){

    //need start a thread to raise looper, otherwise it will be blocked

    Thread t = new Thread() {

    public void run() {

    Log.i( TAG,"Creating handler ..." );

    Looper.prepare();

    handler = new Handler(){

    public void handleMessage(Message msg) {

    //process incoming messages here

    }

    };

    Looper.loop();

    Log.i( TAG, "Looper thread ends" );

    }

    };

    t.start();

    }

    步骤3. 在接收到Socket中的传递信息后抛出Message

    handler.post( new Runnable() {

    public void run() {

    Instrumentation inst=new Instrumentation();

    inst.sendKeyDownUpSync(keyCode);

    }

    } );

    2. Touch指定坐标,如下例子即touch point240,400

    Instrumentation inst=new Instrumentation();

    inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 240, 400, 0));

    inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 240, 400, 0));

    3. 模拟滑动轨迹

    将上述方法中间添加 MotionEvent.ACTION_MOVE

    1. 发送键盘事件:

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

    2. 发送鼠标事件(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软件进行试验)

    如下例是在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

  • 相关阅读:
    call/cc 总结 | Scheme
    用call/cc合成所有的控制流结构
    词法作用域 vs 动态作用域
    数论部分第二节:埃拉托斯特尼筛法
    1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】
    C++面向对象作业1
    数论部分第一节:素数与素性测试【详解】
    基数排序与桶排序,计数排序【详解】
    计蒜客:百度的科学计算器(简单)【python神解】
    优质免费在线学习网站【自用】
  • 原文地址:https://www.cnblogs.com/GnagWang/p/2015076.html
Copyright © 2011-2022 走看看