Appium和它的設(shè)計(jì)思想
什么是Appium?
1、appium是開源的移動(dòng)端自動(dòng)化測(cè)試框架;
2、appium可以測(cè)試原生的、混合的、以及移動(dòng)端的web項(xiàng)目;
3、appium可以測(cè)試ios,android應(yīng)用(當(dāng)然了,還有firefoxos);
4、appium是跨平臺(tái)的,可以用在osx,windows以及l(fā)inux桌面系統(tǒng)上;
Appium的設(shè)計(jì)哲學(xué)
1、不需要為了自動(dòng)化而且重新編譯或修改測(cè)試app;
2、不應(yīng)該讓移動(dòng)端自動(dòng)化測(cè)試限定在某種語言和某個(gè)具體的框架;也就是說任何人都可以使用自己最熟悉最順手的語言以及框架來做移動(dòng)端自動(dòng)化測(cè)試;
3、不要為了移動(dòng)端的自動(dòng)化測(cè)試而重新發(fā)明輪子,重新寫一套驚天動(dòng)地的api;也就是說webdriver協(xié)議里的api已經(jīng)夠好了,拿來改進(jìn)一下就可以了;
4、移動(dòng)端自動(dòng)化測(cè)試應(yīng)該是開源的;
Appium的設(shè)計(jì)思想
1、為了能夠?qū)崿F(xiàn)哲學(xué)里描述的第2條,也就是不應(yīng)該讓移動(dòng)端自動(dòng)化測(cè)試限定在某種語言和某個(gè)具體的框架;也就是說任何人都可以使用自己最熟悉最順手的語言以及框架來做移動(dòng)端自動(dòng)化測(cè)試;appium選擇了client-server的設(shè)計(jì)模式。只要client能夠發(fā)送http請(qǐng)求給server,那么的話client用什么語言來實(shí)現(xiàn)都是可以的,這就是appium及webdriver如何做到支持多語言的;
2、為了能夠?qū)崿F(xiàn)不要為了移動(dòng)端的自動(dòng)化測(cè)試而重新發(fā)明輪子,重新寫一套驚天動(dòng)地的api;也就是說webdriver協(xié)議里的api已經(jīng)夠好了,拿來改進(jìn)一下就可以了;這個(gè)思想,appium擴(kuò)展了webdriver的協(xié)議,沒有自己重新去實(shí)現(xiàn)一套。這樣的好處是以前的webdriverapi能夠直接被繼承過來,以前的webdriver各種語言的binding都可以拿來就用,省去了為每種語言開發(fā)一個(gè)client的工作量;
3、appium是開源的,這也實(shí)現(xiàn)了哲學(xué)思想里的最后一點(diǎn)
Appium的基本概念
C/S架構(gòu)
appium的核心其實(shí)是一個(gè)暴露了一系列REST API的server。
這個(gè)server的功能其實(shí)很簡(jiǎn)單:監(jiān)聽一個(gè)端口,然后接收由client發(fā)送來的command。翻譯這些command,把這些command轉(zhuǎn)成移動(dòng)設(shè)備可以理解的形式發(fā)送給移動(dòng)設(shè)備,然后移動(dòng)設(shè)備執(zhí)行完這些command后把執(zhí)行結(jié)果返回給appiumserver,appiumserver再把執(zhí)行結(jié)果返回給client。
在這里client其實(shí)就是發(fā)起command的設(shè)備,一般來說就是我們代碼執(zhí)行的機(jī)器,執(zhí)行appium測(cè)試代碼的機(jī)器。狹義點(diǎn)理解,可以把client理解成是代碼,這些代碼可以是java/ruby/python/js的,只要它實(shí)現(xiàn)了webdriver標(biāo)準(zhǔn)協(xié)議就可以。
這樣的設(shè)計(jì)思想帶來了一些好處:
可以帶來多語言的支持;
可以把server放在任意機(jī)器上,哪怕是云服務(wù)器都可以;(是的,appium和webdriver天生適合云測(cè)試)

