国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > Appium Android Bootstrap源码分析之命令解析执行

Appium Android Bootstrap源码分析之命令解析执行

来源:程序员人生   发布时间:2014-11-13 08:20:42 阅读次数:3765次

通过上1篇文章《Appium Android Bootstrap源码分析之控件AndroidElement》我们知道了Appium从pc端发送过来的命令如果是控件相干的话,终究目标控件在bootstrap中是以AndroidElement对象的方式显现出来的,并且该控件对象会在AndroidElementHash保护的控件哈希表中保存起来。但是appium触发1个命令除需要提供是不是与控件相干这个信息外,还需要其他的1些信息,比如,这个是甚么命令?这个就是我们这篇文章需要讨论的话题了。

下面我们还是先看1下从pc端发过来的json的格式是怎样样的:


可以看到里面除params指定的是哪个控件以外,还指定了另外两个信息:

  • cmd: 这是1个action还是1个shutdown
  • action:如果是1个action的话,那末是甚么action

开始前我们先扼要描写下我们需要触及到几个关键类:

Class

Key Method

Key Member

Parent

Description

Comment

AndroidComma

ndType


enum AndroidCommandType {

ACTION,SHUTDOWN

}


安卓命令的类型,只有两种,shutdown的处理方式和普通的action会不1样


AndroidComma

nd

action/getElement

JSONObject json;

AndroidCommandType cmdType;


从用户发过来的json命令信息得到真实的命令


CommandHand

ler

execute



虚拟类,其他真实CommandHandlerclick的父类


AndroidComma

ndExecutor

execute

HashMap<

String, 

CommandHan

dler> map



map是所有的命令字串和真实的CommandHandler的1个映照。

其成员函数execute就是通过字串命令找到map对应的handler然后履行的


getText

execute


CommandHandler

处理获得指定控件文本信息的类。

真正履行的是传进来的AndroidCommand对应UiObjectgetText方法

其他clickfind,drag,setText等命令同理


1. Appium命令解析器AndroidCommand

AndroidCommand这个类真实的作用其实就是去把Appium从pc端发送过来的那串json命令解析出来,它具有两个成员变量:
JSONObject json; AndroidCommandType cmdType;
json就是pc过来的json格式的那串命令,cmdType就是action或shutdown,其实就是用来把这个类假装成更像个命令类而已,我认为如果不提供这个成员变量而直接修改其getType的实现去解析json字串直接取得对应的AndroidCommandType,然后把这个类的名字改成AndroidCommandParser得了。

那末我们往下看下AndroidCommand究竟是怎样对客户端命令进行解析的,它的方法都很短,所以我把它做成1个表,这样比较清晰点:

Method

Return

Code

Description

AndroidCommand

N/A

public AndroidCommand(final String jsonStr) throws JSONException, CommandTypeException { json = new JSONObject(jsonStr); setType(json.getString("cmd")); }


构造函数构造函数,把客户端过

来的json格式命

令保存起来并根

据命令的cmd

设置好cmdType

action()

String

public String action() throws JSONException { if (isElementCommand()) { return json.getString("action"). substring(8); } return json.getString("action"); }


解析出客户端过

来的json字串的

action这个项并

返回

commandType()

AndroidCom

mandType 

public AndroidCommandType commandType() { return cmdType; }


ACTION还是SHUTDOWN

getDestElement

AndroidElement

public AndroidElement getDestElement() throws JSONException { String destElId = (String) params(). get("destElId"); return AndroidElementsHash. getInstance(). getElement(destElId); }


解析出json字串

params项的子

destElId,然后

从控件哈希表中

找到目标

AndroidElement

控件返回

getElement

AndroidElement

public AndroidElement getElement() throws JSONException { String elId = (String) params(). get("elementId"); return AndroidElementsHash.getInstance(). getElement(elId); }


解析出json字串

params项的子

elementId,

后从控件哈希表

中找到目标

AndroidElement

控件返回

isElementCommand

boolean

public boolean isElementCommand() { if (cmdType == AndroidCommandType.ACTION) { try { return json.getString("action"). startsWith("element:"); } catch (final JSONException e) { return false; } } return false; }


解析json字串中

’action’项的值,如果是以’element:’

字串开始的话就证

明是个控件相干的

命令,否则就不是


params

Hashtable

<String,

Object>

public Hashtable<String, Object> params() throws JSONException { final JSONObject paramsObj = json.getJSONObject("params"); final Hashtable<String, Object> newParams = new Hashtable<String, Object>(); final Iterator<?> keys = paramsObj.keys(); while (keys.hasNext()) { final String param = (String) keys.next(); newParams.put(param, paramsObj.get(param)); } return newParams; }


json

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生