注:以下是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')