
【基本介紹】
Appium是什么?Appium是一個(gè)開(kāi)源、跨平臺(tái)的測(cè)試框架,可以用來(lái)測(cè)試原生及混合的移動(dòng)端應(yīng)用。Appium支持IOS、Android及FirefoxOS平臺(tái)。Appium使用WebDriver的jsonwire協(xié)議,來(lái)驅(qū)動(dòng)Apple系統(tǒng)的UIAutomation庫(kù)、Android系統(tǒng)的UIAutomator框架。Appium對(duì)IOS系統(tǒng)的支持得益于DanCuellar’s對(duì)于IOS自動(dòng)化的研究。Appium也集成了Selendroid,來(lái)支持老android版本。
Appium 是一個(gè)自動(dòng)化測(cè)試開(kāi)源工具,支持 iOS 平臺(tái)和 Android 平臺(tái)上的原生應(yīng)用,web 應(yīng)用和混合應(yīng)用。
“移動(dòng)原生應(yīng)用”是指那些用iOS或者 Android SDK 寫(xiě)的應(yīng)用(Application簡(jiǎn)稱app)。
“移動(dòng)web應(yīng)用”是指使用移動(dòng)瀏覽器訪問(wèn)的應(yīng)用(appium支持iOS上的Safari和Android上的 Chrome)。
“混合應(yīng)用”是指原生代碼封裝網(wǎng)頁(yè)視圖——原生代碼和 web 內(nèi)容交互。比如,像 Phonegap,可以幫助開(kāi)發(fā)者使用網(wǎng)頁(yè)技術(shù)開(kāi)發(fā)應(yīng)用,然后用原生代碼封裝,這些就是混合應(yīng)用。
【軟件理念】
無(wú)需為了自動(dòng)化,而重新編譯或者修改我們的應(yīng)用;不必局限于某種語(yǔ)言或者框架來(lái)寫(xiě)和運(yùn)行測(cè)試腳本;
一個(gè)移動(dòng)自動(dòng)化的框架不應(yīng)該在接口上重復(fù)造輪子;
無(wú)論精神上,還是名義上,都必須要開(kāi)源。
【軟件特點(diǎn)】
appium是跨平臺(tái)的,可以用在OSX,Windows以及Linux桌面系統(tǒng)上運(yùn)行。appium選擇了Client/Server的設(shè)計(jì)模式。只要client能夠發(fā)送http請(qǐng)求給server,那么的話client用什么語(yǔ)言來(lái)實(shí)現(xiàn)都是可以的,這就是appium及Selenium(WebDriver)如何做到支持多語(yǔ)言的原因;
appium擴(kuò)展了WebDriver的協(xié)議,沒(méi)有自己重新去實(shí)現(xiàn)一套。這樣的好處是以前的WebDriver API能夠直接被繼承過(guò)來(lái),以前的Selenium(WebDriver)各種語(yǔ)言的binding都可以拿來(lái)就用,省去了為每種語(yǔ)言開(kāi)發(fā)一個(gè)client的工作量;
【工作原理】

