您好,登錄后才能下訂單哦!
通過(guò)上一篇文章《Appium Android Bootstrap源碼分析之簡(jiǎn)介》我們對(duì)bootstrap的定義以及其在appium和uiautomator處于一個(gè)什么樣的位置有了一個(gè)初步的了解,那么按照正常的寫(xiě)書(shū)的思路,下一個(gè)章節(jié)應(yīng)該就要去看bootstrap是如何建立socket來(lái)獲取數(shù)據(jù)然后怎樣進(jìn)行處理的了。但本人覺(jué)得這樣子做并不會(huì)太好,因?yàn)榈綍r(shí)整篇文章會(huì)變得非常的冗長(zhǎng),因?yàn)槟阍诰帉?xiě)的過(guò)程中碰到不認(rèn)識(shí)的類(lèi)又要跳入進(jìn)去進(jìn)行說(shuō)明分析。這里我覺(jué)得應(yīng)該嘗試吸取著名的《重構(gòu)》這本書(shū)的建議:一個(gè)方法的代碼不要寫(xiě)得太長(zhǎng),不然可讀性會(huì)很差,盡量把其分解成不同的函數(shù)。那我們這里就是用類(lèi)似的思想,不要嘗試在一個(gè)文章中把所有的事情都做完,而是嘗試先把關(guān)鍵的類(lèi)給描述清楚,最后才去把這些類(lèi)通過(guò)一個(gè)實(shí)例分析給串起來(lái)呈現(xiàn)給讀者,這樣大家就不會(huì)因?yàn)橐粋€(gè)文章太長(zhǎng)影響可讀性而放棄往下學(xué)習(xí)了。
那么我們這里為什么先說(shuō)bootstrap對(duì)控件的處理,而非剛才提到的socket相關(guān)的socket服務(wù)器的建立呢?我是這樣子看待的,大家看到本人這篇文章的時(shí)候,很有可能之前已經(jīng)了解過(guò)本人針對(duì)uiautomator源碼分析那個(gè)系列的文章了,或者已經(jīng)有uiautomator的相關(guān)知識(shí),所以腦袋里會(huì)比較迫切的想知道究竟appium是怎么運(yùn)用了uiautomator的,那么在appium中于這個(gè)問(wèn)題最貼切的就是appium在服務(wù)器端是怎么使用了uiautomator的控件的。
這里我們主要會(huì)分析兩個(gè)類(lèi):
public class AndroidElement { private final UiObject el; private String id; ... }大家都知道UiObject其實(shí)就是UiAutomator里面代表一個(gè)控件的類(lèi),通過(guò)它就能夠?qū)丶M(jìn)行操作(當(dāng)然最終還是通過(guò)UiAutomation框架). AnroidElement就是通過(guò)它來(lái)跟UiAutomator發(fā)生關(guān)系的。我們可以看到下面的AndroidElement的點(diǎn)擊click方法其實(shí)就是很干脆的調(diào)用了UiObject的click方法:
public boolean click() throws UiObjectNotFoundException { return el.click(); }當(dāng)然這里除了click還有很多控件相關(guān)的操作,比如dragTo,getText,longClick等,但無(wú)一例外,都是通過(guò)UiObject來(lái)實(shí)現(xiàn)的,這里就不一一列舉了。
我們?cè)谀_本上對(duì)控件的認(rèn)識(shí)就是一個(gè)WebElement:
WebElement addNote = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")");而在Bootstrap中一個(gè)對(duì)象就是一個(gè)AndroidElement. 那么它們是怎么映射到一起的呢?我們其實(shí)可以先看如下的代碼:
WebElement addNote = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")"); addNote.getText(); addNote.click();做的事情就是獲得Notes這個(gè)app的菜單,然后調(diào)用控件的getText來(lái)獲得‘Add note'控件的文本信息,以及通過(guò)控件的click方法來(lái)點(diǎn)擊該控件。那么我們看下調(diào)試信息是怎樣的:
pc端傳過(guò)來(lái)的json字串有幾個(gè)fields:
package io.appium.android.bootstrap; /** * Enumeration for all the command types. * */ public enum AndroidCommandType { ACTION, SHUTDOWN }
上一節(jié)我們說(shuō)到appium pc端是通過(guò)id把WebElement和目標(biāo)機(jī)器端的AndroidElement映射起來(lái)的,那么我們這一節(jié)就來(lái)看下維護(hù)AndroidElement的這個(gè)哈希表是怎么實(shí)現(xiàn)的。
首先,它擁有兩個(gè)成員變量:
private final Hashtable<String, AndroidElement> elements; private Integer counter;
/** * Constructor */ public AndroidElementsHash() { counter = 0; elements = new Hashtable<String, AndroidElement>(); }而它在整個(gè)Bootstrap中是有且只有一個(gè)實(shí)例的,且看它的單例模式實(shí)現(xiàn):
public static AndroidElementsHash getInstance() { if (AndroidElementsHash.instance == null) { AndroidElementsHash.instance = new AndroidElementsHash(); } return AndroidElementsHash.instance; }以下增加一個(gè)控件的方法addElement充分描述了為什么說(shuō)counter是一個(gè)自增加的key,且是每個(gè)新發(fā)現(xiàn)的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 |
天地會(huì)珠海分舵 | http://techgogogo.com | 服務(wù)號(hào):TechGoGoGo 掃描碼:
| 向AI問(wèn)一下細(xì)節(jié) 免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。 猜你喜歡最新資訊相關(guān)推薦
相關(guān)標(biāo)簽AI
助 手 |