不曉得大家對自動化是不是很感興趣呢?
本身對自動化非常的有興趣,能夠減少手動讓機器自己去執行,相當的省時又省力!
但也是需要花很多時間去學習,因此想分享我個人摸索的自動化測試工具給各位參考!
完整程式碼再文章最後面唷!
也許對你的工作有些微的幫助,為何我會使用Appium這又是什麼呢?
以下為大家簡單介紹
內容目錄
Appium 是什麼?
Appium 是一個開源工具,用於自動化 iOS 手機、 Android 手機和 Windows 桌面平台上的原生、移動 Web 和混合應用。
可以支援許多主流語言,例如Java,Swift,Python,.Net,Ruby等,但我主要是使用Python語言來進行操作。
它允許你用同樣的 API 對多平台(iOS、Android、Windows)寫測試
做到在 iOS、Android 和 Windows 測試套件之間使用代碼。
同一個測試語言法可以套用所以平台不論是Web、Android、iOS都可以使用
簡單來說你只有會了Appium,就會了基本的自動化UI測試,相當強大!
如果再搭配了API自動化測試,完美!
開始介紹如何安裝以及執行流程
如何安裝 Appium Server?
安裝Appium 會有兩種方式 一種是透過 Desptop安裝
另外一種是使用 command line安裝
不過這裡我只會介紹 command line安裝
如果想要透過 Desptop安裝可以到官網安裝 -> Appium官網


Command line 安裝
$ brew install node
$ npm install -g appium
$ pip3 install Appium-Python-Client
假設你不想安裝最新版本的 appium,有指定版本可以透過下方指令卸載後,再進行安裝
$ npm uninstall -g appium # 刪除 appium
$ npm install -g appium@1.7.2 # 指定 1.7.2版本
Appium doctor 檢查環境
主要是來檢查 Appium有缺少哪些套件
$ npm install appium-doctor -g
單純檢查 Android 環境的話直接執行
$ appium-doctor --android
可能在檢查的時候,有出現一些缺少套件
再實際跑自動化時,是沒有什麼影響,如果有用到下方套件的話,會再寫另外一篇教學文章
# 可能會有錯誤
WARN AppiumDoctor ✖ opencv4nodejs cannot be found.
WARN AppiumDoctor ✖ ffmpeg cannot be found
WARN AppiumDoctor ✖ mjpeg-consumer cannot be found.
WARN AppiumDoctor ✖ bundletool.jar cannot be found
WARN AppiumDoctor ✖ gst-launch-1.0 and/or gst-inspect-1.0 cannot be found
執行 Appium Server
再跑自動化之前,我們需要先開啟Appium server
需要與我們測試的手機進行溝通使用
如何執行 Appium server呢?
只需要再終端機上執行 appium就可以(這是預設指令,當然可以給於其他參數,但這篇還不會教到)
$ appium
(node:46989) [DEP0128] DeprecationWarning: Invalid 'main' field in '/usr/local/lib/node_modules/appium/node_modules/mjpeg-server/package.json' of './lib/mpegserver'. Please either fix that or report it to the module author
(Use node --trace-deprecation ... to show where the warning was created)
[Appium] Welcome to Appium v1.21.0
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
(node:46989) [DEP0128] DeprecationWarning: Invalid ‘main’ field in ‘/usr/local/lib/node_modules/appium/node_modules/mjpeg-server/package.json’ of ‘./lib/mpegserver’. Please either fix that or report it to the module author
上面的錯誤只是一個警告,不用理會沒關係,不影響執行自動化。
Python 寫 Appium Android 自動化跑 Chrome
算是一個自動化腳本,還未到達測試,因為沒有搭配測試的功能
跑一個簡單的小流程給各位參考使用
可能前置作業會有些多,但熟悉後,就可以快速上手啦!
程式碼部份可能比較簡單,讓剛接觸的朋友看的懂為主
因此就一路走到底,了解怎麼跑,就可以來自己去規劃架構。
為何使用Chrome來跑自動化呢?
因為每台Android手機,幾乎都有Chrome APP
如果用其他App的話,比較難示範,還要去額外下載有些麻煩,因此使用Chrome來做範例
手機可以使用實體手機或是模擬手機都可以!
但前提條件需要把debug模式打開 -> 如何開啟debug
adb devices 可以認到就可以
$ adb devices
List of devices attached
emulator-5554 device
Python 跑 Appium 前置必備參數設定
首先你必須要知道你跑APP的Package Name 以及 Activity
但也是比較麻煩的部份
個人取得Package Name 以及頁面的元素
可以參考我另一篇寫的【Android 自動化測試 教學】 Macaca 透過 app-inspector 輕鬆獲取手機頁面資訊!
至於 Activity如何取得呢?
可以透過 adb logcat的方式進行
再你要跑自動化APP頁面,再終端機執行 adb logcat
由於log跑很快,因此我們透過搜尋的方式找尋 ” Package Name/“
就用Chrome app 範例 搜尋 “com.android.chrome/“
參考下圖

