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