🔥Appium+python 自動化(八)- 初識琵琶女 Appium(千呼萬喚始出來,猶抱琵琶半遮面)- 下(超詳解)
1. 簡介
透過上一篇宏哥給各位小夥伴們的引薦,大家移動對這位美女有了深刻的認識,而且她那高超的技藝和婀娜的身姿久久地浮現在你的腦海裡,是不是這樣呢???不要害羞直接告訴宏哥:是,就對了。宏哥要的就是這個效果。達到這個效果,就說明你學的差不多了,可以出師了。今天繼續由宏哥給你引薦這位琵琶美女。
說明:Appium--奴家的大號,提起奴家的大號在江湖上也是無人不知,無人不曉。奴家==Appium;
2.介面認識(奴家外表)
在之前安裝 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) 清除日誌(右下角,垃圾桶圖示):在寫指令碼、除錯過程中會產生很多的日誌,但是你可能想看的只是中間某個時間段的,那麼你在這個時候可以將頁面的日誌清除。
3.日誌分析(奴家語言)
透過前面的學習加上自己動手練習我相信很多小夥伴都能夠將 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。仔細去看你會發現都不陌生。
程式碼語言:javascript
複製
[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]
建立一個會話,準備開始對話,把開始填寫的資料,傳入資料後用服務端驗證,如果成功就會話開始。
程式碼語言:javascript
複製
[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
看到這裡你是否還覺得這個很麻煩?其實只要你仔細去看你會很容易都瞭解的。可能這裡會有小夥伴說這個啟動的很容易,但是在實際中遇見的問題就沒這麼容易了,那麼下面我們看一個實際遇見的問題,直接看日誌:
程式碼語言:javascript
複製
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 不能夠被啟動,讓你再次確認後再去啟動。
從這個小小的實驗我們能夠看出日誌本身並不難,難的是我們沒仔細看。所以以後遇見問題不要煩躁,應該仔細看日誌,然後解決問題。
4. 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 下面的一個工具,所以不要驚慌。
5.Appium 的優勢(奴家優點)
現在市面上做自動化的框架無論是成熟還是一般的都有很多,我們不可能都去熟悉,但是我們需要了解一個常見的,不然你怎麼知道好與壞呢?我相信在學習自動化時就想過為什麼需要學 appium,其實我在剛開始做移動自動化時選擇的是 robotium,但是後來因為專案的需要發現我如果只是用 robotium 發現 ios 根本沒法做,那麼我就需要去單獨做一個,這個會很麻煩,這個時候 appium 剛好出來了,剛接觸他我就決定使用了,因為在之前做 web 自動化時用的就是 selenium,所以這個用起來會很方便。下面我們來列舉一下他的優點:
1、可以同時支援 android、ios
2、支援多種語言,java、python、php、Ruby 等等
3、不用為複雜的環境發愁
4、如果你有 selenium 經驗,直接上手
從上面來看他的優點還是很多的,當然缺點也有,這裡不列舉了,免得破壞美好的印象。
當看到這裡的時候你對奴家(appium)是否已經有一個更加清晰的影子了呢?接下來我們需要的就是去動手實戰吧。
6.小結
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 說明安裝成功了。
相關文章
- 🔥Appium+python 自動化(七)- 初識琵琶女 Appium(千呼萬喚始出來,猶抱琵琶半遮面)- 上(超詳解)APPPython
- 🔥Appium+python 自動化(二)- 環境搭建—下(超詳解)APPPython
- 🔥Appium+python 自動化(三)- SDK Manager(超詳解)APPPython
- 🔥Appium+python 自動化(五)- 模擬器(超詳解)APPPython
- 千呼萬喚始出來——DataV私有部署功能
- 千呼萬喚始出來 JDK 21 LTS, 久等了JDK
- 🔥Appium+python 自動化(六)- 連線模擬器並啟動淘寶 APP(超詳解)APPPython
- 千呼萬喚始出來-TestFlight public link功能正式釋出了!
- Appium+python自動化(一)- 環境搭建—上(超詳解)APPPython
- 千呼萬喚始出來《影之刃3》全平臺公測下週來襲!
- 🔥Appium+python 自動化(四)- 如何檢視程式所佔埠號和 IP(超詳解)(番外篇)APPPython
- Appium+python自動化(十二)- Android UIAutomator終極定位凶器(超詳解)APPPythonAndroidUI
- Appium+python自動化(十五)- Android 這些基礎知識,你知多少???(超詳解)APPPythonAndroid
- Appium+python自動化(十三)- 與Capability完美懈垢之解讀(超詳解)APPPython
- Appium+python自動化(十三)- 輸入中文 - 一次填坑記(超詳解)APPPython
- 千呼萬喚使出來,goal 資料庫元件終於出爐啦Go資料庫元件
- Appium+python自動化(四)- 如何檢視程式所佔埠號和IP(超詳解)(番外篇)APPPython
- 搭建appium+python自動化測試環境APPPython
- Appium+python自動化54-appium-doctor報錯已解決(SyntaxError: Unexpected token ...)APPPythonError
- 千呼萬喚,web人臉識別登入完整版來了,這樣式我愛了Web
- 千呼萬喚「駛」出來!小批次Robotaxi長沙到貨,成星城最靚風景線
- Appium+Python實現iOS自動化測試~環境搭建APPPythoniOS
- Appium+python自動化(二十二)- 三個臭皮匠頂個諸葛亮-控制元件座標獲取(超詳解)APPPython控制元件
- python介面自動化(四十)- logger 日誌 - 下(超詳解)Python
- appium自動化APP
- Appium自動化(10) - appium高階元素定位方式之 UI Automator API 的詳解APPUIAPI
- 自動化之旅--AppiumAPP
- 【python介面自動化】初識unittest框架Python框架
- Android + Appium 自動化測試完整的環境配置及程式碼詳解AndroidAPP
- Java併發程式設計之美-千無萬喚使出來Java程式設計
- 3分鐘瞭解Appium:使用appium做Android手機自動化測試!APPAndroid
- Appium自動化(9) - appium元素定位的快速入門APP
- python介面自動化(三十九)- logger 日誌 - 上(超詳解)Python
- Ansible自動化配置詳解
- Appium自動化(15) - 針對 webview 進行自動化測試APPWebView
- ios+appium 自動化 click 無效iOSAPP
- java+appium 自動化環境搭建JavaAPP
- APPIUM-Android自動化元素定位方式APPAndroid
- Appium自動化(7) - 控制元件定位工具之Appium 的 InspectorAPP控制元件