Python 跑 Appium 參數設定
首先我們會需要下面幾個需要的參數,每個行程式碼,我後面都有簡單敘述用途
大致上就是把測試手機相關資訊以及你要配置的功能全部放置到 desired_caps字典內
會與Appium Server 進行溝通,也就是 localhost:4723 這串。
如果只有執行下方程式碼,會順利的叫起Chrome等待60秒自動關閉。
你會發現Python程式碼已經跑完了,但是卻還在Chrome頁面
主要是Server收到你的配置下一個指令需要等待60後,要是沒任何動作就關閉。
可以自己嘗試改秒數跑跑看。
請注意兩點!!
第一點是 appium server 與 現在執行的Python程式是要分兩個終端機來執行,也就是需要同時存在
不然跑自動化是不起來的。
第二點,如果你手機有登入Chrome有相關資料,再跑之前他會先清除相關Chrome數據資料。
也就是回到最一開始還未登入google 帳號的狀態
但是將 noReset 的參數改成 True,就不會清除資料,但後面介紹的自動化腳本會跑失敗
因為不符合預期結果
from appium import webdriver
import time
import os
desired_caps = {} # 空字典 需要給予測試手機相關資訊
desired_caps['platformName'] = 'Android' # 測試的平台
desired_caps['platformVersion'] = '11.0' # 手機os版本
desired_caps['deviceName'] = 'Pixel 3' # 看你手機的名稱是什麼
desired_caps['automationName'] = "UiAutomator2" # 一定要的!
desired_caps['autoGrantPermissions'] = True # 自動同意授權
desired_caps['appPackage'] = 'com.android.chrome'
desired_caps['appActivity'] = 'com.google.android.apps.chrome.Main'
desired_caps['noReset'] = False # 改成 True,會保留原先資料,但自動化腳本會失敗
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
Appium 跑 Chrome 自動化腳本流程
透過上面的參數我們可以順利地叫起Chrome APP了!
我們就來寫寫腳本吧!看怎麼跑
我的自動化流程規劃是,啟動Chrome 順利到達Facebook登入頁面,最後擷取手機圖片
自動化腳本分為4個步驟
如果某一個步驟失敗了,就會跑Fail
因此範例腳本基本上不太會失敗,除非無網路或是超過時間沒抓到元素
第一步驟 點擊 接受並繼續 按鈕
當Chrome清除資料,第一次起來APP會是長這樣

我們需要點擊接受並繼續的按鈕,才會到下一個頁面
首先我們先等待5秒鐘,確保整個頁面的元素都有看到
這時候透過 find_element_by_id 來搜尋此頁面是某有相同的id
有的話就會印出id的文字並且點擊按鈕,接續等待3秒
time.sleep(5) # 等待5秒
agree_btn_ele = driver.find_element_by_id('com.android.chrome:id/terms_accept') # 取得 接受並繼續 元素
print('點擊: {0}'.format(agree_btn_ele.get_attribute('text'))) # 取得 接受並繼續 元素的文字
agree_btn_ele.click() # 執行點擊的動作
time.sleep(3) # 等待3秒
第二步驟 點擊 不用了,謝謝
順利的到達下一個頁面

上個程式碼有等待3秒,因此會看到整個頁面元素
一樣透過 find_element_by_id 來搜尋 我們要的元素
並且印出來不用了,謝謝文字,並且進行點擊
這時候應該很順利的到達Google首頁,我們在等個3秒
negative_btn_ele = driver.find_element_by_id('com.android.chrome:id/negative_button') # 取得不用了,謝謝 元素
print('點擊: {0}'.format(negative_btn_ele.get_attribute('text'))) # 取得 不用了,謝謝 元素的文字
negative_btn_ele.click()
print("進入到Googleg首頁")
time.sleep(3) # 等待3秒
第三步驟 點擊 搜尋框 輸入網址
ok!我們到達Google首頁,要來進行搜尋的動作輸入網址

