【任务描述】:经过任务一的学习,电脑已经可以连接上Android智能终端设备,但是如何通过编程的方式来控制Android设备实现自动化测试呢?
【任务目标】:通过使用Appium工具,掌握使用Python语言操作App应用的自动化测试方法。
【任务储备】:
1、Appium
Appium是一个开源、跨平台的自动化测试框架,使用WebDriver协议驱动Android设备、iOS设备和Windows APP应用程序,允许测试人员在不同的平台(Android、iOS等)使用同一套API来编写自动化测试脚本。在使用Appium执行自动化测试时,在Appium客户端编写测试脚本并执行该脚本,脚本后请求到Appium服务端,Appium服务端对脚本进行解析,驱动iOS设备或者Android设备执行脚本,完成自动化测试,其工作原理如下图所示。
图 1
(1) Appium客户端的测试脚本可以使用多种语言来编写自动化脚本,如Python、Java、JavaScript、Objective—C,PHP等。
(2) Appium服务端接收客户端的请求,解析请求内容,调用对应的框架响应操作,其端口默认为4723。
(3) Appium服务端将请求转发给监听手机端口4724的中间件Bootstrap,并接收Appium的命令,调用UI Automator的命令执行对应的操作。
(4) Bootstrap将执行结果返回给Appium服务端。
(5) Appium服务端再将结果返回给Appium客户端。
2、Appium 服务器初始化参数(Capability)
Appium 服务器初始化参数(Capability)是一些发送给 Appium 服务器的键值对集合,告诉服务器我们想要启动什么类型的自动化会话,具体参数如下表所示。
表1 Appium 服务器初始化参数列表
键 | 描述 | 值 |
platformName | 使用的设备(模拟器)操作系统 | iOS, Android, 或者 FirefoxOS |
platformVersion | 设备(模拟器)操作系统的版本 | 如:7.1, 4.4 |
deviceName | 使用的设备(模拟器)类型 | iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4, 等等,如果设备为iOS操作系统,可以使用Instruments 的 instruments -s devices 命令可返回一个有效的设备的列表,如果设备为Andorid操作系统,可以使用adb devices 命令可返回一个有效的设备的列表。为确保在连接多个设备时连接到正确的 Android设备,请使用udid功能。 |
app | 本地绝对路径_或_远程 http URL 所指向的一个安装包(.ipa,.apk,或 .zip 文件)。Appium 将其安装到合适的设备上。请注意,如果指定了 appPackage 和 appActivity 参数,Android 则不需要此参数了。该参数也与 browserName 不兼容。 | /abs/path/to/my.apk 或 http://myapp.com/app.ipa |
browserName | 做自动化测试时使用的浏览器名字。 | 'Safari' 对应 iOS,'Chrome', 'Chromium', 或 'Browser' 则对应 Android |
newCommandTimeout | 用于客户端在退出或者结束 session 之前,Appium 等待客户端发送一条新命令所花费的时间(秒为单位) | 如:60 |
udid | 连接真机的唯一设备号。 对于Android,这是adb devices命令列出的设备名称 | 例如 1ae203187fc012g, emulator-5554 |
appPackage | 运行的 Android应用的包名(Android设备独有属性 ) | com.android.settings、com.android.calculator2 |
appActivity | Activity的名字是指从appPackage包中所要启动的Android acticity(Android设备独有属性 ) | MainActivity、 .Settings、.Calculator |
appName | 被测应用的名字,用于支持 iOS 9 以上系统的应用的自动化(iOS 设备独有属性 ) | 如 UICatalog |
使用Python设置Appium 服务器初始化参数,运行打开需要的APP,完整操作视频如下:
3、UI Automator
UI Automator是Android 4.3版本以上官方推出的安卓应用界面自动化测试框架,能够根据文本、控件id、坐标进行点击、长按、滑动、查找等操作,实现与人一致的手动操作逻辑,既可以做UI测试也可以做功能测试。
(1)Uiautomatorviewer
Uiautomatorviewer位于Android sdk/tools目录下,为一款布局查看器工具,可以扫描、分析Android设备上当前显示的UI组件属性信息,使用这些信息可以使测试更加精确。
点击
按钮,则可以获取真机或者模拟器当前应用程序界面的元素属性,点击左侧的界面元素(第1部分),则右侧则显示对应界面元素的界面结构(第2部分)和界面元素属性(第3部分),第3部分界面元素属性的具体含义如表2所示。
表2 Uiautomatorviewer获取的界面元素属性含义列表
属性 | 含义 |
index | 父目录下的第几个元素,以0开头 |
text | 显示在界面上的内容 |
resource_id | 该元素的id(如果开发不规范,此id有可能会不存在或多个相同) |
class | 元素的类型 |
package | apk的包名 |
content-desc | 描述信息 |
checkable | 元素特征:是否可选择 |
checked | 元素特征:当前是否已选中 |
clickable | 元素特征:是否可点击 |
enabled | 元素特征:元素是否可用 |
focusable | 元素特征:元素是否可以获取焦点 |
focused | 元素特征:元素是否获取焦点 |
scrollable | 元素特征:元素是否可以滚动 |
long-clickable | 元素特征:元素是否可以长按 |
password | 元素特征:元素是否密码框 |
selected | 元素特征:元素是否已选中 |
bounds边界 | 元素左上角和右下角的坐标(从屏幕最左侧和最上侧开始计算) |
(1)UI APIs
通过UI Automator API可以编写可靠的测试,无需了解目标应用的实现细节,常用的多个应用间捕获和操纵界面API组件有:
1) UICollection:枚举容器的界面元素,目的是为了计数,或者按可见文本或内容说明属性来定位子元素。
2)UIObject:表示设备上可见的界面元素。
3)UIScrollable:支持搜索可滚动界面容器中的项目。
4)UISelector:表示对设备上的一个或多个目标界面元素的查询。
5)Configurator:可让您设置用于运行 UI Automator 测试的关键参数。
(2)UI APIs
通过UI Automator API可以编写可靠的测试,无需了解目标应用的实现细节,常用的多个应用间捕获和操纵界面API组件有:
1) UICollection:枚举容器的界面元素,目的是为了计数,或者按可见文本或内容说明属性来定位子元素。
2)UIObject:表示设备上可见的界面元素。
3)UIScrollable:支持搜索可滚动界面容器中的项目。
4)UISelector:表示对设备上的一个或多个目标界面元素的查询。
5)Configurator:可让您设置用于运行 UI Automator 测试的关键参数。
4、界面元素操作
和Web系统自动化测试一样,APP自动化测试也需要对APP上的界面进行定位和操作,常见的界面元素操作如下所示。
(1)元素定位方法
可以通过ID定位(取resource-id的值)、className定位(取class的内容,不唯一)、xpath定位等方式定位,如点击模拟器自带的计算器上面的“7”按钮参考代码如下所示:
driver.find_element_by_id("com.android.calculator2:id/digit_7").click() #ID定位
driver.find_elements_by_class_name("android.widget.Button")[0].click() #className定位
driver.find_element_by_xpath("//android.support.v4.view.ViewPager/android.widget.LinearLayout/android.view.View[1]/android.widget.Button[1]").click() #xpath定位
(2)滑动
在的自动化测试过程中不可能只测试一个固定的有限界面,有的时候会遇到一些比较长的页面,这个时候就会用到滑动的操作,在appium中模拟用户滑动的操作需要使用Swipe方法,Swipe的使用格式如下所示:
driver.swipe(x1,y1,x2,y2,duration)
从坐标(x1,x2)滑动到坐标(x2,y2),duration非必填项,滑动时间(滑动时中间要加等待时间,不加等待时间容易出错,而且加等待时间的长短要掌握好,一般在200-1000毫秒之间应该差不多,自己调试几次感觉一下哪个时间比较稳,每个程序可能会有所差异)。注意:滑动的坐标不能超过屏幕的宽高。
(3)TouchAction
和ActionChains对PC端测试程序鼠标模拟的一系列操作类似,TouchAction可以模拟智能设备端的一系列手势操作,如滑动、长按、拖动等。其原理也和ActionChains类似,将一系列的动作放在一个链条中,然后将该链条传递给服务器,服务器接受到该链条后,解析各个动作,逐个执行,其常用的操作方法如下表所示。
表3 TouchAction常见方法列表
方法 | 描述 |
press(self,el=None,x=None,y=None) | 按压一个元素或坐标,el为要点击的元素,x/y为坐标 |
long_press(self,el=None,x=None,y=None,duration=1000) | 长按压一个元素或坐标,默认长按时间1000ms |
tap(self,element=None,x=None,y=None,count=1) | 对一个元素或控件执行点击操作 |
move_to(self,el=None,x=None,y=None) | 将指针从上一个点移动到指定的元素或点 |
wait(self,ms=0) | 等待时间,单位毫秒 |
release(self) | 释放,结束屏幕上的一系列动作的命令操作 |
perform(self) | 执行,将待执行的操作发送到服务器的命令操作 |
设置后的手势如下图所示。