Session
session就是一個(gè)會(huì)話,在webdriver/appium,你的所有工作永遠(yuǎn)都是在session start后才可以進(jìn)行的。一般來說,通過POST /session這個(gè)URL,然后傳入Desired Capabilities就可以開啟session了。
開啟session后,會(huì)返回一個(gè)全局唯一的session id,以后幾乎所有的請(qǐng)求都必須帶上這個(gè)session id,因?yàn)檫@個(gè)seesionid代表了你所打開的瀏覽器或者是移動(dòng)設(shè)備的模擬器。
進(jìn)一步思考一下,由于session id是全局唯一,那么在同一臺(tái)機(jī)器上啟動(dòng)多個(gè)session就變成了可能,這也就是selenium gird所依賴的具體理論根據(jù)。
session就是一個(gè)會(huì)話,在webdriver/appium,你的所有工作永遠(yuǎn)都是在session start后才可以進(jìn)行的。一般來說,通過POST /session這個(gè)URL,然后傳入Desired Capabilities就可以開啟session了。
開啟session后,會(huì)返回一個(gè)全局唯一的session id,以后幾乎所有的請(qǐng)求都必須帶上這個(gè)session id,因?yàn)檫@個(gè)seesionid代表了你所打開的瀏覽器或者是移動(dòng)設(shè)備的模擬器。
進(jìn)一步思考一下,由于session id是全局唯一,那么在同一臺(tái)機(jī)器上啟動(dòng)多個(gè)session就變成了可能,這也就是selenium gird所依賴的具體理論根據(jù)。
Desired Capabilities
Desired Capabilities攜帶了一些配置信息。從本質(zhì)上講,這個(gè)東東是key-value形式的對(duì)象。你可以理解成是java里的map,python里的字典,ruby里的hash以及js里的json對(duì)象。實(shí)際上Desired Capabilities在傳輸時(shí)就是json對(duì)象。
Desired Capabilities最重要的作用是告訴server本次測(cè)試的上下文。這次是要進(jìn)行瀏覽器測(cè)試還是移動(dòng)端測(cè)試?如果是移動(dòng)端測(cè)試的話是測(cè)試android還是ios,如果測(cè)試android的話那么我們要測(cè)試哪個(gè)app?server的這些疑問Desired Capabilities都必須給予解答,否則server不買賬,自然就無法完成移動(dòng)app或者是瀏覽器的啟動(dòng)。
automationName:使用哪種自動(dòng)化引擎。appium(默認(rèn))還是Selendroid?
platformName:使用哪種移動(dòng)平臺(tái)。iOS,?Android,orFirefoxOS?
deviceName:?jiǎn)?dòng)哪種設(shè)備,是真機(jī)還是模擬器?iPhone
Simulator,?iPad Simulator,?iPhone Retina 4-inch,?Android Emulator,?Galaxy S4, etc...
app:應(yīng)用的絕對(duì)路徑,注意一定是絕對(duì)路徑。如果指定了appPackage和appActivity的話,這個(gè)屬性是可以不設(shè)置的。另外這個(gè)屬性和browserName屬性是沖突的。
browserName:移動(dòng)瀏覽器的名稱。比如Safari' for
iOS and 'Chrome', 'Chromium', or 'Browser' for Android;與app屬性互斥。
udid:物理機(jī)的id。比如1ae203187fc012g。
Appium的環(huán)境搭建
Appium支持Windows和Mac端,如果你在Windows上安裝appium,你沒法使用預(yù)編譯專用于OS X的.app文件,你也將不能測(cè)試IOS apps,因?yàn)閍ppium依賴OS X專用的庫(IOSSDK)來支持IOS測(cè)試。這意味著你只能通過在mac上來運(yùn)行IOS的app測(cè)試。所有的測(cè)試工具都是這樣,只有在MAC平臺(tái)上才可以測(cè)試IOS設(shè)備。所以我們采用AppiumforMAC來為大家說明Appium的環(huán)境搭建、測(cè)試腳本及使用方法。Appium在mac上環(huán)境搭建有2種方式,一種是命令方式,一種是直接安裝dmgGUI版本方式搭建環(huán)境。
命令形式搭建Appium環(huán)境
1、java需要JDK8
localhost:~ghl$ java -version
java version
"1.8.0_92"
Java(TM) SERuntimeEnvironment(build1.8.0_92-b14)
JavaHotSpot(TM) 64-Bit
Server VM (build25.92-b14, mixed mode)
2、git
localhost:~ghl$git--version
gitversion 2.9.3 (Apple Git-75)
3、ruby
localhost:~ghl$ ruby -v
ruby2.0.0p648 (2015-12-16revision53162)[universal.x86_64-darwin16]
4、brew
localhost:~ghl$ brew -v
Homebrew1.1.11
Homebrew/homebrew-core(gitrevision726e;lastcommit2017-03-16)
5、node
brew install node
6、npm
localhost:~ghl$npm-v
4.1.2
7、Appium和Appium-doctor的安裝
npm install –g appium
npm install appium-doctor -g
8、webdriver
npm install wd
9、Xcode和AndroidStduio的安裝
以上所有安裝完成之后,執(zhí)行appium-doctor檢測(cè)Appium環(huán)境是否搭建成功,如果成功,則如下圖所示。