一樣我們透過 find_element_by_id 找尋我們的搜尋框 元素
指定我們搜尋框的元素執行 send_keys 輸入網址
最後透過 press_keycode 來按下Enter鍵 進行搜尋
就會順利的到達Facebook 登入頁面嚕!
search_box_text_ele = driver.find_element_by_id('com.android.chrome:id/search_box_text') # 取得搜尋框 元素
print('點擊: {0}'.format(search_box_text_ele.get_attribute('text'))) # 取得搜尋框 元素的文字
print('輸入網址: https://m.facebook.com/')
search_box_text_ele.send_keys("https://m.facebook.com/") # 輸入字串
driver.press_keycode(66) # 按下 Enter Key
print("進入到Facebook登入頁面")
time.sleep(5) # 等待5秒
第四步驟 擷取手機當下圖片

有時候在自動化跑流程的時候
可能某頁面Fail就可以透過下方的程式碼,擷取手機當下的畫面存到本地端
driver.get_screenshot_as_file(os.getcwd() + '/test.png') # 擷取手機當下圖片,再跟目錄底下

可能會有人發現說為何一直使用 time.sleep()?
主要是等待元素出現其中一種方法
這篇主要是簡單介紹大致上的流程以及簡單的功能
Python + Appium 跑 Android Chrome 完整程式碼
有需要朋友們可以拿去參考,跑跑看!
也許你會有動力學習 Appium 自動化
希望有幫助到想學習的朋友們!
from appium import webdriver
import time
import os
desired_caps = {} # 空字典 需要給予測試手機相關資訊
desired_caps['platformName'] = 'Android' # 測試的平台
desired_caps['platformVersion'] = '11.0' # 手機os版本
desired_caps['deviceName'] = 'Pixel 3' # 看你手機的名稱是什麼
desired_caps['automationName'] = "UiAutomator2" # 一定要的!
desired_caps['autoGrantPermissions'] = True # 自動同意授權
desired_caps['appPackage'] = 'com.android.chrome'
desired_caps['appActivity'] = 'com.google.android.apps.chrome.Main'
desired_caps['newCommandTimeout'] = 60 # 接收下一個指令的時間(秒)
desired_caps['noReset'] = False # 改成 True,會保留原先資料,但自動化腳本會失敗
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5) # 等待5秒
agree_btn_ele = driver.find_element_by_id('com.android.chrome:id/terms_accept') # 取得 接受並繼續 元素
print('點擊: {0}'.format(agree_btn_ele.get_attribute('text'))) # 取得 接受並繼續 元素的文字
agree_btn_ele.click()
time.sleep(3) # 等待3秒
negative_btn_ele = driver.find_element_by_id('com.android.chrome:id/negative_button') # 取得不用了,謝謝 元素
print('點擊: {0}'.format(negative_btn_ele.get_attribute('text'))) # 取得 不用了,謝謝 元素的文字
negative_btn_ele.click()
print("進入到Googleg首頁")
time.sleep(3) # 等待3秒
search_box_text_ele = driver.find_element_by_id('com.android.chrome:id/search_box_text') # 取得搜尋框 元素
print('點擊: {0}'.format(search_box_text_ele.get_attribute('text'))) # 取得搜尋框 元素的文字
print('輸入網址: https://m.facebook.com/')
search_box_text_ele.send_keys("https://m.facebook.com/") # 輸入字串
driver.press_keycode(66) # 按下 Enter Key
print("進入到Facebook登入頁面")
time.sleep(5) # 等待5秒
driver.get_screenshot_as_file(os.getcwd() + '/test.png') # 擷取手機當下圖片,再跟目錄底下
文章內的程式碼都可以直接複製下來練習操作,或是直接套用到自己的專案都行!
多練習,對自已會有很大的幫助!
一回生二回熟,將所學習到內容變成自己的知識。
人就是要學習自己不會的事情,這樣才會不斷的成長、進步!
更多技術文章
透過下方按鈕找尋到相關的技術文章,希望可以幫助到正在學習的你
加入到我的粉絲專頁,不定期發布最新文章資訊!
有任何文章問題都可以詢問喔!