通過上1篇文章《Appium Android Bootstrap源碼分析之控件AndroidElement》我們知道了Appium從pc端發送過來的命令如果是控件相干的話,終究目標控件在bootstrap中是以AndroidElement對象的方式顯現出來的,并且該控件對象會在AndroidElementHash保護的控件哈希表中保存起來。但是appium觸發1個命令除需要提供是不是與控件相干這個信息外,還需要其他的1些信息,比如,這個是甚么命令?這個就是我們這篇文章需要討論的話題了。
下面我們還是先看1下從pc端發過來的json的格式是怎樣樣的:
可以看到里面除params指定的是哪個控件以外,還指定了另外兩個信息:
開始前我們先扼要描寫下我們需要觸及到幾個關鍵類:
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 |
|
|
虛擬類,其他真實CommandHandler如click的父類 |
|
AndroidComma ndExecutor |
execute |
HashMap< String, CommandHan dler> map
|
|
map是所有的命令字串和真實的CommandHandler的1個映照。 其成員函數execute就是通過字串命令找到map對應的handler然后履行的 |
|
getText |
execute |
|
CommandHandler |
處理獲得指定控件文本信息的類。 真正履行的是傳進來的AndroidCommand對應UiObject的getText方法 |
其他click,find,drag,setText等命令同理 |
那末我們往下看下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字 上一篇 Android之斷點續傳下載 下一篇 編譯nodejs及其源碼研究 |