Monkeyscript---获取包名主界面名和位置坐标的几种方法

一、monkey随机事件有三类:点击、输入、手势

二、Monkeyscript难点:如何获取坐标

三、Monkeyscript API

  1、轨迹球(手势)事件:

   DispatchTrackball(long downTime,long eventTime,int action, float x,float y,float pressure,float size,int meteState,float xPrecision,float yPrecision,int device,int edgeFlags)

    long downTime:键最初按下时间

    long eventTime:事件发生时间

    int action: 动作:action_down = 0按下,action_up=1弹起,action_multiple=2

    float xX坐标

    float yY坐标

    float pressure:当前事件的压力,范围0~1

    float size:触摸近似值。范围0~1

    int metaState:当前按下的meta键的标识

    float xPrecisionX坐标精确值

    float yPrecisionY坐标精确值

    int device:事件来源,范围0~x0标识不来自物理设备

    int edgeFlages:坐标是否超出屏幕范围

  2、输入字符串(输入)事件:DispatchString(String text)

    如:DispatchString(adf23实地呵呵)

  3、点击事件:

    DispatchTrackball(long downTime,long eventTime,int action, float x,float y,float pressure,float size,int meteState,float xPrecision,float yPrecision,int device,int edgeFlags)

  4、启动应用:LaunchActivity(String pkg_name,String cl_name)

    pkg_name:应用所在包名

    cl_name:应用主界面名

    如:LaunchActivity(com.andrioid.browser,com.andrioid.browser.BrowserActivity)

      启动应用BrowserActivity

  5、等待事件:UserWait(3000) 单位:毫秒,等待3

  6、按下键值:DispatchPress(int keycode)

    常用键值:手机按键0~9-------键值:7~16

           按键A~Z------键值:29~54

           拨号键---------键值:5

           挂断键---------键值:6

           HOME-----3

           音量增键------24

           音量减键------25

    如:DispatchPress(3)即为短按home

  7、长按键值:LongPress(int keycode)

  8、发送键值:DispatchKey(long downTime,long eventTime,int action,int code,int repeat,int metaState,int device,int scancode)

      long downTime:键最初按下时间

      long eventTime:事件发生时间

      int action:动作:action_down = 0按下,action_up=1弹起,action_multiple=2

      int code:键值(参考第6条)

      int repeat:重复次数

      int metaState:当前按下的meta键的标识

      int device:事件发生的设备id

      int scancode:上报点信息

  9、开关软键盘:DispatchFlip(boolean keyboardOpen)

      true为打开;false为关闭

 

四、脚本编写:

  1、编写规范:

    (1) 头语句+事件脚本

      ① 头语句:固定格式

        type = raw events(脚本类型,一般不用更改)

        count = 10(执行脚本次数)

        speed = 1.0(执行速率,改动无影响,也可通过monkey命令行指定)

        stat data >>

      ② 事件脚本:

          1) 启动应用(如:众托帮)LaunchActivity(String pkg_name,String cl_name)

          方法一:

            a. 如何获取pkg_name包名:

                  adb shell pm  list packages

               包名为:com.zhongtuobang.android

             

 

            b. 如何获取cl_name应用主界面名:

              adb logcat -c

              adb logcat ActivityManager:I *:s

              然后手动在手机上面打开app客户端

              即:应用主界面名:com.zhongtuobang.android/.ui.activity.splash.SplashActivity

            

 

           方法二:             

            a、打开应用

            badb shell dumpsys window w | findstr \/ | findstr name=

                                               或 adb shell dumpsys window |findstr mCurrent

                                               或 adb shell "dumpsys window w|grep \/|grep name=|sed 's/mSurface=Surface(name=//g'|sed 's/)//g'|sed 's/ //g'"

            

      2) 如何获取坐标,步骤如下:

         方案一:

            a. 打开app(如:众托帮)

            b. adb shell getevent(getevent是安卓下的一个工具,模拟多种按键和触屏操作,产生raw event,再经过event hub处理产生gesture事件)

            c. 点击app中“我的”区域:

            

 

          备注:

            (1/dev/input/event4: 0003 0000 00000028

                                   |           |       |         |

                                   |           |       |         |

                      devicename   type  code  value

            (2)geteventtypecodevalue的定义可以查看kernel/include/linux/input.h,三者互相影响

                        ① 对于type的定义:

                              # define EV_SYN0000同步事件——表示一组完整事件已经完成

             

                              # define EV_KEY0001keyboard键盘事件

                              #define EV_REL          0002相对坐标

                              #define EV_ABS      0003绝对坐标

                              #define EV_MSC       0004 

                              #define EV_SW            0005

                              #define EV_LED           0011

                              #define EV_SND           0012

                          。。。。。。

 

                    ② 对于code的定义:

                            1) type值为# define EV_SYN      0000,其code值为

                                    # define SYN_REPORT 0

                                    # define SYN_CONFIG 1

                                    # define SYN_MT_REPORT 2

                            2) type值为#define EV_ABS      0003,其code值为:

                                    # define ABS_X 0000 绝对坐标X

                                    # define ABS_Y 0001 绝对坐标Y

                                    # define ABS_Z 0002 绝对坐标Z

                                    # define ABS_RX 0003

                                    # define ABS_RY 0004

                                    # define ABS_RZ 0005

                            。。。

                             # define ABS_MT_TOUCH_MAJOR 0030    主接触面的长轴:若屏幕分辨率为X*Y,那么       ABS_MT_TOUCH_MAJOR最大值为sqrt(X`2+Y`2),即为:平方和的正数开根

                                    # define ABS_MT_WIDTH_MAJOR 0032

                                    # define ABS_MT_POSITION_X 0035 椭圆中心绝对坐标X

                                    # define ABS_MT_POSITION_Y 0036 椭圆中心绝对坐标Y

                            。。。

                      当0x300x32出现时,表示有触屏事件发生;

                     当0x350x36出现时,表示实际触屏时的绝对坐标XY;

                     通过getevent获取到的值为16进制。

                               

                       此时绝对坐标(XY)为(28e4de

 

          (3)若对于不同分辨率的设备,如何获取绝对坐标点,步骤如下:

                        ① adb shell getevent -p

                                          ② 发现命令adb shell getevent时可以看到device name为:/dev/input/event6,即设备号为:adb device 3            

 

                        ③ 显示了code值得范围:当code00350036,对应本机x最小值0,最大值720;对应y最小值0,最大值1280

                        ④ 获取手机设备的分辨率:720x1280

                  adb shell wm size

                 

                        ⑤ 通过Android VNCServer源码,得出公式为:

                        计算时要将十六进制全部转化为十进制:

                        相对坐标X=x - xmin*(getevent中的十进制值 * 分辨率宽度)/ 0035max - 0035min

                        相对坐标Y=y - ymin*(getevent中的十进制值 * 分辨率高度)/0036max - 0036min

 

        方案二:

                直接打开手机设置 →打开 开发者选项 → 打开指针位置,手指点击屏幕即可显示坐标

 

posted @ 2018-03-08 17:03  bling123  阅读(1022)  评论(0编辑  收藏  举报