基于 Python 语言的 appium API 的使用。
1. Desired Capabilities
appium 在启动 session 时,需要提供 Desired Capabilities。Desired Capabilities 本质上是字典对象,由客户端生成并发送给服务器(appium Desktop),告诉服务器 App 运行的环境。
Desired Capabilities 的基本配置:
from appium import webdriver
# 定义 Android 运行环境
desired_caps = {
'deviceName': 'Android Emulator',
'automationName': 'appium',
'platformName': 'Android',
'platformVersion': '7.0',
'appPackage': 'com.android.calculator2',
'appActivity': '.Calculator',
'noReset': True,
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_capabilities=desired_caps)
...
各配置含义如下:
- deviceName:启动的设备、真机或模拟器,如 iPhone Simulator、Android Emulator、Galaxy S4 等。
- automationName:使用的自动化引擎,如 appium(默认)或 Selendroid(兼容 Android API 17 以下)。
- platformName:使用的移动平台,如 iOS 或 Android。
- platformVersion:指定平台的系统版本,如 Android 平台,版本为 7.0。
- appPackage:被测试 App 的 Package 名,如 com.android.settings 等。
- appActivity:被测试 App 的 Activity 名,如 Calculator、MainActivity、.Settings 等。
- noReset:在会话前重置应用状态。当设置为 True 时,会跳过安装指引;默认为 false。
更多配置说明可参考官方文档:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
获取 appPackage 和 appActivity 的方法
appium 在启动 App 时必须要设置 appPackage 和 appActivity 两个参数。最简单的方式是直接询问开发人员~还可以通过以下两种方式得到这两个参数。
a.通过 adb 工具抓取日志进行分析
命令行窗口运行命令:adb logcat > D:/log.txt
,将 adb 抓取的日志写入指定文件中。
在 Android 模拟器设备打开要测试的 App,做一些操作,命令行窗口快捷键 Ctrl+c 结束日志的捕捉。
打开 log.txt 文件,搜索 Displayed 关键字,查找 App 的 Package 和 Activity。此处 Package 是 com.android.calculator2
,Activity 是 .Calculator
。
b. 通过 appt 查看信息
aapt 即 Android Asset Packaging Tool,在 SDK 的 build-tools 目录下。需要将该目录加入到系统变量 Path 中。该工具既可以查看、创建、更新 zip 格式的文档附件(zip、jar、apk),也可以将资源文件编译成二进制文件。
命令行窗口执行命令:aapt dump badging D:\ChromeDownload\qqlite_4.0.2.1075_537067759.apk
此处 Package 是 com.tencent.qqlite
,Activity 是 com.tencent.mobileqq.activity.SplashActivity
。
2. 控件定位
对 UI 自动化测试来说,关键就是定位元素或控件。
appium 继承了 Selenium 的定位方法,并在其基础上进行了扩展,以适应移动端控件的定位。
appium 扩展的定位方法如下:
- ios_uiautomation:find_element_by_ios_uiautomation()
- ios_predicate:ind_element_by_ios_predicate()
- ios_class_chain:find_element_by_ios_class_chain()
- android_uiautomator:find_element_by_android_uiautomator()
- android_viewtag:find_element_by_android_viewtag()
- android_datamatcher:find_element_by_android_data_matcher()
- accessibility_id:find_element_by_accessibility_id()
- image:find_element_by_image()
- custom:find_element_by_custom()
可以借助 Android SDK 自带的 UI Automator Viewer 工具对 Android 设备式模拟器中的控件进行定位。该工具在 SDK安装目录下的 tools/bin 下,直接双击 uiautomatorviewer.bat 文件启动,或者将该目录加入到系统变量 Path 中,命令行执行命令 uiautomatorviewer 启动。
UI Automator Viewer 界面,单击 Device Screenshot 按钮之后,进入 Android 设备或模拟器的当前界面。UI Automator Viewer 捕获到该界面,并显示相应信息。
(1)id 定位
id 定位是使用控件的 resource-id 进行定位的。当 Android 设备或模拟器的 Android 系统 API 版本低于 18 (也就是 Android 系统低于4.3)时,UI Automator Viewer 工具无法获取对应的 resource-id。
resource-id 使用方法:
driver.find_element_by_id("com.android.calculator2:id/op_mul")
(2)Class Name 定位
Class Name 定位是使用控件的 class 属性进行定位的。
计算器界面上的所有按钮的 class 属性都为 android.widget.Button。属性的重复性很高。我们可以先定位一组控件,再进一步筛选。除非其他方法都无法定位到控件,否则不考虑使用这种方法,效率低。
from appium import webdriver
desired_caps = {
'deviceName': 'Android Emulator',
'automationName': 'appium',
'platformName': 'Android',
'platformVersion': '7.0',