1. 程式人生 > >Appium+python自動化(八)- 初識琵琶女Appium(千呼萬喚始出來,猶抱琵琶半遮面)- 下(超詳解)

Appium+python自動化(八)- 初識琵琶女Appium(千呼萬喚始出來,猶抱琵琶半遮面)- 下(超詳解)

​簡介

  通過上一篇巨集哥給各位小夥伴們的引薦,大家移動對這位美女有了深刻的認識,而且她那高超的技藝和婀娜的身姿久久地浮現在你的腦海裡,是不是這樣呢???不要害羞直接告訴巨集哥:是,就對了。巨集哥要的就是這個效果。達到這個效果,就說明你學的差不多了,可以出師了。今天繼續由巨集哥給你引薦這位琵琶美女。

說明:Appium--奴家的大號,提起奴家的大號在江湖上也是無人不知,無人不曉。奴家==Appium;

1、介面認識(奴家外表)

  在之前安裝appium的時候說過我們有兩種方法安裝,也就有兩種結果,一種是有介面的(客戶端安裝),一種是沒有介面的(終端安裝),首先我們先講一下有介面的,以及介面有哪些東西。

  首先和巨集哥看一下琵琶女的外表,如果你的是windows系統那麼介面就應該是這樣的,所以當你發現你的和我的琵琶女不一樣也不用擔心,這個就是所謂的“龍生九子,各有不同”,但是正常windows版整個介面只有7個按鈕,巨集哥會按照從左到右從上到下的順序講。

(mac的會有一定的差異,但並不是很大,只是排版和樣式的問題,但是功能都一樣。)

1)Android Settings:左邊的第一個按鈕,主要是配置android的相關設定,他裡面的結構圖我們看下張圖片

a.Application Path:選擇路徑,選擇需要測試的app在本電腦存放的一個路徑。在啟動appium時他會預設去該路徑下去尋找這個app,然後將他安裝到指定的手機上。

b.Package:之前提到過的,我們這個包的身份證,我們需要通過這個去找到包,不然我們安裝後我們通過什麼去辨別這些包呢?

c.Launch Activity:故名思義,啟動的activity,activity的時候提到過,我們啟動app時需要去執行的activity,這裡我們填寫首次啟動頁面的activity。

備註:這裡需要注意一個問題在我們每次通過Choose選擇apk後,appium會自動把這個包進行重新簽名,那麼在package以及activity裡面會自動把包名和activity的名稱列進去,但是這裡會出現一個問題,每次選擇apk後列表中會有一個快取的原因,即使你更改了apk,但是package還是沒有變,這樣啟動的時候就一直報錯,遇見這樣的情況不要著急,重新啟動兩次就好。

d.Wait for Activity: 和上面的差不多,意思是等待某個Activity開啟,用的時間不是很多,做了解。

e.Launch Device:標籤下面的東西用得相對比較少,後面大家可以去了解一下。

f.Capabilities:該標籤下和我們做自動化關係很大,後面我們做自動化時如何配置啟動app等資訊就用的該標籤下的資料。         

g.Platform Name:我們測試的app的型別,ios選擇ios,android選擇Android就好。

h.Automation Name:測試引擎的名稱,我們使用的是appium,所以你第一眼就能看見Appium,但是他還有一個Selendroid。可能看到這裡會有一些疑惑,為什麼appium要選擇兩套系統呢?其實這個應該追溯到android的版本問題,android自己的工具在4.2版本以前是一個,但是後面進行了更新,可能也正是因為這個原因appium也才採用了兩套,所以當你測試的app安裝的機器時在4.0或之前的版本時那麼這裡的引擎你就必須選擇Selendroid,是否這樣大家可以動手去試一試。檢驗真理的唯一標準就是自己動手嘗試。

i.Platform Version:安裝應用手機的版本號,android的是幾點幾的版本。

j.Device Name:裝置名稱。

備註:這裡會有一個問題,如果你測試android時,只把一臺手機插入到電腦,即使你輸入的Device Name是錯誤的,但是你依然能夠正常安裝,使用。但是ios是不行的。不知道在設計的時候是否就是如此考慮的,如果在以後使用中遇見類似問題大家不要驚慌。

k.Advanced標籤下的東西在初級階段不用擔心,這個標籤只是在你想同一臺電腦同時控制多臺手機的時候才能使用,需要更改Bootstrap Port的埠號,記住這一點就好。

2)General Setting:

在General Setting裡面在通常情況下我們使用預設設定就好,但還是有一些基礎設定可以進行調整,方便後期的學習。整個頁面分成了Server和log兩部分,預設的情況如下面圖片。

        

