本文在真個系列中會扮演一個簡介的角色,不會分析任何的代碼,隻會先給大傢一個基本的印象,方便大傢在持有這個印象的基礎上往下和本人一塊分析。
1. Bootstrap定義及在Appium中扮演的角色
我們先看一下本人大概一個月之前剛接觸appium時整理的一個高層架構圖
下面一部分就是藍色的就是bootstrap所在的位置,可以看到它是運行在我們的安卓目標測試機器端的,它會監聽4724端口獲得命令然後pass給UiAutomator來做處理。
那麼我們應該怎麼來給bootstrap做一個定義呢?我不知道官方有沒有做一個定義,但是按照我自己的語言,我會這樣來定義它:
Bootstrap是Appium運行在安卓目標測試機器上的一個UiAutomator測試腳本,該腳本的唯一一個測試方法所做的事情是在目標機器開啟一個socket服務器來把一個session中Appium從PC端過來的命令發送給UiAutomator來執行處理。
這個定義說明瞭bootstrap在appium和uiautomator中究竟處於一個什麼樣的角色: 首先,它是一個uiautomator的測試腳本,它的入口類Bootstrap繼承於UiAutomatorTestCase,所以UiAututomator可以正常運行它,它也可以正常的使用uiautomator的方法,這個就是appium的命令可以轉換成uiautomator的命令的關鍵其次,它是一個socket服務器,它專門監聽4724端口過來的appium的連接和命令數據,並把appium的命令轉換成uiautomator的命令來讓uiautomator進行處理最後,它處理的是appium從pc端過來的命令,而非一個文件。這在初次接觸appium的朋友是很容易困惑的,以為appium是整個腳本文件發送到目標機器再由bootstrap進行分析處理的,事實並非如此
2. Bootstrap關鍵類一覽表
上面寥寥幾句道出瞭bootstrap的定義,那麼往下我們就繼續寥寥幾行的把bootstrap這個jar包的關鍵類以及它的關鍵方法和相應的本人的一些說明給列出來,給大傢現有一個draft idea每個類大概是怎麼一回事,這樣我們往下的文章就比較好說,大傢也比較好理解瞭。
Class |
Key Method |
Key Member |
Parent |
Description |
Comment |
Bootstrap |
testRunServer |
|
|
以一個UiAutomatorTestCase的方法的方式運行一個SocketServer來監聽4724端口 |
整個bootstrap是以UiAutomator的TestCase的方式運行的,所以這裡的Bootstrap這個類必須要繼承於UiAutomatorTestCase |
SocketServer |
handleClientData |
|
|
讀取socket進來的字串命令信息並轉換成AndroidCommand命令然後調用runCommand命令執行命令進行返回 |
|
AndroidComma ndType |
|
enum AndroidCommandType { ACTION,SHUTDOWN } |
|
安卓命令的類型,隻有兩種,shutdown的處理方式和普通的action會不一樣 |
|
AndroidComma nd |
action/getElement |
JSONObject json; AndroidCommandType cmdType; |
|
從用戶發過來的json命令信息得到真正的命令 |
|
CommandHand ler |
execute |
|
|
虛擬類,其他真實CommandHandler如click的父類 |
|
AndroidComma ndExecutor |
execute |
HashMap< String, CommandHan dler> map
|
|
map是所有的命令字串和真實的CommandHandler的一個映射。 其成員函數execute就是通過字串命令找到map對應的handler然後執行的 |
|
AndroidComma ndResult |
AndroidCommandResult |
JSONObject json |
|
組織json格式返回值的類 |
|
AndroidElement |
Click |
UiObject el; String id; |
|
代表瞭一個控件 |
其中id是其在AndroidElementsHash維護的elements這個哈希表的key,並非控件id。 |
AndroidElement Hash |
addElement |
Hashtable< String, AndroidEle ment> elements;
|
|
維護這個session當前為止碰到過的所有控件的哈希表 |
註意key就是上面AndroidElement的id這個成員變量。每有一個新的控件從appium pc端過來這個值就會加一 |
Click |
execute |
|
CommandHandler |
處理點擊命令的類。 真正執行的是傳進來的AndroidCommand對應UiObject的Click方法 |
其他find,drag,setText等命令同理 |
Strategy |
fromString |
publicenumStrategy {
CLASS_NAME (class name”),
CSS_SELECT OR(css selector”) , ID(“id), NAME(“name ), LINK_TEXT( link text), PARTIAL_LI NK_TEXT(“p artial link text), XPATH(“xpa th), ACCESSIBIL ITY_ID(“ac cessibilit y id”), ANDROID_UI AUTOMATOR( -android uiautomato r); |
|
查找控件命令的策略類 |
find這個CommandHandler會根據用戶給出的不同策略來用不同的方式進行控件查找。比如用xpath的方式和用uiautomator的方式是不一樣的 |
|
|
|
|
|
|
這裡類在我們往下的分析文章中會做進一步的闡述,所以在這裡你隻需要由一個rough的idea這些類大概是怎麼一回事就可以瞭。
3. Bootstrap運行流程簡介
本來想畫一個類圖來描述bootstrap的架構的,但通過以上的類表可以看出來bootstrap裡面的關鍵類基本沒有真正用到面向對象中的繼承,因為它們基本上都沒有父類。其實我們也可以理解,每個類都不算復雜做的事情都不是很多,就算稍微需要做多點事情,組合其他的類來做就好瞭。 所以這裡我也放棄給大傢提供類圖瞭,就提供我自己手畫的(還是那句話,本人的macbook pro上沒有安裝相應的收費流程圖軟件)一個以處理appium從pc端過來的click命令的流程為例子的順序圖,大傢先有一個初步的idea,看不明白也沒有關系,我後面會另外開一篇文章專門來描述這個流程以把所有的關鍵類給串起來的。