通過(guò)上面一張圖簡(jiǎn)單展示了appium的工具原理。
首先,appium支持多語(yǔ)言,因?yàn)樗槍?duì)流的幾種語(yǔ)言分別開(kāi)發(fā)的相應(yīng)的appium庫(kù)。好處就是我們可以選擇自己熟悉的語(yǔ)言編寫(xiě)appium腳本。
其次,appium支持多平臺(tái),包括MAC和Windows。它針對(duì)這兩大平臺(tái)開(kāi)發(fā)了appium-Server。
最后,appium又同時(shí)支持Android 和 iOS兩個(gè)操作系統(tǒng)。
這就使得appium變得非常靈活。
當(dāng)我在MAC平臺(tái)上,通過(guò)Python(python-client )編寫(xiě)了一個(gè)appium自動(dòng)化腳本并執(zhí)行,請(qǐng)求會(huì)首先到 appium.dum (MAC下的appium-Server),appium-Server通過(guò)解析,驅(qū)動(dòng)iOS設(shè)備來(lái)執(zhí)行appium自動(dòng)化腳本。
或者,我在Windows平臺(tái)上,通過(guò)Java( java-client )編寫(xiě)了一個(gè)appium自動(dòng)化腳本并執(zhí)行,請(qǐng)求會(huì)首先到 appiumForWindow.zip(Window下的appium-Server),appium-Server通過(guò)解析,驅(qū)動(dòng)Android虛擬機(jī)或真機(jī)來(lái)執(zhí)行appium腳本。
所以,你會(huì)看到appium的強(qiáng)大之處就在于此。
【相關(guān)概念】
·C/S 架構(gòu)Appium 的核心是一個(gè) web 服務(wù)器,它提供了一套 REST 的接口。它收到客戶端的連接,監(jiān)聽(tīng)到命令,接著在移動(dòng)設(shè)備上執(zhí)行這些命令,然后將執(zhí)行結(jié)果放在 HTTP響應(yīng)中返還給客戶端。
·Session
自動(dòng)化始終圍繞一個(gè)session進(jìn)行,客戶端初始化一個(gè)seesion(會(huì)話)來(lái)與服務(wù)端交互,不同的語(yǔ)言有不同的實(shí)現(xiàn)方式,但是他們最終都是發(fā)送為一個(gè)POST請(qǐng)求給服務(wù)端,請(qǐng)求中包含一個(gè)JSON對(duì)象,被稱作“desired capabilities”。此時(shí),服務(wù)端就會(huì)開(kāi)啟一個(gè)自動(dòng)化的 session,然后返回一個(gè) session ID,session ID將會(huì)被用戶發(fā)送后續(xù)的命令。
·Desired Capabilities
Desired capabilities 是一些鍵值對(duì)的集合 (比如,一個(gè) map 或者 hash),客戶端將這些鍵值對(duì)發(fā)給服務(wù)端,告訴服務(wù)端我們想要怎么測(cè)試。比如,我們可以把platformName capability 設(shè)置為 iOS,告訴 Appium 服務(wù)端,我們想要一個(gè)iOS 的 session,而不是一個(gè) Android 的。
·Appium Server
Appium server 是用 Node.js 寫(xiě)的。我們可以用源碼編譯或者從 NPM 直接安裝。
·Appium 服務(wù)端
Appium 服務(wù)端有很多語(yǔ)言庫(kù) Java, Ruby, Python, PHP, JavaScript 和 C#,這些庫(kù)都實(shí)現(xiàn)了 Appium 對(duì) WebDriver 協(xié)議的擴(kuò)展。當(dāng)使用 Appium 的時(shí)候,你只需使用這些庫(kù)代替常規(guī)的 WebDriver 庫(kù)就可以了。
·Appium.dmg, Appium.exe
我們提供了 GUI 封裝的 Appium 服務(wù)端下載,它封裝了運(yùn)行 Appium服務(wù)端的所有依賴,而不需要擔(dān)心怎樣安裝Node.js。其中還包括一個(gè)Inspector工具(MAC機(jī)上才能用),可以幫助你檢查應(yīng)用的界面層級(jí),這樣寫(xiě)測(cè)試用例時(shí)更方便。
【安裝方法】
windows如何安裝appiumappium提供兩種方式進(jìn)行安裝,一種提供了應(yīng)用程序,即為一鍵安裝即可完成安裝,另一種方式安裝是命令,只要在cmd輸入相關(guān)命令即可完成安裝。
appium安裝流程如下:
首先在本站下載appium安裝程序
解壓出壓縮包文件,直接雙擊應(yīng)用程序,啟動(dòng)安裝

選擇語(yǔ)言,默認(rèn)是英語(yǔ)的,暫時(shí)無(wú)中文語(yǔ)言,那么默認(rèn)語(yǔ)言安裝即可。

然后直接“next”,下一步即可

默認(rèn)安裝路徑是在C盤(pán),如果c空間不夠大,可以選擇其它安裝到路徑下

是為啟動(dòng)應(yīng)用文件名,默認(rèn)就好,點(diǎn)擊下一步“next”

是否要桌面創(chuàng)建圖標(biāo),可以選擇和不選擇,這里默人安裝,點(diǎn)擊“next”

安裝信息進(jìn)行確認(rèn),點(diǎn)擊“install”

點(diǎn)擊install,開(kāi)始安裝程序,在安裝程序過(guò)程中,會(huì)不斷打印信息。

顯示completing the appium setup wizard,說(shuō)明提示安裝完成

進(jìn)入安裝到安裝目錄下,雙擊啟動(dòng)appium程序

提示下列,說(shuō)明安裝無(wú)問(wèn)題,開(kāi)始appium自動(dòng)化測(cè)試之旅

