您好,登錄后才能下訂單哦!
通過上一篇文章《Appium Android Bootstrap源碼分析之簡介》我們對bootstrap的定義以及其在appium和uiautomator處于一個什么樣的位置有了一個初步的了解,那么按照正常的寫書的思路,下一個章節應該就要去看bootstrap是如何建立socket來獲取數據然后怎樣進行處理的了。但本人覺得這樣子做并不會太好,因為到時整篇文章會變得非常的冗長,因為你在編寫的過程中碰到不認識的類又要跳入進去進行說明分析。這里我覺得應該嘗試吸取著名的《重構》這本書的建議:一個方法的代碼不要寫得太長,不然可讀性會很差,盡量把其分解成不同的函數。那我們這里就是用類似的思想,不要嘗試在一個文章中把所有的事情都做完,而是嘗試先把關鍵的類給描述清楚,最后才去把這些類通過一個實例分析給串起來呈現給讀者,這樣大家就不會因為一個文章太長影響可讀性而放棄往下學習了。
那么我們這里為什么先說bootstrap對控件的處理,而非剛才提到的socket相關的socket服務器的建立呢?我是這樣子看待的,大家看到本人這篇文章的時候,很有可能之前已經了解過本人針對uiautomator源碼分析那個系列的文章了,或者已經有uiautomator的相關知識,所以腦袋里會比較迫切的想知道究竟appium是怎么運用了uiautomator的,那么在appium中于這個問題最貼切的就是appium在服務器端是怎么使用了uiautomator的控件的。
這里我們主要會分析兩個類:
public class AndroidElement { private final UiObject el; private String id; ... }大家都知道UiObject其實就是UiAutomator里面代表一個控件的類,通過它就能夠對控件進行操作(當然最終還是通過UiAutomation框架). AnroidElement就是通過它來跟UiAutomator發生關系的。我們可以看到下面的AndroidElement的點擊click方法其實就是很干脆的調用了UiObject的click方法:
public boolean click() throws UiObjectNotFoundException { return el.click(); }當然這里除了click還有很多控件相關的操作,比如dragTo,getText,longClick等,但無一例外,都是通過UiObject來實現的,這里就不一一列舉了。
我們在腳本上對控件的認識就是一個WebElement:
WebElement addNote = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")");而在Bootstrap中一個對象就是一個AndroidElement. 那么它們是怎么映射到一起的呢?我們其實可以先看如下的代碼:
WebElement addNote = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")"); addNote.getText(); addNote.click();做的事情就是獲得Notes這個app的菜單,然后調用控件的getText來獲得‘Add note'控件的文本信息,以及通過控件的click方法來點擊該控件。那么我們看下調試信息是怎樣的:
pc端傳過來的json字串有幾個fields:
package io.appium.android.bootstrap; /** * Enumeration for all the command types. * */ public enum AndroidCommandType { ACTION, SHUTDOWN }
上一節我們說到appium pc端是通過id把WebElement和目標機器端的AndroidElement映射起來的,那么我們這一節就來看下維護AndroidElement的這個哈希表是怎么實現的。
首先,它擁有兩個成員變量:
private final Hashtable<String, AndroidElement> elements; private Integer counter;
/** * Constructor */ public AndroidElementsHash() { counter = 0; elements = new Hashtable<String, AndroidElement>(); }而它在整個Bootstrap中是有且只有一個實例的,且看它的單例模式實現:
public static AndroidElementsHash getInstance() { if (AndroidElementsHash.instance == null) { AndroidElementsHash.instance = new AndroidElementsHash(); } return AndroidElementsHash.instance; }以下增加一個控件的方法addElement充分描述了為什么說counter是一個自增加的key,且是每個新發現的AndroidElement控件的id:
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; }
作者 | 自主博客 | 微信 | CSDN |
天地會珠海分舵 | http://techgogogo.com | 服務號:TechGoGoGo 掃描碼:
| 向AI問一下細節 推薦閱讀:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。 猜你喜歡最新資訊相關推薦相關標簽AI
助 手
保康县|
江源县|
沂南县|
弥勒县|
永仁县|
凤冈县|
泰安市|
万安县|
承德市|
岗巴县|
四会市|
彰武县|
中山市|
安新县|
莱州市|
绿春县|
泰来县|
永春县|
建阳市|
偃师市|
襄樊市|
广东省|
阳江市|
监利县|
瓮安县|
海口市|
枣阳市|
尚志市|
阜平县|
满城县|
油尖旺区|
常宁市|
潮州市|
扶余县|
桦甸市|
图木舒克市|
青神县|
敦化市|
陆良县|
靖江市|
白玉县|
|