老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

 

从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有一大部分命令在翻译后需要转换成对应的事件,然后放入到命令队列里面等待执行。Monkey在取出一个事件执行的时候主要是执行其injectEvent方法来注入事件,而注入事件根据是否需要往系统注入事件分为两种:

  • 需要通过系统服务往系统注入事件:如MonkeyKeyEvent事件会通过系统的InputManager往系统窗口注入按键事件来完成输入请求
  • 不需要通过系统服务往系统注入事件: 如MonkeyWaitEvent只是进行简单的睡眠等待

MonkeyEvent是所有Monkey事件的总称,其实它包含了多种事件,我们先看下类图:

图6-5-1 MonkeyEvent类族谱

大家可以看到MonkeyEvent是一个抽象类,它最重要的地方是定义了injectEvent这个抽象方法。然后有一系列的子类继承该抽象类来实现其injectEvent接口,也就是去实现如何往系统注入事件来完成MonkeyRunner的请求了。所以如果这里要给Monkey事件做一个定义,我认为可以这样定义:Monkey事件是一个实现了injectEvent方法来处理不同的命令请求的类。但这里我们要注意并不是所有从MonkeyRunner过来的命令字串都会生成对应的事件的,请看下表:

命令字串

命令翻译类

目标事件类

MR是否支持

注释

touch down x y

TouchCommand

MonkeyTouchEvent

x代表x坐标,y代表y坐标

touch up x y

TouchCommand

MonkeyTouchEvent

同上

touch move x y

TouchCommand

MonkeyTouchEvent

同上

tap x y

TapCommand

MonkeyTouchEvent

同上

press name

PressCommand

MonkeyKeyEvent

Name代表按键名,如"MENU", "HOME", "SEARCH"等

key down name

KeyCommand

MonkeyKeyEvent

同上

key up name

KeyCommand

MonkeyKeyEvent

同上

getvar name

GetVarCommand

N/A(不会有对应事件,所以也不会加入事件队列,而是直接取得属性返回)

name 代表属性名

listvar

ListViewsCommand

同上

type line

TypeCommand

MonkeyKeyEvent

line 代表输入字串

wake

WakeCommand

N/A(不会有对应事件,所以也不会加入事件队列,而是直接PowerManager唤醒屏幕)

listViews

ListViewsCommand

N/A(不会生成事件也不会入事件队列)

queryview

QueryViewCommand

N/A(不会生成事件也不会入事件队列)

getRootView

GetRootViewCommand

N/A(不会生成事件也不会入事件队列)

getViewWithText

GetViewsWithTextCommand

N/A(不会生成事件也不会入事件队列)

done

N/A

N/A(不会生成事件也不会入事件队列)

测试完成,Monkey收到命令后会停止Socket监听

quit

N/A

N/A(不会生成事件也不会入事件队列)

测试请求退出,Monkey收到后不会停止Socket监听,

flip open

MonkeyFlipEvent

MonkeyFlipEvent

MonkeyRunner不支持发送这两个命令

flip close

MonkeyFlipEvent

MonkeyFlipEvent

trackball dx dy

deferredReturn

DeferReturnCommand

N/A(不会生成事件也不会入事件队列)

这个命令比较特别,做的事情是等待一个命令完成然后执行另外一个命令。但是在MonkeyRunner框架中并没有支持。

注: MR代表MonkeyRunner

表6-5-1 命令字串 – 命令翻译类 – 事件关系参照表

从列表中我们可以看到MonkeySourceNetwork支持大部分从MonkeyRunner过来的命令字串,但是只有2种是会生成对应的事件并存放到事件队列里面的,这两种事件都是需要对界面进行操作的,而其他如获得系统属性以及获得界面控件等命令都是不会生成对应事件,也不会进入到事件队列,而是直接处理然后返回的。这里我们对这2种事件做相应的描述:

  • MonkeyTouchEvent:对界面进行触屏操作,最终会通过InputManager往系统注入对应事件
  • MonkeyKeyEvent: 往界面输入键值,最终会通过InputManager往系统注入对应事件

这里要注意的是,其实并不是所有的事件注入都需要真的往系统窗口注入事件的,这个接口方法的名字我觉得Google 工程师起得不好,比如叫做handleEvent就不会造成混乱了(个人见解)。

老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件的更多相关文章

  1. 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

    老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...

  2. 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态

    老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态   poptest是国内唯一 ...

  3. 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer

    老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer   poptest是国内唯一一家培养 ...

  4. 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化

    老李推荐:第14章3节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer实例化 poptest是国内唯一一家培养测试开发工程师的培 ...

  5. 老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述

    老李推荐: 第14章2节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer架构概述   HierarchyViewer库的引入让M ...

  6. 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程

    老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程   poptest是国内唯一一家培养测试开发工程师的培训机 ...

  7. 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结

    老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  8. 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本

    老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...

  9. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  10. 老李推荐:第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化

    老李推荐:第8章1节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行环境初始化   首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目 ...

随机推荐

  1. css3瀑布流

    css3虽然可以实现,不过要是真的运用到项目中还是老老实实写js吧 .container{ /*列的宽度*/ column-width:160px; -webkit-column-width:160p ...

  2. 在Windows Server2016里通过Hyper-V安装Liunx Container

    Windows Server2016正式发布已经有一段时间了.无可厚非,原生Docker的支持是这个版本一个非常大的亮点. Windows Container 的安装在网上有很多教程,我这里不过多的描 ...

  3. ios常用资源网址链接

    M了个J博客 http://www.cnblogs.com/mjios/tag/objective-c/  Cocoa China http://www.cocoachina.com  git网 ht ...

  4. android保存照片到相册的一些事

    由于最近工作需求的原因,有一个功能就是将webView里面的照片保存到本地,并且能够直接在相册中有一个及时的反馈. 项目中,具体是实现流程是这样的设计webview点击交互事件,当点击webview中 ...

  5. Thread类常用方法

    Thread类构造方法: 1.Thread(): 2.Thread(String name): 3.Thread(Runable r): 4.Thread(Runable r, String name ...

  6. 读书笔记 effective c++ Item 29 为异常安全的代码而努力

    异常安全在某种意义上来说就像怀孕...但是稍微想一想.在没有求婚之前我们不能真正的讨论生殖问题. 假设我们有一个表示GUI菜单的类,这个GUI菜单有背景图片.这个类将被使用在多线程环境中,所以需要mu ...

  7. extundelete教程(完整版)

    作者:蒋张裕 Extundelete是在Linux下,基于开源的数据恢复工具.使用阿里云的云服务器 ECS,您可以方便地安装,及时还原误删除的重要文件. extundelete不仅能够通过在文件系统的 ...

  8. maven springmvc启动问题

    1.环境 SpringMVC + Maven + mybatis 2.报错提示 严重: Error configuring application listener of class org.spri ...

  9. AlloyTouch.js 源码 学习笔记及原理说明

    alloyTouch这个库其实可以做很多事的, 比较抽象, 需要我们用户好好的思考作者提供的实例属性和一些回调方法(touchStart, change, touchMove, pressMove, ...

  10. enum类型的本质(转)

    原地址:http://www.cppblog.com/chemz/archive/2007/06/05/25578.html 至从C语言开始enum类型就被作为用户自定义分类有限集合常量的方法被引入到 ...