a.Server Address:配置appium服務的地址,正常情況我們不需要更改,但是如果我們需要配置多臺手機的時候啟動了多個appium服務,那麼這裡的埠號我們需要進行調整,如果你多個都弄的同一個埠會報錯。

b.Override Existing Session:session覆蓋,可能對於初學者不理解什麼叫session,你這裡暫時理解為會話,我和你會話的唯一標示。

c.Log To File:預設狀態是沒有任何資料,但是在做自動化時建議選擇,因為選擇之後appium在執行時產生的日誌都會保留到你設定的問題件,這個對後期的bug定位有相當大的幫助。切記!

3)開發者設定(左邊第三個按鈕,小人圖示)很少用,可以忽略。如果有興趣可以作為興趣瞭解一下。

4)關於(左邊第四個按鈕,問號圖示),檢視當前appium的版本資訊。

5)元素偵測(右邊第二個按鈕,放大鏡圖示):這個按鈕的功能和firebug的定位工具功能類似,但是他還有一個功能,他會檢測你的各個系統配置是否正確,如果前面各項引數不正確時,使用該功能會報錯。如果你不正常連線手機也不行。還是建議用sdk工具裡面自帶的uiautomatorviewer。

6)啟動服務(右邊第一個按鈕,三角圖示):所有引數配置好後你需要做的就是啟動appium服務,只有啟動之後你才能夠做自動化。

7)清除日誌(右下角,垃圾桶圖示):在寫指令碼、除錯過程中會產生很多的日誌,但是你可能想看的只是中間某個時間段的,那麼你在這個時候可以將頁面的日誌清除。

2、日誌分析(奴家語言)

  通過前面的學習加上自己動手練習我相信很多小夥伴都能夠將appium啟動起來,並且會自動將app安裝到手機或者模擬器,但是這個時候很多人看見appium的面板或者控制檯會比較頭疼。appium服務頁面不斷的在滾動日誌,但是又看不懂,這個可能是通病。下面我們來分析一下這個日誌,我們下面大概來解讀一下我這個日誌,讓自己不再迷茫。在每一行的上面我來配置解讀,讓大家更容易理解。

我啟動appium服務,指定了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:

啟動成功後的服務地址

[Appium]   address: ‘127.0.0.1'

我們的uid,因為我這裡是連結的模擬器所以用的這個IP

[Appium]   udid: '127.0.0.1:62001'

[Appium] Deprecated server args:

系統自動拼接成字典的形式

