1. 设置Desired Capabilities
在开始前,您可以点击下载本章所有测试相关文件。
开始第一步,创建一个文件,名为:desired_capabilities.py。内容如下:
- [backcolor=transparent]#!/usr/bin/env python
- [backcolor=transparent]def[backcolor=transparent] get_desired_capabilities[backcolor=transparent]():
- [backcolor=transparent] desired_caps [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]'platformName'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'Android'[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]'platformVersion'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'4.0.4'[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]'deviceName'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'V889F'[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]'appPackage'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'com.alibaba.mts.mtsdemoapp'[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]'appWaitPackage'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'com.alibaba.mts.mtsdemoapp'[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]'app'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'D:/home/mdp/result/GroovyTest/case1/task.apk'[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]'newCommandTimeout'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]30[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]'automationName'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'Appium'
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] desired_caps
- [backcolor=transparent]def[backcolor=transparent] get_uri[backcolor=transparent]():
- [backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]"http://localhost:50000/wd/hub"
里面包含两个函数:get_desired_capabilities()和get_uri()。
a. get_uri()
返回Appium Server的地址,比如这里我们在本地启动的Appium Server,并且设置默认监听端口为50000,得到的地址是http://localhost:50000/wd/hub
b. get_desired_capabilities()
获取本次会话的参数。这里主要设置了8个参数。用户可以根据自己的需求进行调整。
platformName,我们测试的目标机器。
platformVersion,测试目标设备的系统版本。
deviceName,测试机器的名称(设备名称即可)。
appPackage,被测应用的包名(只有Android测试才用)。
appWaitPackage,测试时会等待(只有Android测试才用)。
app,被测应用文件的所在位置
newCommandTimeout,两条指令的最长时间间隔。如果超过这个间隔,Appium Server将会终止本次会话。
automationName,本次会话所使用的自动化引擎。Android 4.2以下系统请使用Selendroid;IOS、Android 4.2以上(含)请使用Appium。
更多的选项,请参见capabilities文档
2. 编写测试用例
MQC会执行用户上传的main.py,所以要创建这个入口脚本:main.py。我们以一个登录的脚本main.py作为例子进行说明,代码如下:
- [backcolor=transparent]# -*- coding: utf-8 -*-
- [backcolor=transparent]from[backcolor=transparent] appium [backcolor=transparent]import[backcolor=transparent] webdriver
- [backcolor=transparent]# 引入刚刚创建的同目录下的desired_capabilities.py
- [backcolor=transparent]import[backcolor=transparent] desired_capabilities
- [backcolor=transparent]# 我们使用python的unittest作为单元测试工具
- [backcolor=transparent]from[backcolor=transparent] unittest [backcolor=transparent]import[backcolor=transparent] [backcolor=transparent]TestCase
- [backcolor=transparent]# 我们使用python的unittest作为单元测试工具
- [backcolor=transparent]import[backcolor=transparent] unittest
- [backcolor=transparent]# 使用time.sleep(xx)函数进行等待
- [backcolor=transparent]import[backcolor=transparent] time
- [backcolor=transparent]class[backcolor=transparent] [backcolor=transparent]MqcTest[backcolor=transparent]([backcolor=transparent]TestCase[backcolor=transparent]):
- [backcolor=transparent] [backcolor=transparent]global[backcolor=transparent] automationName
- [backcolor=transparent] [backcolor=transparent]def[backcolor=transparent] setUp[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):
- [backcolor=transparent] [backcolor=transparent]# 获取我们设定的capabilities,通知Appium Server创建相应的会话。
- [backcolor=transparent] desired_caps [backcolor=transparent]=[backcolor=transparent] desired_capabilities[backcolor=transparent].[backcolor=transparent]get_desired_capabilities[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]# 获取server的地址。
- [backcolor=transparent] uri [backcolor=transparent]=[backcolor=transparent] desired_capabilities[backcolor=transparent].[backcolor=transparent]get_uri[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]# 获取使用的测试框架
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]automationName [backcolor=transparent]=[backcolor=transparent] desired_caps[backcolor=transparent].[backcolor=transparent]get[backcolor=transparent]([backcolor=transparent]'automationName'[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]# 创建会话,得到driver对象,driver对象封装了所有的设备操作。下面会具体讲。
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver [backcolor=transparent]=[backcolor=transparent] webdriver[backcolor=transparent].[backcolor=transparent]Remote[backcolor=transparent]([backcolor=transparent]uri[backcolor=transparent],[backcolor=transparent] desired_caps[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]def[backcolor=transparent] test_searchbox[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):
- [backcolor=transparent] [backcolor=transparent]# 找到包含”Tab4”字符串的控件。
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]automationName [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]'Appium'[backcolor=transparent]:
- [backcolor=transparent] tab4 [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_element_by_name[backcolor=transparent]([backcolor=transparent]"Tab4"[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]else[backcolor=transparent]:
- [backcolor=transparent] tab4 [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_element_by_link_text[backcolor=transparent]([backcolor=transparent]"Tab4"[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]# 点击.
- [backcolor=transparent] tab4[backcolor=transparent].[backcolor=transparent]click[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]# 等待2秒钟
- [backcolor=transparent] time[backcolor=transparent].[backcolor=transparent]sleep[backcolor=transparent]([backcolor=transparent]2[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]# 通过控件类名找到用户名和密码输入框。
- [backcolor=transparent] editTexts [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_elements_by_class_name[backcolor=transparent]([backcolor=transparent]"android.widget.EditText"[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]# 第一个框为用户名输入框,输入用户名;第二个框为密码框,输入密码
- [backcolor=transparent] editTexts[backcolor=transparent][[backcolor=transparent]0[backcolor=transparent]].[backcolor=transparent]send_keys[backcolor=transparent]([backcolor=transparent]"admin"[backcolor=transparent])
- [backcolor=transparent] editTexts[backcolor=transparent][[backcolor=transparent]1[backcolor=transparent]].[backcolor=transparent]send_keys[backcolor=transparent]([backcolor=transparent]"admin"[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]# 隐藏出现的软键盘
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]hide_keyboard[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]# 找到包含“登录”的按钮并点击
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]automationName [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]'Appium'[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_element_by_name[backcolor=transparent]([backcolor=transparent]"登陆"[backcolor=transparent]).[backcolor=transparent]click[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]else[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_element_by_link_text[backcolor=transparent]([backcolor=transparent]"登陆"[backcolor=transparent]).[backcolor=transparent]click[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]# 等待3秒钟,登录需要与服务器通讯。
- [backcolor=transparent] time[backcolor=transparent].[backcolor=transparent]sleep[backcolor=transparent]([backcolor=transparent]3[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]def[backcolor=transparent] tearDown[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):[backcolor=transparent]
- [backcolor=transparent] [backcolor=transparent]# 测试结束,退出会话。
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]quit[backcolor=transparent]()
几种查找控件的方法(在类By下):
ID : 通过resource-id查找。注意,测试Android应用时,Appium引擎和Selendroid引擎的id写法不同,Appium下类似这样:com.alibaba.mts.mtsdemoapp:id/login_login_button;而Selendroid下id是:login_login_button。所以,如果要写通用的脚本,建议使用其他查找方式。
XPATH : 通过xpath寻找。例如查找一个包含“Add note”字符串的TextView控件:driver.findElement(By.XPATH, "//android.widget.TextView[contains(@text,'Add note')]")。点击查看更多XPATH语法。
LINK_TEXT : (不支持Android 4.2.1以下)通过控件的文本文字查找,比如:driver.findElement(By.LINK_TEXT, “登录”),找到控件文字为“登录”控件。注意,它不会匹配“登录吧”、“快登录”等文字。建议使用下面的“PARTIAL_LINK_TEXT”。
PARTIAL_LINK_TEXT : (不支持Android 4.2.1以下)类似LINK_TEXT,但是可以匹配“登录吧”、“快登录”等文本的控件。只要包含“登录”即可。
NAME : 与ACCESSIBILITY_ID相同,通过content description查找。content description是为生理缺陷的人使用的,比如色盲人员看不清图片,可以通过TalkBack等软件朗读content description的内容。
TAG_NAME : 通过控件类名查找,比如EditText、Button等等。
CLASS_NAME : 通过控件全类名查找,比如android.widget.EditText 、android.widget.Button等。
CSS_SELECTOR : 只用于Hybird APP,通过CSS选择器,查找WebView中的HTML控件。
ACCESSIBILITY_ID : 同NAME。
更多示例请参考:hybird app查找方法、native app查找方法。
关于支持操作:
Appium支持滑动、点击、输入、安装、启动等方法,请参考详细文档。
3. 启动Appium Server
在本地的命令行中执行命令:
appium –p 50000
启动参数释义:
“-p”: 指定appium server监听的端口号。
“-a”: 指定appium server的ip地址。
“-selendroid-port”: selendroid模式下,adb forward的端口。
“-U”: 当挂载多个设备时,可以通过此参数指定某个设备的串号,这样Appium server就可以知道是要在这个设备上进行测试。
“--full-reset”: 如果加上此参数,设备每个case完成时都会对设备进行完全的清理。
4. 执行测试用例
在命令行中执行命令:
python -m unittest main
其中main就是我们刚刚创建的测试用例:main.py
5. 提交到MQC云平台
本地测试通过之后,将所有测试文件打包成zip文件,然后在”Android功能测试”里,提交被测应用和打包后的脚本ZIP包。
注意,目前只支持一个main.py作为testsuite,并且请使用unittest作为用例测试工具。更多问题,请到我们的旺旺交流群(群号:335334143)中反馈。