【界面介紹】
首先看第一幅圖,如果你的是windows那么界面就應(yīng)該是這樣的,所以你發(fā)現(xiàn)你的和我的不一樣也不用擔(dān)心,正常。windows版整個(gè)界面只有7個(gè)按鈕,我會(huì)按照從左到右從上到下的順序講。(mac的會(huì)有一定的差異,但并不是很大,只是排版和樣式的問(wèn)題,但是功能都一樣。)
一. Android Settings
主要是配置android的相關(guān)設(shè)置,他里面的結(jié)構(gòu)圖如下:

1.Application Path:選擇路徑,選擇需要測(cè)試的app在本電腦存放的一個(gè)路徑。在啟動(dòng)appium時(shí)他會(huì)默認(rèn)去該路徑下去尋找這個(gè)app,然后將他安裝到指定的手機(jī)上。
2.Package:之前提到過(guò)的,我們這個(gè)包的身份證,我們需要通過(guò)這個(gè)去找到包,不然我們安裝后我們通過(guò)什么去辨別這些包呢?
3.Launch Activity:故名思義,啟動(dòng)的activity,activity的時(shí)候提到過(guò),我們啟動(dòng)app時(shí)需要去運(yùn)行的activity,這里我們填寫(xiě)首次啟動(dòng)頁(yè)面的activity。
備注:這里需要注意一個(gè)問(wèn)題在我們每次通過(guò)Choose選擇apk后,appium會(huì)自動(dòng)把這個(gè)包進(jìn)行重新簽名,那么在package以及activity里面會(huì)自動(dòng)把包名和activity的名稱列進(jìn)去,但是這里會(huì)出現(xiàn)一個(gè)問(wèn)題,每次選擇apk后列表中會(huì)有一個(gè)緩存的原因,即使你更改了apk,但是package還是沒(méi)有變,這樣啟動(dòng)的時(shí)候就一直報(bào)錯(cuò),遇見(jiàn)這樣的情況不要著急,重新啟動(dòng)兩次就好。
4.Wait for Activity: 和上面的差不多,意思是等待某個(gè)Activity打開(kāi),用的時(shí)間不是很多,做了解。
5.Launch Device:標(biāo)簽下面的東西用得相對(duì)比較少,后面大家可以去了解一下。
6.Capabilities:該標(biāo)簽下和我們做自動(dòng)化關(guān)系很大,后面我們做自動(dòng)化時(shí)如何配置啟動(dòng)app等信息就用的該標(biāo)簽下的數(shù)據(jù)。
7.Platform Name:我們測(cè)試的app的類型,ios選擇ios,android選擇Android就好。
8.Automation Name:測(cè)試引擎的名稱,我們使用的是appium,所以你第一眼就能看見(jiàn)Appium,但是他還有一個(gè)Selendroid??赡芸吹竭@里會(huì)有一些疑惑,為什么appium要選擇兩套系統(tǒng)呢?其實(shí)這個(gè)應(yīng)該追溯到android的版本問(wèn)題,android自己的工具在4.2版本以前是一個(gè),但是后面進(jìn)行了更新,可能也正是因?yàn)檫@個(gè)原因appium也才采用了兩套,所以當(dāng)你測(cè)試的app安裝的機(jī)器時(shí)在4.0或之前的版本時(shí)那么這里的引擎你就必須選擇Selendroid,是否這樣大家可以動(dòng)手去試一試。檢驗(yàn)真理的唯一標(biāo)準(zhǔn)就是自己動(dòng)手嘗試。
9.Platform Version:安裝應(yīng)用手機(jī)的版本號(hào),android的是幾點(diǎn)幾的版本。
10.Device Name:設(shè)備名稱。
備注:這里會(huì)有一個(gè)問(wèn)題,如果你測(cè)試android時(shí),只把一臺(tái)手機(jī)插入到電腦,即使你輸入的Device Name是錯(cuò)誤的,但是你依然能夠正常安裝,使用。但是ios是不行的。不知道在設(shè)計(jì)的時(shí)候是否就是如此考慮的,如果在以后使用中遇見(jiàn)類似問(wèn)題大家不要驚慌。
11.Advanced標(biāo)簽下的東西在初級(jí)階段不用擔(dān)心,這個(gè)標(biāo)簽只是在你想同一臺(tái)電腦同時(shí)控制多臺(tái)手機(jī)的時(shí)候才能使用,需要更改Bootstrap Port的端口號(hào),記住這一點(diǎn)就好。
二、General Setting:
在General Setting里面在通常情況下我們使用默認(rèn)設(shè)置就好,但還是有一些基礎(chǔ)設(shè)置可以進(jìn)行調(diào)整,方便后期的學(xué)習(xí)。整個(gè)頁(yè)面分成了Server和log兩部分,默認(rèn)的情況如下面圖片。

