注:以下是mac的安裝
一、appium環境搭建
安卓端UI自動化需要依賴於adb命令,而adb命令屬於android sdk的工具,而android sdk 又依賴於jdk,所以先安裝jdk再安裝android sdk。
1.安裝JDK(1.8) mac版本:
官網下載地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
現在下載jdk需要oracle賬號登錄,沒有賬號的可以直接從網盤鏈接直接取:
https://pan.baidu.com/s/1b9uoG3MiIFJtW05vo02fvQ 提取碼:ejg6
下載完成后得到的是一個dmg的安裝包
直接點擊dmg安裝包,按照系統提示直接安裝即可。
安裝完后找到jdk的安裝目錄,可以通過命令在終端 which java 找到安裝路徑復制。
在終端打開 "open .bash_profile"文件,在文件末尾添加上下面這段語句
export java="剛才復制的JDK安裝路徑"
最后終端輸入source ~/.bash_profile回車即可生效。
添加完成在終端輸入 "java -version" 能看到java版本即代表配置生效,jdk安裝完成
2.下載android的SDK:
目前官網已經沒有單獨的sdk包下載,如果從官網下載的話是下載包含android sdk的android studio,
而我們在使用appium時主要用的只是android的sdk,為了方便就不從官網下載,從另外一個鏈接單獨下載sdk。
下載地址:https://www.androiddevtools.cn/
打開鏈接后,點擊Android SDK 工具
選擇SDK Tools
再選擇系統對應的版本下載即可。
下載完成后解壓,打開文件找到tools目錄下的android雙擊。
打開了Android SDK Manager。再勾選對應工具包點擊下載。
下載完成后打開 open .bash_profile文件 然后在末尾輸入
export ANDROID_HOME=/Users/cody/App/android-sdk-macosx
export PATH=${PATH}:${ANDROID_HOME}/platform-tools
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/build-tools/28.0.3
注:
第一行后面的路徑指的是sdk的本地路徑
第四行后面28.03指的是android sdk文件下build-tools目錄下下載的版本。
配置完成后保存后在終端輸入source ~/.bash_profile
最后在終端輸入 adb -version 能看到adb版本即代表配置生效,adb安裝完成。
3.安裝note.js。appium依賴於node.js。
下載地址:https://nodejs.org/zh-cn/
下載完成后得到dmg包,直接雙擊點擊安裝即可。安裝完成后在終端輸入 "node -v" 查看到版本號即代表安裝完成。
4.安裝appium desktop(appium server + appium inspector工具)
下載地址:https://github.com/appium/appium-desktop/releases
選擇系統對應的版本下載完成后直接安裝即可。
如果不需要inspector工具的話 可以通過npm命令安裝命令版
在終端輸入"nmp install -g appium" 。nmp可以理解為node.js的包管理器,類似於python的pip
2021-07-17如果下載慢的話可以換為國內的鏡像源例如淘寶:
"npm install -g cnpm --registry=https://registry.npm.taobao.org"
"cnpm install -g appium"
5.安裝appium client
通過pip命令安裝,在終端輸入"pip install appium-python-client"
6.安裝appium-doctor檢測appium的安裝環境
在終端輸入"cnmp install appium-doctor"
在終端輸入appium-doctor通過執行結果查看運行是否有錯誤。
注:現在的appium不需要再單獨安裝appium-doctor 直接安裝appium desktop即可。
以上便是appium的環境搭建。下面就來檢驗一下環境是否搭建成功。
1.啟動appium desktop,點擊編輯配置查看ANDROID_HOME及JAVA_HOME路徑是否正確,正確的話點擊啟動服務。
2.准備一個android設備,真機或模擬器。鏈接上電腦並通過adb devices查看設備是否鏈接成功。
3.編寫腳測試。
from appium import webdriver desired_caps={ "automationName":"UiAutomator2", "platformName":"Android", #移動系統操作平台名稱 "platformVersion":"7.1.2", #系統版本 "deviceName":"UYT5T18524015578", #使用的移動設備或模擬器 需要在cmd命令下 敲adb devices查看 "appPackage":"com.tm.tongmeng", #app包名 aapt dump badging apk路徑(路徑和apk安裝包不能包含中文),查看package:name= "appActivity":"com.tm.tongmeng.AdPageActivity", #所要測試app的入口頁面,獲取命令:aapt dump badging apk路徑,查看launchable-activity: name=' "noReset":True, #在此會話之前,請勿重置應用程序狀態 } driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
腳本執行完成,appium 日志沒有報錯表示搭建成功了。
二、實現小程序ui自動化
appium實現微信小程序UI自動化關鍵的地方在於webview的切換。
由於微信的使用的是瀏覽器內核為自研x5內核,非Google原生的webview。需要開啟TBS內核Inspector調試功能,chorme-devtools才能拿到小程序頁面。
步驟:
1.在微信聊天窗口頁面發送鏈接:debugx5.qq.com,打開鏈接后點擊"信息",勾選是否打開TBS內核Inspector調試功能。(不要使用模擬器,模擬器無法開啟x5內核調試)
2.android設備與電腦鏈接,通過adb devices 檢測確認已鏈接。
3.在chrome瀏覽器打開鏈接:chrome://inspect/#devices,再打開微信,這時已打開的chrome://inspect/#devices鏈接頁面刷新后會顯示webview的版本號以及小程序H5的頁面點擊inspect即可拿頁面
(chrome-devtools需要梯子才能使用,沒有的話可以使用uc-devtools)
4.下載對應chromedriver對應版本,下載鏈接:http://npm.taobao.org/mirrors/chromedriver/
5.appium-desktop的chromedriver版本與手機上的不一致需要修改。
修改方式有多種:
啟動appium-desktop后指定chromedriver路徑。點擊高級設置將下載好的chromedriver路徑放到chromedriver選項里面
找到本地appium-desktop的安裝路徑找到chromedriver將其替換為版本對應的。
通過絕對路徑指定驅動文件。在appium啟動參數加上"chromedriverExecutable":"chromedriver.exe的路徑"
6.在appium啟動參數指定android進程。
首先需要找到當前小程序的進程
在終端輸入"adb shell dumpsys activity top | grep ACTIVITY"(手機上只保留小程序活動,其他的都殺掉,不然進程太多了)
拿到進程id后 終端輸入"adb shell ps 32324" 拿到進程名
拿到進程名后"com.tencent.mm:appbrand0"在啟動參數加上'chromeOptions': { 'androidProcess': 'com.tencent.mm:appbrand0'}
desired_caps = { "automationName": "UiAutomator2", "platformName": "Android", "platformVersion": "10", "deviceName": "UYT5T18524015578", "appPackage": "com.tencent.mm", "appActivity": ".ui.LauncherUI", "noReset": True, "fullReset": False, 'chromeOptions': { 'androidProcess': 'com.tencent.mm:appbrand0' } }
執行看看~可以輸出頁面源碼就可以~ ~
from appium import webdriver desired_caps={ "automationName":"UiAutomator2", "platformName":"Android", "platformVersion":"10", "deviceName":"UYT5T18524015578", "appPackage":"com.tencent.mm", "appActivity":".ui.LauncherUI", "noReset":True, "fullReset":False, 'newCommandTimeout':600, 'chromeOptions': { 'androidProcess': 'com.tencent.mm:appbrand0' } } driver = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps) driver.implicitly_wait(25) # driver.find_element_by_android_uiautomator('new UiSelector().text("發現")').click() driver.find_element_by_android_uiautomator('new UiSelector().text("小程序")').click() driver.find_element_by_android_uiautomator('new UiSelector().text("小程序名稱")').click() time.sleep(5) driver.switch_to.context('WEBVIEW_com.tencent.mm:appbrand0') time.sleep(5) print(driver.page_source)
最后一個注意事項:在兩個H5頁面切換時,打印第二個頁面的page_source時輸出的是第一個頁面的page_source。
解決方案:
先切回 NATIVE_APP 再殺掉chromedriver進程 在切入webview
driver.switch_to.context("NATIVE_APP") os.system('pkill -f "chromedriver 2"') time.sleep(3) driver.switch_to.context('WEBVIEW_com.tencent.mm:appbrand0')