溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Appium Android Bootstrap源碼分析之簡介

發(fā)布時間:2020-07-09 09:20:38 來源:網(wǎng)絡 閱讀:289 作者:zhukev 欄目:移動開發(fā)

在上一個系列中我們分析了UiAutomator的核心源碼,對UiAutomator是怎么運行的原理有了根本的了解。今天我們會開始另外一個在安卓平臺上基于UiAutomator的新起之秀--Appium的源碼分析之旅。

本文在真?zhèn)€系列中會扮演一個簡介的角色,不會分析任何的代碼,只會先給大家一個基本的印象,方便大家在持有這個印象的基礎上往下和本人一塊分析。

1. Bootstrap定義及在Appium中扮演的角色

我們先看一下本人大概一個月之前剛接觸appium時整理的一個高層架構(gòu)圖

Appium Android Bootstrap源碼分析之簡介

下面一部分就是藍色的就是bootstrap所在的位置,可以看到它是運行在我們的安卓目標測試機器端的,它會監(jiān)聽4724端口獲得命令然后pass給UiAutomator來做處理。

那么我們應該怎么來給bootstrap做一個定義呢?我不知道官方有沒有做一個定義,但是按照我自己的語言,我會這樣來定義它:

  • Bootstrap是Appium運行在安卓目標測試機器上的一個UiAutomator測試腳本,該腳本的唯一一個測試方法所做的事情是在目標機器開啟一個socket服務器來把一個session中Appium從PC端過來的命令發(fā)送給UiAutomator來執(zhí)行處理。

這個定義說明了bootstrap在appium和uiautomator中究竟處于一個什么樣的角色:
  • 首先,它是一個uiautomator的測試腳本,它的入口類Bootstrap繼承于UiAutomatorTestCase,所以UiAututomator可以正常運行它,它也可以正常的使用uiautomator的方法,這個就是appium的命令可以轉(zhuǎn)換成uiautomator的命令的關(guān)鍵
  • 其次,它是一個socket服務器,它專門監(jiān)聽4724端口過來的appium的連接和命令數(shù)據(jù),并把appium的命令轉(zhuǎn)換成uiautomator的命令來讓uiautomator進行處理
  • 最后,它處理的是appium從pc端過來的命令,而非一個文件。這在初次接觸appium的朋友是很容易困惑的,以為appium是整個腳本文件發(fā)送到目標機器再由bootstrap進行分析處理的,事實并非如此

2. Bootstrap關(guān)鍵類一覽表

上面寥寥幾句道出了bootstrap的定義,那么往下我們就繼續(xù)寥寥幾行的把bootstrap這個jar包的關(guān)鍵類以及它的關(guān)鍵方法和相應的本人的一些說明給列出來,給大家現(xiàn)有一個draft idea每個類大概是怎么一回事,這樣我們往下的文章就比較好說,大家也比較好理解了。

Class

Key Method

Key Member

Parent

Description

Comment

Bootstrap

testRunServer



以一個UiAutomatorTestCase的方法的方式運行一個SocketServer來監(jiān)聽4724端口

整個bootstrap是以UiAutomatorTestCase的方式運行的,所以這里的Bootstrap這個類必須要繼承于UiAutomatorTestCase

SocketServer

handleClientData



讀取socket進來的字串命令信息并轉(zhuǎn)換成AndroidCommand命令然后調(diào)用runCommand命令執(zhí)行命令進行返回


AndroidComma

ndType


enum AndroidCommandType {

ACTION,SHUTDOWN

}


安卓命令的類型,只有兩種,shutdown的處理方式和普通的action會不一樣


AndroidComma

nd

action/getElement

JSONObject json;

AndroidCommandType cmdType;


從用戶發(fā)過來的json命令信息得到真正的命令


CommandHand

ler

execute



虛擬類,其他真實CommandHandlerclick的父類


AndroidComma

ndExecutor

execute

HashMap<

String, 

CommandHan

dler> map



map是所有的命令字串和真實的CommandHandler的一個映射。

其成員函數(shù)execute就是通過字串命令找到map對應的handler然后執(zhí)行的


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就是上面AndroidElementid這個成員變量。每有一個新的控件從appium pc端過來這個值就會加一

Click

execute


CommandHandler

處理點擊命令的類。

真正執(zhí)行的是傳進來的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會根據(jù)用戶給出的不同策略來用不同的方式進行控件查找。比如用xpath的方式和用uiautomator的方式是不一樣的







這里類在我們往下的分析文章中會做進一步的闡述,所以在這里你只需要由一個rough的idea這些類大概是怎么一回事就可以了。


3. Bootstrap運行流程簡介

本來想畫一個類圖來描述bootstrap的架構(gòu)的,但通過以上的類表可以看出來bootstrap里面的關(guān)鍵類基本沒有真正用到面向?qū)ο笾械睦^承,因為它們基本上都沒有父類。其實我們也可以理解,每個類都不算復雜做的事情都不是很多,就算稍微需要做多點事情,組合其他的類來做就好了。
所以這里我也放棄給大家提供類圖了,就提供我自己手畫的(還是那句話,本人的macbook pro上沒有安裝相應的收費流程圖軟件)一個以處理appium從pc端過來的click命令的流程為例子的順序圖,大家先有一個初步的idea,看不明白也沒有關(guān)系,我后面會另外開一篇文章專門來描述這個流程以把所有的關(guān)鍵類給串起來的。
Appium Android Bootstrap源碼分析之簡介


<rt id="21qky"><optgroup id="21qky"></optgroup></rt>

           

          作者

          自主博客

          微信

          CSDN

          天地會珠海分舵

          http://techgogogo.com


          服務號:TechGoGoGo

          掃描碼:

          Appium Android Bootstrap源碼分析之簡介

          向AI問一下細節(jié)

          免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

          AI

        1. <nobr id="21qky"><del id="21qky"></del></nobr>