1.Server Address:配置appium服務(wù)的地址,正常情況我們不需要更改,但是如果我們需要配置多臺(tái)手機(jī)的時(shí)候啟動(dòng)了多個(gè)appium服務(wù),那么這里的端口號(hào)我們需要進(jìn)行調(diào)整,如果你多個(gè)都弄的同一個(gè)端口會(huì)報(bào)錯(cuò)。
2.Override Existing Session: session覆蓋,可能對(duì)于初學(xué)者不理解什么叫session,你這里暫時(shí)理解為會(huì)話,我和你會(huì)話的唯一標(biāo)示。
3.Log To File:默認(rèn)狀態(tài)是沒(méi)有任何數(shù)據(jù),但是在做自動(dòng)化時(shí)建議選擇,因?yàn)檫x擇之后appium在運(yùn)行時(shí)產(chǎn)生的日志都會(huì)保留到你設(shè)置的問(wèn)題件,這個(gè)對(duì)后期的bug定位有相當(dāng)大的幫助。切記!
【環(huán)境搭建】
appium環(huán)境搭建步驟1.安裝node.js
首先下載node.js安裝文件,并安裝該程序。

安裝完成后,在命令提示符中輸入node -V或者npm驗(yàn)證是否成功安裝。


步驟2.安裝JDK
由于android是由Java語(yǔ)言開(kāi)發(fā)的,所以如果要進(jìn)行android自動(dòng)化測(cè)試,需要安裝java環(huán)境,所以我們需要安裝JDK。根據(jù)當(dāng)前PC機(jī)的系統(tǒng)選擇對(duì)應(yīng)的jdk進(jìn)行安裝。

jdk安裝完成后,需要將jdk的加到環(huán)境變量中,需要進(jìn)行環(huán)境變量設(shè)置:我的電腦->右鍵->屬性->高級(jí)->環(huán)境變量->系統(tǒng)變量->新建;以及將該變量加到系統(tǒng)的path中。



步驟3.安裝android SDK
下載android sdk并解壓放到對(duì)應(yīng)的目錄下

雙擊打開(kāi)sdk manager,并進(jìn)行sdk的相關(guān)插件的安裝和更新。點(diǎn)擊Tools->options進(jìn)行HTTP的代理設(shè)置,由于國(guó)內(nèi)只能通過(guò)代理才能訪問(wèn)google的android安裝,故需要填寫(xiě)可用的代理網(wǎng)址,圖中為國(guó)內(nèi)可用的代理網(wǎng)址,更多的可以通過(guò)百度搜索。

關(guān)閉后,sdk manager會(huì)自動(dòng)與代理連接,將可安裝和可更新的插件展示出來(lái),根據(jù)實(shí)際需求進(jìn)行對(duì)應(yīng)的安裝和更新。

安裝完成后,進(jìn)行android sdk的環(huán)境變量設(shè)置,將platforms-tools和tools目錄加入到環(huán)境變量。

步驟4.安裝appium client
在命令行通過(guò)命令"pip install Appium-Python-Client"安裝python版本的appium client,如果沒(méi)有python,請(qǐng)先安裝python。

步驟5.安裝appium
首先下載appium安裝程序到本地,并安裝該程序。
appium安裝成功后,打開(kāi)該程序。

步驟6.appium連接真機(jī)
將安卓手機(jī)通過(guò)usb連接到電腦,并開(kāi)啟調(diào)試模式;然后在命令提示符中輸入"adb device -l"查看手機(jī)的"Device Name"

點(diǎn)擊appium左上角的"機(jī)器人圖標(biāo)",在彈出的窗口填入安卓手機(jī)的相關(guān)信息,然后點(diǎn)擊右上角的"播放"按鈕。如果手機(jī)提示需要安裝程序(appium控制手機(jī)的相關(guān)程序),請(qǐng)?jiān)试S。

