本教程講解如何使用Appium進行手機應用的自動化。
學習本課程前,強烈推薦先學習 Selenium Web 自動化課程
Appium
是一個移動 App (手機應用)自動化工具。
手機APP 自動化有什么用?
自動化完成一些重復性的任務
比如微信客服機器人
爬蟲
就是通過手機自動化爬取信息。
為什么不通過網(wǎng)頁、HTTP 爬取呢?有的系統(tǒng)沒有網(wǎng)頁,也不方便通過HTTP爬取
自動化測試
很多企業(yè)里面有這樣的需求
Appium
自動化方案的特點:
開源免費
支持多個平臺
iOS (蘋果)、安卓 App 的自動化都支持。
支持多種類型的自動化
支持 蘋果、安卓 應用 原生界面 的自動化
支持 應用 內(nèi)嵌 WebView 的自動化
支持 手機瀏覽器 中的 web網(wǎng)站自動化
支持 flutter 應用的自動化
支持多種編程語言
像 Selenium 一樣, 可以用多種編程語言 調(diào)用它 開發(fā)自動化程序。
我們先來看一下Appium自動化的原理圖
這圖是不是很眼熟?
對啦,和Selenium 原理圖很像。因為 Appium自動化架構就是借鑒的Selenium。
大家看看這幅圖, 包含了 3個主體部分 : 自動化程序、Appium Server、移動設備
自動化程序
自動化程序是由我們來開發(fā)的,實現(xiàn)具體的 手機自動化 功能。
要發(fā)出具體的指令控制手機,也需要使用 客戶端庫。
和Selenium一樣,Appium 組織 也提供了多種編程語言的客戶端庫,包括 java,python,js, ruby等,方便不同編程語言的開發(fā)者使用。
我們需要安裝好客戶端庫,調(diào)用這些庫,就可以發(fā)出自動化指令給手機。
Appium Server
Appium Server 是 Appium 組織開發(fā)的程序,它負責管理手機自動化環(huán)境,并且轉(zhuǎn)發(fā) 自動化程序的控制指令 給 手機,并且轉(zhuǎn)發(fā) 手機給 自動化程序的響應消息。
手機設備
我們這里說的手機設備,其實不僅僅是手機,包括所有 蘋果、安卓的移動設備,比如:手機、平板、智能手表等。
為了直觀方便的講解,這里我們簡稱: 手機
當然手機上也包含了 我們要自動化控制的 手機應用APP。
手機設備為什么能 接收并且處理自動化指令呢?
因為,Appium Server 會在手機上 安裝一個 自動化代理程序, 代理程序會等待自動化指令,并且執(zhí)行自動化指令
比如:要模擬用戶點擊界面按鈕,Appium 自動化系統(tǒng)的流程是這樣的:
自動化程序 調(diào)用客戶端庫相應的函數(shù), 發(fā)送 點擊元素
的指令(封裝在HTTP消息里)給 Appium Server
Appium Server 再轉(zhuǎn)發(fā)這個指令給 手機上的自動化代理
手機上的自動化代理 接收到 指令后,調(diào)用手機平臺的自動化庫,執(zhí)行點擊操作,返回點擊成功的結(jié)果給 Appium Server
Appium Server 轉(zhuǎn)發(fā)給 自動化程序
自動化程序了解到本操作成功后,繼續(xù)后面的自動化流程
其中,自動化代理控制,使用的什么庫來實現(xiàn)自動化的呢?
如果測試的是蘋果手機, 用的是蘋果的 XCUITest 框架 (IOS9.3版本以后)
如果測試的是安卓手機,用的是安卓的 UIAutomator 框架 (Android4.2以后)
這些自動化框架提供了在手機設備上運行的庫,可以讓程序調(diào)用這些庫,像人一樣自動化操控設備和APP,比如:點擊、滑動,模擬各種按鍵消息等。
本教程主要講解 安卓APP的自動化。
環(huán)境搭建需要下載安裝不少軟件,而且還有不少是國外網(wǎng)站下載的。
為了方便各位朋友,白月黑羽把這些軟件 最新的安裝包 都放在如下的百度網(wǎng)盤鏈接中了,請大家自行下載。
鏈接:https://pan.baidu.com/s/19C9fGmoXne8DgfXhrTB2TQ
提取碼:kgwb
根據(jù)原理圖, 我們知道自動化程序需要調(diào)用客戶端庫和 Appium Server 進行通信。
因為我們介紹Python語言開發(fā),所以當然是用pip安裝,如下
pip install appium-python-client
Appium Server 是用 nodejs 運行的,基于js開發(fā)出來的。
Appium組織為了方便大家安裝使用,制作了一個可執(zhí)行程序 Appium Desktop,把 nodejs 運行環(huán)境、Appium Server 和一些工具 打包在里面了,只需要簡單的下載安裝就可以了。
可以從 上面給出的百度網(wǎng)盤連接 下載安裝: Appium-windows-1.15.1.exe
附加信息: Appium Desktop官方下載,點擊這里打開下載頁面
本教程主要講解 安卓APP的自動化,必須要安裝安卓SDK(后面會講到),而安卓SDK需要 JDK 環(huán)境。
可以從 上面給出的百度網(wǎng)盤連接 下載安裝: jdk-8u211-windows-x64.exe
安裝好之后,還需要添加一個環(huán)境變量 JAVA_HOME
,指定 值 為 jdk安裝目錄,比如
JAVA_HOME d:\tools\java\jdk1.8.0_211
具體操作參考視頻講解。
對于安卓APP的自動化,Appium Server 是需要 Android SDK的。
因為要用到里面的一些工具,比如 要執(zhí)行命令設置手機、傳送文件、安裝應用、查看手機界面等。
可以從 上面給出的百度網(wǎng)盤連接 下載最新的 Android SDK文件包: androidsdk.zip
,并且解壓,即可。
解壓完成后,需要 配置一下 添加一個 環(huán)境變量 ANDROID_HOME
,設置值為sdk包解壓目錄,比如 d:\tools\androidsdk
另外,還推薦大家配置環(huán)境變量 PATH ,加入 adb所在目錄, d:\tools\androidsdk\platform-tools\
注意:是 添加
該目錄到環(huán)境變量PATH中, ?。?!不是替換?。?!
,否則會導致系統(tǒng)命令都找不到的嚴重后果,初學者 請對照視頻講解操作。
上述的軟件環(huán)境都準備好以后,要自動化手機APP,需要:
在你運行程序的電腦上 用 USB線 連接上 你的安卓手機
進入 手機設置
-> 關于手機
,不斷點擊 版本號
菜單(7次以上),
退出到上級菜單,在開發(fā)者模式中,啟動USB調(diào)試
如果手機連接USB線后,手機界面彈出 類似 如下提示。
選擇 允許USB調(diào)試。
注意:
有的手機系統(tǒng),可能需要一些額外的選項需要設置好。
比如,有的手機,開發(fā)者選項里 需要打開 允許通過USB安裝應用
等。
總之,給USB開發(fā)調(diào)試 盡可能方便的控制手機。
連接好以后,打開命令行窗口, 執(zhí)行 adb devices -l
命令來列出連接在電腦上的安卓設備。
如果輸出 類似如下的內(nèi)容:
List of devices attached4d0035dc767a50bb device product:t03gxx model:GT_N7100 device:t03g
表示電腦上可以查看到 連接的設備,就可以運行自動化程序了。
下面是一段使用 Appium 自動化的打開 B站 應用,搜索 白月黑羽
發(fā)布的教程視頻,并且打印視頻標題的示例。
from appium import webdriverfrom appium.webdriver.extensions.android.nativekey import AndroidKeydesired_caps = { 'platformName': 'Android', # 被測手機是安卓 'platformVersion': '8', # 手機安卓版本 'deviceName': 'xxx', # 設備名,安卓手機可以隨意填寫 'appPackage': 'tv.danmaku.bili', # 啟動APP Package名稱 'appActivity': '.ui.splash.SplashActivity', # 啟動Activity名稱 'unicodeKeyboard': True, # 使用自帶輸入法,輸入中文時填True 'resetKeyboard': True, # 執(zhí)行完程序恢復原來輸入法 'noReset': True, # 不要重置App 'newCommandTimeout': 6000, 'automationName' : 'UiAutomator2' # 'app': r'd:\apk\bili.apk',}# 連接Appium Server,初始化自動化環(huán)境driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)# 設置缺省等待時間driver.implicitly_wait(5)# 如果有`青少年保護`界面,點擊`我知道了`iknow = driver.find_elements_by_id("text3")if iknow: iknow.click()# 根據(jù)id定位搜索位置框,點擊driver.find_element_by_id("expand_search").click()# 根據(jù)id定位搜索輸入框,點擊sbox = driver.find_element_by_id('search_src_text')sbox.send_keys('白月黑羽')# 輸入回車鍵,確定搜索driver.press_keycode(AndroidKey.ENTER)# 選擇(定位)所有視頻標題eles = driver.find_elements_by_id("title")for ele in eles: # 打印標題 print(ele.text)input('**** Press to quit..')driver.quit()
運行代碼前,要先 運行 Appium Desktop
上面的代碼只是抓取一頁視頻標題,要自動化滾動抓取所有的視頻標題,實戰(zhàn)班學員
,請聯(lián)系老師獲取參考代碼。
游客
也可以 分享課程 領取參考代碼,點擊這里查看
如果你應用已經(jīng)安裝在手機上了,可以直接打開手機上該應用,進入到你要操作的界面
然后執(zhí)行
adb shell dumpsys activity recents | find "intent={"
會顯示如下,最近的 幾個 activity 信息,
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=tv.danmaku.bili/.ui.splash.SplashActivity}intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000300cmp=com.huawei.android.launcher/.unihome.UniHomeLauncher}intent={flg=0x10804000 cmp=com.android.systemui/.recents.RecentsActivity bnds=[48,1378][10322746]}intent={flg=0x10000000 cmp=com.tencent.mm/.ui.LauncherUI}
其中第一行就是當前的應用,我們特別關注最后
cmp=tv.danmaku.bili/.ui.splash.SplashActivity
應用的package名稱就是 tv.danmaku.bili
應用的啟動Activity就是 .ui.splash.SplashActivity
如果你已經(jīng)獲取到了 apk,在命令行窗口執(zhí)行
d:\tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging d:\tools\apk\bili.apk | find "package: name="
輸出信息中,就有應用的package名稱
package: name='tv.danmaku.bili' versionCode='5531000' versionName='5.53.1' platformBuildVersionName='5.53.1' compileSdkVersion='28' compileSdkVersionCodename='9'
在命令行窗口執(zhí)行
d:\tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging d:\tools\apk\bili.apk | find "launchable-activity"
輸出信息中,就有應用的啟動Activity
launchable-activity: name='tv.danmaku.bili.ui.splash.SplashActivity' label='' icon=''
聯(lián)系客服