[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介面監聽的是哪個埠

[Appium] Appium REST http interface listener started on 127.0.0.1:4723

通過POST的方式建立了一個session,這個session裡面的值就是我們在配置app時的一些資料,這裡系統把他自動轉換成了字典的形式,一個key對應一個value。仔細去看你會發現都不陌生。

[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]

建立一個會話,準備開始對話,把開始填寫的資料,傳入資料後用服務端驗證,如果成功就會話開始。

[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

看到這裡你是否還覺得這個很麻煩?其實只要你仔細去看你會很容易都瞭解的。可能這裡會有小夥伴說這個啟動的很容易,但是在實際中遇見的問題就沒這麼容易了,那麼下面我們看一個實際遇見的問題,直接看日誌:

 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)

  從第一眼看見這個日誌我知道大家的第一反應已經暈了,沒事我們來仔細看。就日誌的第一行說的大概意思就是“我們盡力去執行這個Activity了,但是他還是不存在。”那麼看到這裡小夥伴應該思考一個問題,在前面配置頁面時就講過如果你配置package或者activity錯誤那麼是無法啟動的。現在已經告訴我們說這個Activity不存在了是否應該去仔細檢查一下呢?

  其實在整個日誌中我們應該直接去看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不能夠被啟動,讓你再次確認後再去啟動。

從這個小小的實驗我們能夠看出日誌本身並不難,難的是我們沒仔細看。所以以後遇見問題不要煩躁,應該仔細看日誌,然後解決問題。

3、 appium的工作原理(奴家的看家本領)

  我們在去熟悉一套系統或者框架的時候,我們想去學好,我們是不是都要了解一下工作原理呢?只有我們知道了他是如何工作之後,在以後我們遇見棘手的問題時才能夠從根本去解決問題。但是在講這個之前需要講一個題外話,不知道有誰思考過appium是如何實現自動化的嗎?無論ios還是android在做自動化時考慮到安全等因素他們都是不允許直接去操作的,所以我們要做自動化那麼就必須藉助他們本身公佈出來的一些工具,android是UIAutomator,ios使用的是UIAutomation,其實我們所謂的自動化就是我們使用的工具去呼叫他們公佈出來的框架的方法,然後再去執行。下面我們來看一下appium的工作原理,首先來看一張圖片。

  通過上面的圖片我們可以知道appium是基於WebDriver協議的,他利用Bootstrap呼叫google公佈的android的自動化測試框架UIautomator的命令來實現我們的app自動化,再能理解一點就是我們的電腦(client)上執行自動化測試指令碼,呼叫的是webdriver的介面,appium server接收到我們client上傳送過來的命令後他會將這些命令轉換為UIautomator認識的命令,然後由UIautomator來執行自動化。

  可能這裡有些小夥伴會迷糊,說android是這樣那麼ios也是這樣嗎?其實真的差不多,只是他們支援的工具不一樣,ios使用的是UIAutomation,首先client傳送指令碼請求,再到我們的appium服務,這裡appium會呼叫instruments去啟動一個server,然後讓他去執行後面的操作來完成自動化。備註:UIAutomation是instruments下面的一個工具,所以不要驚慌。

4、Appium的優勢(奴家優點)

  現在市面上做自動化的框架無論是成熟還是一般的都有很多,我們不可能都去熟悉,但是我們需要了解一個常見的,不然你怎麼知道好與壞呢?我相信在學習自動化時就想過為什麼需要學appium,其實我在剛開始做移動自動化時選擇的是robotium,但是後來因為專案的需要發現我如果只是用robotium發現ios根本沒法做,那麼我就需要去單獨做一個,這個會很麻煩,這個時候appium剛好出來了,剛接觸他我就決定使用了,因為在之前做web自動化時用的就是selenium,所以這個用起來會很方便。下面我們來列舉一下他的優點:

1、可以同時支援android、ios

2、支援多種語言,java、python、php、Ruby等等

3、不用為複雜的環境發愁

4、如果你有selenium經驗,直接上手

從上面來看他的優點還是很多的,當然缺點也有,這裡不列舉了,免得破壞美好的印象。

當看到這裡的時候你對奴家(appium)是否已經有一個更加清晰的影子了呢?接下來我們需要的就是去動手實戰吧。

5、小結

1、appium mac和windows下都有兩種安裝模式,一種是通過客戶端安裝,一個是終端安裝,這裡說一下區別:

做自動化肯定不可能只是在一臺機器上做自動化,因為那樣的意義並不是很大,所以很多時候我們都是連結多臺電腦去執行,但是appium去連結多臺電腦時就需要啟動多個appium的服務,如果說你安裝是通過客戶端去安裝的,你連結多臺機器就需要啟動多次,配置多次,這樣對你電腦本身也是一個性能考驗。如果你是通過終端命令安裝的在啟動的時候你只需要通過命令啟動多個服務就好。這裡為什麼說這麼多,就是因為曾經作者在做一個專案時統一體啊機器上appium客戶端啟動了5個,長期執行case後appium的服務會自動掛掉,但是通過終端安裝啟動超過10個服務,同時去執行依然沒有問題。這是我的經歷不一定全對,讀者可以根據自己愛好進行選擇。

appium客戶端安裝:

(1)去官方下載:http://appium.io/  比較慢,相比之下慢,其實巨集哥這邊還是嗖嗖的很快地

(2)國內下載:連結: https://pan.baidu.com/s/1SqGzEFzWfNjyQBE1lsiKOw 提取碼: 48af (賊快,推薦)

現在安裝包後直接傻瓜式的安裝,一切下一步,預設即可。(windows也是一樣)

appium終端安裝:

直接在終端輸入命令:npm install -g appium。(切記不要用sudo去執行) 在安裝過程中不報錯,你就安裝成功了,報錯也不要著急,可以百度解決,也可以聯絡我。appium命令安裝預設的是在國外去請求,因為n多原因你失敗了,so建議使用如下命令 訪問國內的映象安裝npm --registry http://registry.cnpmjs.org install -g appium  成功後輸入appium會提示: Welcome to Appium 說明安裝成功了。

巨集哥不能保證所整理都符合大家的口味,但我能保證每一篇都是用心去寫和用心去整理,我始終認同“分享的越多,你的價值增值越大”,歡迎大家關注我的部落格和個人公眾號的技術分享。在分享中進步,越努力越幸運,期待我們都有美好的明天!

支援巨集哥的朋友們和巨集哥的巨集粉記得點波推薦哦,您的肯定就是我進步的動力。鄙人先在這裡給您道謝了,謝您嘞~~

個人公眾號(因為許多文章都被搬到別人的公眾號裡了,還是原創,所以巨集哥果斷也開一個公眾號。打算與部落格園文章同步,希望大家隨時隨地學習與進步):

微信群(因為有人給我發短訊息說公司不讓用QQ,就幫忙建立一個微信群,歡迎加入討論和交流)

&n