首先在手機(jī)上打開(kāi)需要測(cè)試的APP,然后在運(yùn)行sdk的tools目錄下的ui automator viewer;在打開(kāi)的窗口中點(diǎn)擊左上角的連接設(shè)備圖標(biāo),中就會(huì)出現(xiàn)安卓手機(jī)的當(dāng)前界面;通過(guò)鼠標(biāo)點(diǎn)擊相應(yīng)位置,就可以進(jìn)行app的相關(guān)API元素查詢了。根據(jù)API元素就可以進(jìn)行python +APP自動(dòng)化腳本編寫(xiě)了。

【操作技巧】
1 截屏//截屏圖片保存路徑
static String path = "E:\\workspace\\PhonewoTest\\ScreenshotPic\\";
static AndroidDriver driver = DriverInit.driver;
/*截屏
* tag表示一個(gè)模塊標(biāo)記字符
*/
public static void takeScreenShot(AndroidDriver driver,String tag){
File screenShotFile =
((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(screenShotFile, new File(path + tag +
getCurrentDateTime()+ ".jpg"));
}catch (IOException e) {
e.printStackTrace();
}
}
//格式化當(dāng)前時(shí)間
public static String getCurrentDateTime(){
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd_HHmmss");//設(shè)置日期格式
return df.format(new Date());
}
2 粘貼
/*粘貼
*/
public static void Clip(WebElement el) {
//獲取焦點(diǎn)
el.click();
//ctrl+v的組合操作
driver.sendKeyEvent(50,AndroidKeyMetastate.META_CTRL_ON);
}
3 硬件返回
driver.sendKeyEvent(4);
或者,
driver.sendKeyEvent(AndroidKeyCode.BACK);
4 滑動(dòng)
//向上滑動(dòng)
driver.swipe(20, 400, 20, 100, 300);
5 長(zhǎng)按
//初始化
TouchAction action = new TouchAction(driver);
//獲取要長(zhǎng)按的元素
WebElement el = driver.findElement(By.id("cn.langma.phonewo:id/user_name"));
//長(zhǎng)按
action.longPress(el).perform();
6 按住不放
//初始化
TouchAction action = new TouchAction(driver);
//按住等待5秒后釋放
action.press(driver.findElement(By.name("按住說(shuō)話"))).waitAction(5000);
action.perform();
【相關(guān)問(wèn)題】
“appium報(bào)錯(cuò):由于目標(biāo)計(jì)算機(jī)積極拒絕,無(wú)法連接”怎么解決?解決方案:把a(bǔ)ppium-desktop打開(kāi)--點(diǎn)擊start server
appium-desktop就運(yùn)行了

再重新運(yùn)行腳本,必要時(shí)可重啟電腦
部分手機(jī)用Swipe滑動(dòng)引導(dǎo)圖片無(wú)效
問(wèn)題現(xiàn)象:部分手機(jī)用swipe方法模擬滑動(dòng)引導(dǎo)圖片時(shí),出現(xiàn)無(wú)效或未按預(yù)期執(zhí)行的現(xiàn)象
解決方法:調(diào)整swipe最后一個(gè)參數(shù)duration
driver.swipe(xStart, yStart, xEnd, yEnd, 100);
每次執(zhí)行用例都要做安裝登錄應(yīng)用的操作
問(wèn)題現(xiàn)象:在編寫(xiě)測(cè)試用例時(shí),需要經(jīng)常進(jìn)行調(diào)試腳本運(yùn)行情況,但每次執(zhí)行都需要重新安裝登錄,非常繁瑣和耗時(shí)。
解決方法:
在執(zhí)行一次安裝登錄操作后,停止Appium程序,點(diǎn)擊Android Settings ,選中“No Reset”,重新啟動(dòng)Appium。再次執(zhí)行用例時(shí)就不會(huì)重新安裝登錄了。
定位Android設(shè)備或模擬器頁(yè)面元素出現(xiàn)問(wèn)題
問(wèn)題現(xiàn)象:編寫(xiě)腳本時(shí),往往需要定位元素,但常用的name常常出現(xiàn)定位不到的問(wèn)題,此時(shí)就需要通過(guò)classname和id來(lái)定位(id定位需要Android系統(tǒng)版本4.2及以上)。
解決方法:
1、連接上設(shè)備或模擬器,進(jìn)入SDK的tools目錄下,啟動(dòng)uiautomatorviewer.bat
2、 Ui Automator Viewer打開(kāi)后點(diǎn)擊按鈕 Device Screenshot就可以看到當(dāng)前設(shè)備或模擬器視圖,在右側(cè)可以看到視圖的元素。如圖:





































