?簡介
通過上一篇宏哥給各位小伙伴們的引薦,大家移動對這位美女有了深刻的認(rèn)識,而且她那高超的技藝和婀娜的身姿久久地浮現(xiàn)在你的腦海里,是不是這樣呢???不要害羞直接告訴宏哥:是,就對了。宏哥要的就是這個效果。達(dá)到這個效果,就說明你學(xué)的差不多了,可以出師了。今天繼續(xù)由宏哥給你引薦這位琵琶美女。
說明:Appium--奴家的大號,提起奴家的大號在江湖上也是無人不知,無人不曉。奴家==Appium;
1、界面認(rèn)識(奴家外表)
在之前安裝appium的時候說過我們有兩種方法安裝,也就有兩種結(jié)果,一種是有界面的(客戶端安裝),一種是沒有界面的(終端安裝),首先我們先講一下有界面的,以及界面有哪些東西。
首先和宏哥看一下琵琶女的外表,如果你的是windows系統(tǒng)那么界面就應(yīng)該是這樣的,所以當(dāng)你發(fā)現(xiàn)你的和我的琵琶女不一樣也不用擔(dān)心,這個就是所謂的“龍生九子,各有不同”,但是正常windows版整個界面只有7個按鈕,宏哥會按照從左到右從上到下的順序講。
(mac的會有一定的差異,但并不是很大,只是排版和樣式的問題,但是功能都一樣。)
1)Android Settings:左邊的第一個按鈕,主要是配置android的相關(guān)設(shè)置,他里面的結(jié)構(gòu)圖我們看下張圖片
a. Application Path: 選擇路徑,選擇需要測試的app在本電腦存放的一個路徑。在啟動appium時他會默認(rèn)去該路徑下去尋找這個app,然后將他安裝到指定的手機(jī)上。
b. Package: 之前提到過的,我們這個包的身份證,我們需要通過這個去找到包,不然我們安裝后我們通過什么去辨別這些包呢?
c. Launch Activity :故名思義,啟動的activity,activity的時候提到過,我們啟動app時需要去運(yùn)行的activity,這里我們填寫首次啟動頁面的activity。
備注:這里需要注意一個問題在我們每次通過Choose選擇apk后,appium會自動把這個包進(jìn)行重新簽名,那么在package以及activity里面會自動把包名和activity的名稱列進(jìn)去,但是這里會出現(xiàn)一個問題,每次選擇apk后列表中會有一個緩存的原因,即使你更改了apk,但是package還是沒有變,這樣啟動的時候就一直報錯,遇見這樣的情況不要著急,重新啟動兩次就好。
d. Wait for Activity: 和上面的差不多,意思是等待某個Activity打開,用的時間不是很多,做了解。
e. Launch Device: 標(biāo)簽下面的東西用得相對比較少,后面大家可以去了解一下。
f. Capabilities: 該標(biāo)簽下和我們做自動化關(guān)系很大,后面我們做自動化時如何配置啟動app等信息就用的該標(biāo)簽下的數(shù)據(jù)。? ? ? ? ?
g. Platform Name: 我們測試的app的類型,ios選擇ios,android選擇Android就好。
h. Automation Name: 測試引擎的名稱,我們使用的是appium,所以你第一眼就能看見Appium,但是他還有一個Selendroid。可能看到這里會有一些疑惑,為什么appium要選擇兩套系統(tǒng)呢?其實(shí)這個應(yīng)該追溯到android的版本問題,android自己的工具在4.2版本以前是一個,但是后面進(jìn)行了更新,可能也正是因?yàn)檫@個原因appium也才采用了兩套,所以當(dāng)你測試的app安裝的機(jī)器時在4.0或之前的版本時那么這里的引擎你就必須選擇Selendroid,是否這樣大家可以動手去試一試。檢驗(yàn)真理的唯一標(biāo)準(zhǔn)就是自己動手嘗試。
i. Platform Version: 安裝應(yīng)用手機(jī)的版本號,android的是幾點(diǎn)幾的版本。
j. Device Name: 設(shè)備名稱。
備注:這里會有一個問題,如果你測試android時,只把一臺手機(jī)插入到電腦,即使你輸入的Device Name是錯誤的,但是你依然能夠正常安裝,使用。但是ios是不行的。不知道在設(shè)計的時候是否就是如此考慮的,如果在以后使用中遇見類似問題大家不要驚慌。
k. Advanced 標(biāo)簽下的東西在初級階段不用擔(dān)心,這個標(biāo)簽只是在你想同一臺電腦同時控制多臺手機(jī)的時候才能使用,需要更改Bootstrap Port的端口號,記住這一點(diǎn)就好。
2)General Setting:
在General Setting里面在通常情況下我們使用默認(rèn)設(shè)置就好,但還是有一些基礎(chǔ)設(shè)置可以進(jìn)行調(diào)整,方便后期的學(xué)習(xí)。整個頁面分成了Server和log兩部分,默認(rèn)的情況如下面圖片。
a. Server Address: 配置appium服務(wù)的地址,正常情況我們不需要更改,但是如果我們需要配置多臺手機(jī)的時候啟動了多個appium服務(wù),那么這里的端口號我們需要進(jìn)行調(diào)整,如果你多個都弄的同一個端口會報錯。
b. Override Existing Session: session覆蓋,可能對于初學(xué)者不理解什么叫session,你這里暫時理解為會話,我和你會話的唯一標(biāo)示。
c. Log To File: 默認(rèn)狀態(tài)是沒有任何數(shù)據(jù),但是在做自動化時建議選擇,因?yàn)檫x擇之后appium在運(yùn)行時產(chǎn)生的日志都會保留到你設(shè)置的問題件,這個對后期的bug定位有相當(dāng)大的幫助。切記!
3)開發(fā)者設(shè)置(左邊第三個按鈕,小人圖標(biāo))很少用,可以忽略。如果有興趣可以作為興趣了解一下。
4)關(guān)于(左邊第四個按鈕,問號圖標(biāo)),查看當(dāng)前appium的版本信息。
5)元素偵測(右邊第二個按鈕,放大鏡圖標(biāo)):這個按鈕的功能和firebug的定位工具功能類似,但是他還有一個功能,他會檢測你的各個系統(tǒng)配置是否正確,如果前面各項(xiàng)參數(shù)不正確時,使用該功能會報錯。如果你不正常連接手機(jī)也不行。還是建議用sdk工具里面自帶的uiautomatorviewer。
6)啟動服務(wù)(右邊第一個按鈕,三角圖標(biāo)):所有參數(shù)配置好后你需要做的就是啟動appium服務(wù),只有啟動之后你才能夠做自動化。
7)清除日志(右下角,垃圾桶圖標(biāo)):在寫腳本、調(diào)試過程中會產(chǎn)生很多的日志,但是你可能想看的只是中間某個時間段的,那么你在這個時候可以將頁面的日志清除。
2、日志分析(奴家語言)
通過前面的學(xué)習(xí)加上自己動手練習(xí)我相信很多小伙伴都能夠?qū)ppium啟動起來,并且會自動將app安裝到手機(jī)或者模擬器,但是這個時候很多人看見appium的面板或者控制臺會比較頭疼。appium服務(wù)頁面不斷的在滾動日志,但是又看不懂,這個可能是通病。下面我們來分析一下這個日志,我們下面大概來解讀一下我這個日志,讓自己不再迷茫。在每一行的上面我來配置解讀,讓大家更容易理解。
我啟動appium服務(wù),指定了ip、端口、以及我的uid
192:~ ytxu$ appium -a 127.0.0.1 -p 4723 -U 127.0.0.1:62001
啟動成功
[Appium] Welcome to Appium v1.6.3
[Appium] Non-default server args:
啟動成功后的服務(wù)地址
[Appium] ? address: ‘127.0.0.1'
我們的uid,因?yàn)槲疫@里是鏈接的模擬器所以用的這個IP
[Appium] ? udid: '127.0.0.1:62001'
[Appium] Deprecated server args:
系統(tǒng)自動拼接成字典的形式
[Appium] ? -U,--udid => --default-capabilities '{"udid":"127.0.0.1:62001"}'
[Appium] Default capabilities, which will be added to each request unless overridden by desired capabilities:
[Appium] ? udid: ‘127.0.0.1:62001'
REST http接口監(jiān)聽的是哪個端口
[Appium] Appium REST http interface listener started on 127.0.0.1:4723
通過POST的方式創(chuàng)建了一個session,這個session里面的值就是我們在配置app時的一些數(shù)據(jù),這里系統(tǒng)把他自動轉(zhuǎn)換成了字典的形式,一個key對應(yīng)一個value。仔細(xì)去看你會發(fā)現(xiàn)都不陌生。
[HTTP] --> POST /wd/hub/session { " requiredCapabilities " :{}, " desiredCapabilities " :{ " deviceName " : " 127.0.0.1:62001 " , " app " : " /Users/ytxu/Desktop/AppiumPython/apps/mukewang.apk " , " autoLaunch " : " true " , " platformVersion " : " 4.1 " , " appPackage " : " cn.com.open.mooc " , " platformName " : " Android " , " appActivity " : " cn.com.open.mooc.index.splash.MCSplashActivity " }} [debug] [MJSONWP] Calling AppiumDriver.createSession() with args: [{“deviceName " : " 127.0 . 0.1 : 62001 " , " app " : " /Users/ytxu/Desktop/AppiumPython/apps/mukewang.apk " , " autoLaunch " : " true " , " platformVersion " : " 4.1 " , " appPackage " : " cn.com.open.mooc " , " platformName " : " Android " , " appActivity " : " cn.com.open.mooc.index.splash.MCSplashActivity " },{},null,null,null]
創(chuàng)建一個會話,準(zhǔn)備開始對話,把開始填寫的數(shù)據(jù),傳入數(shù)據(jù)后用服務(wù)端驗(yàn)證,如果成功就會話開始。
[Appium] Creating new AndroidDriver session [Appium] Capabilities: [Appium] deviceName: ' 127.0.0.1:62001 ' [Appium] app: ' /Users/ytxu/Desktop/AppiumPython/apps/mukewang.apk ' [Appium] autoLaunch: ' true ' [Appium] platformVersion: ' 4.1 ' [Appium] appPackage: ' cn.com.open.mooc ' [Appium] platformName: ' Android ' [Appium] appActivity: ' cn.com.open.mooc.index.splash.MCSplashActivity ' [Appium] udid: ' 127.0.0.1:62001 ' [debug] [AndroidDriver] AndroidDriver version: 1.10 . 38
看到這里你是否還覺得這個很麻煩?其實(shí)只要你仔細(xì)去看你會很容易都了解的。可能這里會有小伙伴說這個啟動的很容易,但是在實(shí)際中遇見的問題就沒這么容易了,那么下面我們看一個實(shí)際遇見的問題,直接看日志:
1 debug] [ADB] We tried to start an activity that doesn ' t exist, retrying with . prepended to activity 2 3 [debug] [ADB] Device API level: 19 4 5 [debug] [ADB] Getting connected devices... 6 7 [debug] [ADB] 1 device(s) connected 8 9 [debug] [ADB] Running ' /Users/ytxu/Library/Android/sdk/platform-tools/adb ' with args: [ " -P " , 5037 , " -s " , " 127.0.0.1:62001 " , " shell " , " am " , " start " , " -W " , " -n " , " cn.com.open.mooc/.cn.com.open.mooc.aindex.splash.MCSplashActivity " , " -S " , " -a " , " android.intent.action.MAIN " , " -c " , " android.intent.category.LAUNCHER " , " -f " , " 0x10200000 " ] 10 11 [ADB] Error: Activity used to start app doesn ' t exist or cannot be launched! Make sure it exists and is a launchable activity 12 13 at Object.wrappedLogger.errorAndThrow (lib/logger.js: 60 : 13 ) 14 15 at ADB.callee$ 0 $ 0 $ (../../../lib/tools/apk-utils.js: 68 : 13 ) 16 17 at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 67 : 40 ) 18 19 at GeneratorFunctionPrototype.invoke [ as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 315 : 22 ) 20 21 at GeneratorFunctionPrototype.prototype.(anonymous function) [ as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 100 : 21 ) 22 23 at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 136 : 37 ) 24 25 Error: Activity used to start app doesn ' t exist or cannot be launched! Make sure it exists and is a launchable activity 26 27 at Object.wrappedLogger.errorAndThrow (lib/logger.js: 60 : 13 ) 28 29 at ADB.callee$ 0 $ 0 $ (../../../lib/tools/apk-utils.js: 68 : 13 ) 30 31 at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 67 : 40 ) 32 33 at GeneratorFunctionPrototype.invoke [ as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 315 : 22 ) 34 35 at GeneratorFunctionPrototype.prototype.(anonymous function) [ as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 100 : 21 ) 36 37 at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 136 : 37 ) 38 39 [ADB] Error: Error occured while starting App. Original error: Activity used to start app doesn ' t exist or cannot be launched! Make sure it exists and is a launchable activity 40 41 at Object.wrappedLogger.errorAndThrow (lib/logger.js: 60 : 13 ) 42 43 at ADB.callee$ 0 $ 0 $ (../../../lib/tools/apk-utils.js: 80 : 9 ) 44 45 at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 67 : 40 ) 46 47 at GeneratorFunctionPrototype.invoke [ as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 315 : 22 ) 48 49 at GeneratorFunctionPrototype.prototype.(anonymous function) [ as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 100 : 21 ) 50 51 at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js: 136 : 37 ) 52 53 Error: Error occured while starting App. Original error: Activity used to start app doesn ' t exist or cannot be launched! Make sure it exists and is a launchable activity 54 55 at Object.wrappedLogger.errorAndThrow (lib/logger.js: 60 : 13 )
從第一眼看見這個日志我知道大家的第一反應(yīng)已經(jīng)暈了,沒事我們來仔細(xì)看。就日志的第一行說的大概意思就是“我們盡力去運(yùn)行這個Activity了,但是他還是不存在。”那么看到這里小伙伴應(yīng)該思考一個問題,在前面配置頁面時就講過如果你配置package或者activity錯誤那么是無法啟動的。現(xiàn)在已經(jīng)告訴我們說這個Activity不存在了是否應(yīng)該去仔細(xì)檢查一下呢?
其實(shí)在整個日志中我們應(yīng)該直接去看error的部分,[ADB] Error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity,這是error的日志,給出的提示也是這個activity不能夠被啟動,讓你再次確認(rèn)后再去啟動。
從這個小小的實(shí)驗(yàn)我們能夠看出日志本身并不難,難的是我們沒仔細(xì)看。所以以后遇見問題不要煩躁,應(yīng)該仔細(xì)看日志,然后解決問題。
3、 appium的工作原理(奴家的看家本領(lǐng))
我們在去熟悉一套系統(tǒng)或者框架的時候,我們想去學(xué)好,我們是不是都要了解一下工作原理呢?只有我們知道了他是如何工作之后,在以后我們遇見棘手的問題時才能夠從根本去解決問題。但是在講這個之前需要講一個題外話,不知道有誰思考過appium是如何實(shí)現(xiàn)自動化的嗎?無論ios還是android在做自動化時考慮到安全等因素他們都是不允許直接去操作的,所以我們要做自動化那么就必須借助他們本身公布出來的一些工具,android是UIAutomator,ios使用的是UIAutomation,其實(shí)我們所謂的自動化就是我們使用的工具去調(diào)用他們公布出來的框架的方法,然后再去執(zhí)行。下面我們來看一下appium的工作原理,首先來看一張圖片。
通過上面的圖片我們可以知道appium是基于WebDriver協(xié)議的,他利用Bootstrap調(diào)用google公布的android的自動化測試框架UIautomator的命令來實(shí)現(xiàn)我們的app自動化,再能理解一點(diǎn)就是我們的電腦(client)上運(yùn)行自動化測試腳本,調(diào)用的是webdriver的接口,appium server接收到我們client上發(fā)送過來的命令后他會將這些命令轉(zhuǎn)換為UIautomator認(rèn)識的命令,然后由UIautomator來執(zhí)行自動化。
可能這里有些小伙伴會迷糊,說android是這樣那么ios也是這樣嗎?其實(shí)真的差不多,只是他們支持的工具不一樣,ios使用的是UIAutomation,首先client發(fā)送腳本請求,再到我們的appium服務(wù),這里appium會調(diào)用instruments去啟動一個server,然后讓他去執(zhí)行后面的操作來完成自動化。備注:UIAutomation是instruments下面的一個工具,所以不要驚慌。
4、Appium的優(yōu)勢(奴家優(yōu)點(diǎn))
現(xiàn)在市面上做自動化的框架無論是成熟還是一般的都有很多,我們不可能都去熟悉,但是我們需要了解一個常見的,不然你怎么知道好與壞呢?我相信在學(xué)習(xí)自動化時就想過為什么需要學(xué)appium,其實(shí)我在剛開始做移動自動化時選擇的是robotium,但是后來因?yàn)轫?xiàng)目的需要發(fā)現(xiàn)我如果只是用robotium發(fā)現(xiàn)ios根本沒法做,那么我就需要去單獨(dú)做一個,這個會很麻煩,這個時候appium剛好出來了,剛接觸他我就決定使用了,因?yàn)樵谥白鰓eb自動化時用的就是selenium,所以這個用起來會很方便。下面我們來列舉一下他的優(yōu)點(diǎn):
1、可以同時支持android、ios
2、支持多種語言,java、python、php、Ruby等等
3、不用為復(fù)雜的環(huán)境發(fā)愁
4、如果你有selenium經(jīng)驗(yàn),直接上手
從上面來看他的優(yōu)點(diǎn)還是很多的,當(dāng)然缺點(diǎn)也有,這里不列舉了,免得破壞美好的印象。
當(dāng)看到這里的時候你對奴家(appium)是否已經(jīng)有一個更加清晰的影子了呢?接下來我們需要的就是去動手實(shí)戰(zhàn)吧。
5、小結(jié)
1、appium mac和windows下都有兩種安裝模式,一種是通過客戶端安裝,一個是終端安裝,這里說一下區(qū)別:
做自動化肯定不可能只是在一臺機(jī)器上做自動化,因?yàn)槟菢拥囊饬x并不是很大,所以很多時候我們都是鏈接多臺電腦去執(zhí)行,但是appium去鏈接多臺電腦時就需要啟動多個appium的服務(wù),如果說你安裝是通過客戶端去安裝的,你鏈接多臺機(jī)器就需要啟動多次,配置多次,這樣對你電腦本身也是一個性能考驗(yàn)。如果你是通過終端命令安裝的在啟動的時候你只需要通過命令啟動多個服務(wù)就好。這里為什么說這么多,就是因?yàn)樵?jīng)作者在做一個項(xiàng)目時統(tǒng)一體啊機(jī)器上appium客戶端啟動了5個,長期運(yùn)行case后appium的服務(wù)會自動掛掉,但是通過終端安裝啟動超過10個服務(wù),同時去運(yùn)行依然沒有問題。這是我的經(jīng)歷不一定全對,讀者可以根據(jù)自己愛好進(jìn)行選擇。
appium客戶端安裝:
(1)去官方下載:http://appium.io/? 比較慢,相比之下慢,其實(shí)宏哥這邊還是嗖嗖的很快地
(2)國內(nèi)下載:鏈接: https://pan.baidu.com/s/1SqGzEFzWfNjyQBE1lsiKOw 提取碼: 48af (賊快,推薦)
現(xiàn)在安裝包后直接傻瓜式的安裝,一切下一步,默認(rèn)即可。(windows也是一樣)
appium終端安裝:
直接在終端輸入命令:npm install -g appium。(切記不要用sudo去執(zhí)行) 在安裝過程中不報錯,你就安裝成功了,報錯也不要著急,可以百度解決,也可以聯(lián)系我。appium命令安裝默認(rèn)的是在國外去請求,因?yàn)閚多原因你失敗了,so建議使用如下命令 訪問國內(nèi)的鏡像安裝npm --registry http://registry.cnpmjs.org install -g appium? 成功后輸入appium會提示: Welcome to Appium?說明安裝成功了。
宏哥不能保證所整理都符合大家的口味,但我能保證每一篇都是用心去寫和用心去整理,我始終認(rèn)同“分享的越多,你的價值增值越大”,歡迎大家關(guān)注我的博客和個人公眾號的技術(shù)分享。在分享中進(jìn)步,越努力越幸運(yùn),期待我們都有美好的明天!
支持宏哥的朋友們和宏哥的宏粉記得點(diǎn)波推薦哦,您的肯定就是我進(jìn)步的動力。鄙人先在這里給您道謝了,謝您嘞~~
個人公眾號(因?yàn)樵S多文章都被搬到別人的公眾號里了,還是原創(chuàng),所以宏哥果斷也開一個公眾號。打算與博客園文章同步,希望大家隨時隨地學(xué)習(xí)與進(jìn)步):
微信群(因?yàn)橛腥私o我發(fā)短消息說公司不讓用QQ,就幫忙建立一個微信群,歡迎加入討論和交流)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