完整操作视频如下:
(4)获取元素属性值
在自动化测试过程有个时候需要获取界面元素的各种属性值用于判断是否操作成功。如果对应元素有text属性,则可以直接使用text获取对应元素的值,也可以使用get_attribute方法获取。
5、APP应用操作
appium支持对智能设备上的app进行管理和操作,其常用方法如下表所示。
表7-2-4 Appium 操作APP常见方法列表
方法 | 描述 |
install_app(self,app_path,**options) | 安装app,app_path为安装包路径 |
remove_app(self,app_id,**options) | 卸载app,app_id为app包名 |
is_app_installed(self,bundle_id) | 检查app是否有安装bundle_id为app包名 |
launch_app(self) | 启动app,启动desiredcapabilities配置的APP |
close_app(self) | 关闭app,关闭desiredcapabilities配置的APP |
background_app(self,seconds) | 后台运行app,seconds为运行时长 |
activate_app(self,app_id) | 切换app,app_id为app包名 |
current_activity | 获取当前活跃的activity |
start_activity(self,app_package,app_activity,**opts) | 在当前应用中打开一个Activity,或者启动一个新应用并打开一个Activity,app_package为要启动Activity的包名,app_activity要启动的Activity名 |
reset(self) | 重置应用,删除应用相关数据操作 |
【任务实施】
使用unittest框架测试模拟器自带的计算器功能,计算“2+(7−3)×8”表达式:
1、打开计算器;
2、在输入框里面输入2;
3、点击“+”按钮;
4、向左滑动,可以看到隐藏的科学计算按钮;
5、点击“(”按钮;
6、向右滑动,将科学计算按钮面板隐藏;
7、点击“7”按钮;
8、点击“-”按钮;
9、点击“3”按钮;
10、向左滑动,可以看到隐藏的科学计算按钮
11、点击“)”按钮;
12、向右滑动,将科学计算按钮面板隐藏
13、点击“*”按钮;
14、点击“8”按钮;
15、点击“=”按钮;
16、获取输入框里面的值,使用断言判断表达式计算结果是否正确
完整操作视频如下:

