AppiumAndroidBootstrap源碼分析之啟動運行
通過前面的兩篇文章《Appium Android Bootstrap源碼分析之控件AndroidElement》和《Appium Android Bootstrap源碼分析之命令解析執(zhí)行》我們了解到了Appium從pc端發(fā)送過來的命令是如何定位到命令相關的控件以及如何解析執(zhí)行該命令。那么我們剩下的問題就是bootstrap是怎么啟動運行的,我們會通過本篇文章的分析來闡述這個問題,以及把之前學習的相關的類給串起來看它們是怎么互動的。
站在用戶的角度思考問題,與客戶深入溝通,找到余干網站設計與余干網站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網站建設、做網站、企業(yè)官網、英文網站、手機端網站、網站推廣、國際域名空間、雅安服務器托管、企業(yè)郵箱。業(yè)務覆蓋余干地區(qū)。
1.啟動方式
Bootstrap的啟動是由Appium從pc端通過adb發(fā)送命令來控制的:
AndroidElementHash的這個getElement命令要做的事情就是針對這兩點來根據不同情況獲得目標控件的
- /**
- * Return an elements child given the key (context id), or uses the selector
- * to get the element.
- *
- * @param sel
- * @param key
- * Element id.
- * @return {@link AndroidElement}
- * @throws ElementNotFoundException
- */
- public AndroidElement getElement(final UiSelector sel, final String key)
- throws ElementNotFoundException {
- AndroidElement baseEl;
- baseEl = elements.get(key);
- UiObject el;
-
- if (baseEl == null) {
- el = new UiObject(sel);
- } else {
- try {
- el = baseEl.getChild(sel);
- } catch (final UiObjectNotFoundException e) {
- throw new ElementNotFoundException();
- }
- }
-
- if (el.exists()) {
- return addElement(el);
- } else {
- throw new ElementNotFoundException();
- }
- }
- 如果是第1種情況就直接通過選擇子構建UiObject對象,然后通過addElement把UiObject對象轉換成AndroidElement對象保存到控件哈希表
- 如果是第2種情況就先根據appium傳過來的控件哈希表鍵值獲得父控件,再通過子控件的選擇子在父控件的基礎上查找到目標UiObject控件,最后跟上面一樣把該控件通過addElement把UiObject控件轉換成AndroidElement控件對象保存到控件哈希表
以下就是把控件添加到控件哈希表的addElement方法
public AndroidElement addElement(final UiObject element) { counter++; final String key = counter.toString(); final AndroidElement el = new AndroidElement(key, element); elements.put(key, el); return el; }
5. 小結
- Appium的bootstrap這個jar包以及里面的o.appium.android.bootstrap.Bootstrap類是通過uiautomator作為一個uiautomator的測試包和測試方法類啟動起來的
- Bootstrap測試類繼承于uiautomator可以使用的UiAutomatorTestCase
- bootstrap會啟動一個socket server并監(jiān)聽來自4724端口的appium的連接
- 一旦appium連接上來,bootstrap就會不停的去獲取該端口的appium發(fā)送過來的命令數據進行解析和執(zhí)行處理,然后把結果寫到該端口返回給appium
- bootstrap獲取到appium過來的json字串命令后,會通過AndroidCommand這個命令解析器解析出命令action,然后通過AndroidCommandExecutor的action到CommandHandler的map把action映射到真正的命令處理類,這些類都是繼承與CommandHandler的實現類,它們都要重寫該父類的execute方法來最終通過UiObject,UiDevice或反射獲得UiAutomator沒有暴露出來的QueryController/InteractionController來把命令真正的在安卓系統(tǒng)中執(zhí)行
- appium獲取控件大概有兩類,一類是直接通過Appium/Android Driver獲得,這一種情況過來的appium查找json命令字串是沒有帶控件哈希表的控件鍵值的;另外一種是根據控件的父類控件在控件哈希表中的鍵值和子控件的選擇子來獲得,這種情況過來的appium查找json命令字串是既提供了父控件在控件哈希表的鍵值又提供了子控件的選擇子的
- 一旦獲取到的控件在控件哈希表中不存在,就需要把這個AndroidElement控件添加到該哈希表里面