1. 前言
1.1. Appium简介
Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。 它使用WebDriver协议驱动iOS,Android和Windows应用程序。
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

-- Path
-- CLASSPATH
注意:最前面有个【点】,一定不要漏掉!

- 验证安装情况
-- 打开 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 文件;
 
链接: 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 包含在 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 上移动鼠标,获取需要操作的 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 数据》;
 










