前言
来啦老铁!
近期在研究项目上的手机端浏览器的自动化,团队里的大佬已经帮忙在远程机器启动好 appium 服务,并绑定到内部设备分发管理平台,而我完成的部分是:
-
集成内部设备分发管理平台,完成手机端浏览器自动化的整体方案;
-
探索搭建本地 appium 服务、自动化设备,用于本地调试;
笔者在手机端自动化的领域经验还是相对比较缺乏,因此打算用几篇文章记录一下探索过程,东西应该会相对比较浅、面向初学者,欢迎来踩~
今天我们先学习记录一下安卓端~
学习路径
- 安装 appium 模块;
- 下载安装 Android SDK;
- 设置 Android SDK 环境变量;
- 创建安卓虚拟机;
- 启动安卓虚拟机;
- 获取安卓虚拟机的 udid;
- 启动 appium server;
- 自动化脚本部分的处理;
- 运行自动化脚本;
1. 安装 appium 模块;
-
命令行执行以下命令:
npm install -g appium
2. 下载安装 Android SDK;
-
下载地址:https://www.androiddevtools.cn/
-
安装:自行脑补;
3. 设置 Android SDK 环境变量;
在没有设置 Android SDK 环境变量的前提下,如果运行正常脚本,则会出现如下报错:
An unknown server-side error occurred while processing the command. Original error: Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported. Read https://developer.android.com/studio/command-line/variables for more details
很明显,报错中已经告知我们,未暴露 ANDROID_HOME 或 ANDROID_SDK_ROOT 环境变量,因此,我们需要设置该环境变量;
-
打开 ~/.bash_profile 文件;
vim ~/.bash_profile
-
输入 i 进入编辑模式;
-
添加如下环境变量;
export ANDROID_HOME=/Users/dylan.z.zhang/Library/Android/sdk
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/tools/bin
export PATH=${PATH}:${ANDROID_HOME}/tools/lib/x86_64
export PATH=${PATH}:${ANDROID_HOME}/build-tools
export PATH=${PATH}:${ANDROID_HOME}/platform-tools
export PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/build-tools/31.0.0
build-tools/31.0.0 是安卓构建工具集,我们可以打开 /Users/dylan.z.zhang/Library/Android/sdk/build-tools 文件夹,我选择最大版本 31.0.0(很久没玩 Android 了,这些文件夹是以前操作遗留下来的);
-
保存 ~/.bash_profile 文件;
a. 按键盘的 esc 按钮;
b. ~/.bash_profile 文件中输入如下文本并回车,完成保存;
:wq!
-
命令行执行以下命令,使环境变量生效;
source ~/.bash_profile
-
注意,此时需要重新启动命令行终端来执行我们的脚本;
4. 创建安卓虚拟机;
-
安卓虚拟机需要用到 Android SDK 的 AVD Manager(Android Virtual Device Manager) 来进行管理,而 AVD Manager 有命令行模式和 GUI 模式:
a. 命令行模式需要在 sdk/tools/bin 下执行 android create avd 等命令操作安卓虚拟机;
b. 从网络上得知,AVD Manager GUI 只能在 Android Studio 中使用;
笔者更倾向于使用 GUI 模式,我们一起来试看看~
-
下载安装 Android Studio;
我们需要下载安装 Android Studio,此处省略,请读者自行下载安装;
-
下载安装后,打开 Android Studio 并找到右上角的 “Running devices”,这时候我们就能在入口下找到 AVD Manager 入口,点击 AVD Manager 入口打开安卓虚拟机管理会话窗;
-
点击左下角的 “+ Create Virtual Device...” 按钮开始创建安卓虚拟机;
-
选择设备类型、设备型号,然后点击 “Next” 继续;
-
下载安卓系统镜像;
例如我们选择安卓系统镜像版本为 Android 11.0;
镜像有点大,像 Android 11.0 有 1G 多,网络不是特别好的朋友需要耐心等待一下~
-
下载完成后,我们选择该安卓系统镜像,继续点击 “Next” 按钮;
-
修改虚拟机命名、启动横屏竖屏选项等基础设置;
-
生成的安卓虚拟机;
a. 在 AVD Manager 会话窗口,我们可以看到我们的安卓虚拟机,如:
b. 我们还可以使用命令行命令来查看我们的安卓虚拟机:
emulator -list-avds
5. 启动安卓虚拟机;
-
承接上述 AVD Manager 会话窗口看到的安卓虚拟机,其提供了快速启动安卓虚拟机的入口,如:
-
更为普遍适用的,我们可以用命令行来启动安卓虚拟机,如命令为:
(命令行启动安卓虚拟机更容易满足自动化测试在各个方面的特殊需求)。
emulator @pixel2 -skip-adb-auth -allow-host-audio -port 5554 -no-snapshot -no-boot-anim -memory 3072 -partition-size 8192
6. 获取安卓虚拟机的 udid;
自动化测试中,我们需要指定哪个安卓设备进行页面操作,因此,需要获取所需设备的 udid。
-
命令行执行以下命令:
adb devices
-
当然,真机也是如此;
7. 启动 appium server;
-
由于我们在第一步全局安装了 appium,因此可以直接使用 appium 命令,如:
appium
注意:
-
此时我们并未下载对应版本的 chromedriver,若执行脚本,则会出现以下类似的报错:
An unknown server-side error occurred while processing the command. Original error: No Chromedriver found that can automate Chrome '83.0.4103'. You could also try to enable automated chromedrivers download server feature. See https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md for more details
则此时我们需要去寻找与之匹配的 chromedriver 并下载,而更简单的方式是在启动 appium server 的时候就允许自动下载 chromedriver,由 appium 接管,如下~
-
启动 appium server 时允许自动下载 chromedriver
appium --allow-insecure chromedriver_autodownload
-
appium server 启动后,后续开始执行脚本时会自动帮我们安装各种版本的 chromedriver,如:
8. 自动化脚本部分的处理;
这部分实际上不是要介绍写脚本,而是要介绍 wdio 相关的配置应该是怎么样的,大家使用的语言可能不一定是跟我一样是 node.js,但最终,相关配置和值,应该是类似:
-
wdio 基本配置;
hostname: 'localhost',
port: 4723,
path: '/wd/hub'
-
capabilities:
{
platformName: 'Android',
automationName: 'UiAutomator2',
browserName: 'Chrome',
platformVersion: '11',
deviceName: 'pixel2',
udid: 'emulator-5554'
}
9. 运行脚本;
-
appium server 端的日志类似:
-
手机上的浏览器行为:
如果你能看到虚拟机上开始打开浏览器并执行脚本了,那么恭喜您,跟我一样完成了今天的学习和实践~
Appium + uiautomator 作为脚本与安卓手机交互的桥梁,搞定这个桥梁就搞定了安卓手机自动化的一大部分~
(这样的自动化,原理 = 脚本 + 翻译官 + 桥梁 + 设备)
-
其他可能用到的命令:
a. 查看端口占用的进程号,4723 为端口号,自行改为想要的端口号;
lsof -i tcp:4723
b. 删除进程,xxxx 为进程号;
kill -9 xxxx
如文章开始所说,本文介绍的东西应该会相对比较浅、面向初学者,其中也可能伴随考虑不周的地方,望您不吝指正,我也将继续研究学习~
能力有限,欢迎指正、互相交流,感谢~
如果本文对您有帮助,麻烦点赞、关注!
感谢~