Appium Android Bootstrap源碼分析之簡介

在上一個系列中咱們分析了UiAutomator的核心源碼,對UiAutomator是怎麼運行的原理有了根本的瞭解。今天咱們會開始另一個在安卓平臺上基於UiAutomator的新起之秀--Appium的源碼分析之旅。 本文在真個系列中會扮演一個簡介的角色,不會分析任何的代碼,只會先給你們一個基本的印象,方便你們在持有這個印象的基礎上往下和本人一塊分析。

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每一個類大概是怎麼一回事,這樣咱們往下的文章就比較好說,你們也比較好理解了。

Classcss

Key Methodandroid

Key Memberjson

Parentbootstrap

Description服務器

Comment微信

Bootstrap testRunServer 以一個UiAutomatorTestCase的方法的方式運行一個SocketServer來監聽4724端口 整個bootstrap是以UiAutomatorTestCase的方式運行的,因此這裏的Bootstrap這個類必需要繼承於UiAutomatorTestCase
SocketServer handleClientData 讀取socket進來的字串命令信息並轉換成AndroidCommand命令而後調用runCommand命令執行命令進行返回
AndroidCommandType enum AndroidCommandType {ACTION,SHUTDOWN } 安卓命令的類型,只有兩種,shutdown的處理方式和普通的action會不同
AndroidCommand action/getElement JSONObject json;AndroidCommandType cmdType; 從用戶發過來的json命令信息獲得真正的命令
CommandHandler execute 虛擬類,其餘真實CommandHandlerclick的父類
AndroidCommandExecutor execute HashMap<String,  CommandHan dler> map map是全部的命令字串和真實的CommandHandler的一個映射。其成員函數execute就是經過字串命令找到map對應的handler而後執行的
AndroidCommandResult AndroidCommandResult JSONObject json 組織json格式返回值的類
AndroidElement Click UiObject el;String id; 表明了一個控件 其中id是其在AndroidElementsHash維護的elements這個哈希表的key,並不是控件id
AndroidElementHash addElement Hashtable<String,  AndroidEle ment>  elements; 維護這個session當前爲止碰到過的全部控件的哈希表 注意key就是上面AndroidElementid這個成員變量。每有一個新的控件從appium pc端過來這個值就會加一
Click execute CommandHandler 處理點擊命令的類。真正執行的是傳進來的AndroidCommand對應UiObjectClick方法 其餘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,看不明白也沒有關係,我後面會另外開一篇文章專門來描述這個流程以把全部的關鍵類給串起來的。
做者 自主博客 微信服務號及掃描碼 CSDN
天地會珠海分舵 http://techgogogo.com 服務號:TechGoGoGo掃描碼:qrcode_for_gh_0388b3c825f5_430 http://blog.csdn.net/zhubaitian
 
相關文章
相關標籤/搜索