Appium GUI版本安裝
鏈接: https://pan.baidu.com/s/1skDxXLj? 密碼: e3f7
需要注意的地方,JDK版本一定要8,Xcode版本8.2以上。

Appium client的安裝
appiumclient是對(duì)webdriver原生api的一些擴(kuò)展和封裝。它可以幫助我們更容易的寫出用例,寫出更好懂的用例。
appiumclient是配合原生的webdriver來使用的,因此二者必須配合使用缺一不可。
Appium client有很多種,有java-client、php-client、python-client、node-adb-client、perl-client、ruby-lib
Java-Client的安裝
使用IEDA新建maven工程
為工程添加如下依賴

移動(dòng)端的安裝
Android的虛擬機(jī)可以使用Genymotion也可以使用真機(jī)測(cè)試。

IOS端可以使用Xcdoe自帶的虛擬機(jī),也可以使用真機(jī)測(cè)試。
Appium Java-Client實(shí)例
AppiumServer端啟動(dòng)
命令行形式啟動(dòng)
localhost:~ghl$appium-a 127.0.0.1 -p4723
[Appium]WelcometoAppiumv1.6.4
[Appium] Non-default server args:
[Appium]address: 127.0.0.1
[Appium]Appium REST http interface listener started on 127.0.0.1:4723
也可以通過桌面版啟動(dòng)


Java測(cè)試腳本簡(jiǎn)單示例
在工程內(nèi)添加依賴

在test目錄下構(gòu)建層級(jí)目錄,以Android為例新建測(cè)試類

測(cè)試腳本的書寫

運(yùn)行測(cè)試腳本
首先啟動(dòng)對(duì)應(yīng)的模擬器或者連接對(duì)應(yīng)的真機(jī)設(shè)備
可以直接對(duì)單個(gè)腳本測(cè)試,也可以使用maven插件命令同時(shí)對(duì)多個(gè)腳本進(jìn)行測(cè)試。
如果使用maven插件加入以下插件依賴:

關(guān)于控件定位
Android的控件定位
進(jìn)入SDK/Tools目錄,找到uiautomatorviewer鼠標(biāo)拖到終端里,回車顯示如下界面。點(diǎn)擊框選按鈕,找到你要找的控件,得到Resourceid.

獲取到控件ID之后就可以精確定位到控件從而模擬用戶操作。

IOS的控件定位
打開終端使用npm install app-inspector -g安裝app-inspector
如果安裝app-inspector緩慢或者失敗,切換國(guó)內(nèi)淘寶鏡像,前面環(huán)境安裝的也類似npm config set registry https://registry.npm.taobao.org
使用命令npm install macaca-cli -g安裝macaca,然后運(yùn)行macaca doctor檢測(cè)環(huán)境是否正常。

若不正常,哪項(xiàng)顯示為紅色相應(yīng)的解決,可以網(wǎng)上找一下資料,如我的IOS環(huán)境有2項(xiàng)異常,分別用brew install ios-webkit-debug-proxy和brew install usbmuxd修復(fù),再次運(yùn)行macaca doctor,IOS環(huán)境正常。

終端運(yùn)行instruments –s查看當(dāng)前所有可用設(shè)備,得到相應(yīng)設(shè)備UUID
終端運(yùn)行app-insepctor –u 設(shè)備UUID即可啟動(dòng)inspector,會(huì)從瀏覽器打開一個(gè)網(wǎng)頁,如下圖所示。注意點(diǎn):XcodeSwift版本要大于等于3.1,否則會(huì)出現(xiàn)異常無法啟動(dòng)。使用xcrun swift–version命令查看當(dāng)前Swift版本。

獲取到控件ID之后就可以精確定位到控件從而模擬用戶操作。

關(guān)于WebView頁面元素的定位
Android的WebView頁面類的元素用原有的方法是定位不到的,需要在定位之前加入以下代碼:

然后在瀏覽器中打開網(wǎng)頁對(duì)應(yīng)地址,通過開發(fā)者工具定位元素的id或者class,通過頁面元素標(biāo)簽里的這2個(gè)屬性定位WebView頁面元素。如果不知道網(wǎng)頁地址,可以使用Chrome瀏覽器,手機(jī)連接電腦或者開啟模擬器,輸入chrome://inspect/#devices。就會(huì)顯示模擬器或者真機(jī)設(shè)備上WebView的地址。
IOS的WebView元素定位方法還是使用app-inspector工具來進(jìn)行定位??梢詼?zhǔn)確獲取每個(gè)頁面的元素的Xpath。