1. 前言
1.1. Appium简介
Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。 它使用WebDriver协议驱动iOS,Android和Windows应用程序。
- Appium官网(英文)
- Appium官网(中文)
1.2. Appium特点
- 可以跨平台同时支持Android、iOS
- 支持多种语言,java、python、php、Ruby等等
2. 环境工具
2.1. 环境
Windows 10 & 夜神安卓模拟器
MacOS 10.12(本文的.py文件运行在Mac上,也可以将.py文件运行在Windows 上)
2.2. 工具
adb、JAVA、SDK、Appium
3. 环境搭建
3.1. 安装 JAVA JDK
3.1.1. 下载 JAVA JDK
-- 下载地址:https://www.oracle.com/java/technologies/javase-jdk14-downloads.html;
-- windows 用户选择 windows x64 进行下载;
3.1.2. 安装 JDK
-- 按提示完成安装,注意安装位置,如图:
3.1.3. 配置 JAVA 环境变量
- 在桌面鼠标右键点击 【我的电脑(或计算机)】> 【高级系统设置】 > 【环境变量】,打开环境变量配置页面;
-- JAVA_HOME
C:\Program Files\Java\jdk-14(此处可以自己在安装时设定路径)
-- Path
%JAVA_HOME%\bin;
%JAVA_HOME%\jre\bin;
-- CLASSPATH
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
注意:最前面有个【点】,一定不要漏掉!
- 验证安装情况
-- 打开 cmd 命令行工具,输入 java -version,返回信息如图标识安装配置成功;
3.2. 安装 Android SDK Tools
3.2.1.下载 Android SDK Tools
-- 下载地址:http://tools.android-studio.org/index.php/sdk
-- 选择 Winddows 对应的 .exe 文件下载,如图:
3.2.2. 安装 SDK Tools
按提示进行安装,注意文件包的安装路径,如果C盘空间不够的话,后面可能会下载 packages 不成功,所以最好放到D盘或E盘,如图:
3.2.3. 安装 pacakge 包
注意:此处需要先点击选择左侧的 packages 包,然后点击右侧的 Accept License,依次分别点选并接受,等全部 Packages 包都变成绿色对号以后,再点击 Install 进行安装;
- 等待全部安装完毕即可。
3.3. 替换 UIAutomator
- 下载 uiautomatorviewer.jar 文件;
注意:之所以要配置 UIAutomator,是因为 Android SDK tools 包中原生的工具在获取元素时,不能很好地满足开发需求;
链接: https://pan.baidu.com/s/1fxWt0tz3scEgVYVsv8-yWQ 提取码: 8qz3
- 在 \sdk\tools\lib* 目录下找到 uiautomatorviewer xxx.jar,复制该文件的文件名,将改文件移动到其他文件夹,将下载的 uiautomatorviewer.jar 复制进文件包,并用之前的文件名重新命名该文件。
注意:一定要用前面复制的文件名重新命名!
3.4. 替换 ADB,并配置 ANDROID 环境变量
3.4.1. ADB 简介
- ADB,即 Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互;
- adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:
客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令来从命令行终端调用客户端。
守护进程 (adbd):在设备上运行命令。守护进程在每个设备上作为后台进程运行。
服务器:管理客户端和守护进程之间的通信。服务器在开发机器上作为后台进程运行。
- adb 包含在 Android SDK 平台工具软件包中,需要使用 SDK 管理器下载此软件包,该管理器会将其安装在 android_sdk/platform-tools/ 下;
- 欲了解更多详细内容,请访问 Android Studio用户指南
3.4.2. 替换 SDK 中的 ADB
-
在夜神模拟器安装目录的 bin 目录下找到 nox_adb.exe 文件
- 在 android-sdk\platform-tools 目录下找到 adb.exe,将文件剪切移动到备份位置;
- 将 nox_adb.exe 复制到 android-sdk\platform-tools 目录下,重命名为 adb.exe;
3.4.3. ADB 命令
adb devices # 查看 adb 已连接的设备
adb kill-server # 关闭 adb 服务
adb start-server # 启动 adb 服务
3.5. 配置 ANDROID 环境变量
-
在系统环境变量添加 ANDROID_HOME,路径为 SDK 文件安装路径
-- 如下图:
- 在 path 中添加下面两行内容
%ANDROID_HOME%\tools
%ANDROID_HOME%\platform-tools
-- 如下图:
4. 安装 Appium
4.1. Appium 简介
- Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用;
- appium类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。
4.2. Appium 与 Selenium
- 类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。
- appium客户端类库实现了Mobile JSON Wire Protocol(一个标准协议的官方扩展草稿)和W3C WebDriver spec(一个传输不可预知的自动化协议,该协议定义了MultiAction 接口)的元素。
- appium服务端定义了官方协议的扩展,为appium 用户提供了方便的接口来执行各种设备动作,例如在测试过程中安装/卸载App。这就是为什么我们需要appium特定的客户端,而不是通用的Selenium 客户端。
4.3. 下载Appium软件
- 下载地址:https://github.com/appium/appium-desktop/releases
- 安装
-- 下载成功后开始安装; -
启动
-- 安装成功后启动软件,如下图:
5. 安装夜神模拟器
5.1. 夜神模拟器简介
- 夜神安卓模拟器(夜神模拟器),是全新一代的安卓模拟器,与传统安卓模拟器相比,基于android5.1.1同时支持android7.1,兼容X86/AMD,在性能、稳定性、兼容性等方面表现良好;
- 重要的是:相比其他模拟器,夜神模拟器对 Appium 会更加友好!
5.2. 下载安装
-- 下载地址:https://www.yeshen.com/;
- 安装
-- 下载成功后开始安装;
5.3. 配置 & 启动
- 安装成功后,桌面多出两个图标,一个叫夜神多开器(MultiPlayerManager),一个叫夜神模拟器(NoxPlayer),表示安装成功;
- 配置
-- 夜神模拟器的使用以及配置,参考我的另一篇文章 夜神模拟器使用简介及配置操作; -
启动
-- 找到配置好的模拟器,点击三角形图标启动;
6. 安装京东APP
- 下载京东APP
-- 在Windows浏览器中打开 https://app.jd.com/android.html下载京东APP; - 安装京东APP
-- 将下载好的京东 .apk 文件拖入模拟器,完成安装;
7. 开发测试
7.1. 打开开发者模式
-
打开模拟器,依次进入 设置 > 关于平板电脑 > 版本号,鼠标持续点击 版本号,打开开发者模式;
-
返回上级菜单,进入 开发者选项 打开 USB调试;
7.2 打开 adb
- 打开 cmd 命令行,输入下面代码,启动adb 并查看 连接的设备;
adb start-server # 启动 adb 服务
adb devices # 查看 adb 已连接的设备
-
得到下图,表示连接成功;
7.3. 配置 app desired_caps
- 获取 apk 包名(appPackage)、活动名(appActivity)
-- 电脑打开 cmd 命令行,输入下面代码获取 app 信息;
adb shell dumpsys activity activities # 该命令的功能是获取当前正在被操作的 app 的 activity 相关信息;
-- 得到下面的返回结果,appActivity 值为 com.jingdong.app.mall.main.MainActivity,app 的 appPackage 值为 com.jingdong.app.mall;
-- 这里注意:appActivity 返回值本来是 com.jingdong.app.mall/.main.MainActivity,需要 去掉中间的反斜线!
- 打开模拟器,依次进入 设置 > 关于平板电脑,获取模拟器参数参数;
- 下面是配置后的参数,注意 appActivity 值需要去掉反斜线 !
# 定义启动设备需要的参数
desired_caps = {}
# 设备系统
desired_caps['platformName'] = 'Android'
# 设备系统版本号
desired_caps['platformVersion'] = '5.1.1'
# 设备名称
desired_caps['deviceName'] = 'Meizu'
## 要测试的应用的地址
#desired_caps['app'] = 'xxx.apk' # 注意是 apk 文件在电脑上的绝对路径
# 应用的包名
desired_caps['appPackage'] = 'com.jingdong.app.mall'
desired_caps['appActivity'] = 'com.jingdong.app.mall.main.MainActivity' # appActivity 值需要去掉反斜线
7.4. UIAutomator 获取元素位置
-
在 sdk\tools\bin 目录下找到 uiautomatorviewer.bat 文件,双击打开运行 uiautomatorviewer;
-
启动 uiautomatorviewer 后,点击左上安卓角手机图标连接安卓模拟器;
- 将模拟器页面同步到 UIAutomator 之后,在模拟器打开 app ,再次点击左上角安卓手机图标,就可以在 UIAutomator 看到同步后的京东 app 页面;
注意:每次操作 App 出现页面变换以后,需要手动点击左上角安卓手机图标,才能够在 UIAutomator 同步页面;
-
在京东 app 上移动鼠标,获取需要操作的 app 的 xpath 路径,如下图;
- 具体的获取位置步骤,可以参考 selenium 的元素定位获取方法,此处省略步骤细节;
7.5. 编写代码
- 此处展示 启动、输入关键字查询 两个动作的代码,请读者自行编写代码完成 app 操作;
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time
class Jingdong():
def __init__(self):
desired_caps = {}
# 设备系统
desired_caps['platformName'] = 'Android'
# 设备系统版本号
desired_caps['platformVersion'] = '5.1.1'
# 设备名称
desired_caps['deviceName'] = '127.0.0.1:62025'
## 要测试的应用的地址
#desired_caps['app'] = 'xxx.apk' # 注意是 apk 文件在电脑上的绝对路径
# 应用的包名
desired_caps['appPackage'] = 'com.jingdong.app.mall'
desired_caps['appActivity'] = 'com.jingdong.app.mall.main.MainActivity'
self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # 地址为appium地址
time.sleep(8)
def search(self, keyword):
self.driver.find_element_by_xpath('//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[2]/android.widget.LinearLayout[1]').click()
time.sleep(3)
self.driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[2]/android.widget.EditText[1]").send_keys(keyword)
time.sleep(3)
self.driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.TextView[1]").click()
time.sleep(3)
def main():
jingdong = Jingdong()
keyword = "手机"
jingdong.search(keyword)
if __name__ == '__main__':
main()
7.6. 关闭 adb 服务
adb kill-server
7.7. 启动 Appium
- 启动 appium 服务,点击 Start Server,不需要进行任何操作;
7.8. 重启模拟器
- 之所以在关闭 adb 之后重启模拟器,是为保证 adb 连接不出现异常;
9. mitmproxy 获取结果
- 参考我的另一篇文章《APP爬虫:mitmproxy 获取 京东APP 数据》;