移动手机自动化测试
- 4.1 Appium 介绍
- 4.2 Appium Library 库的使用
- 4.2.1 Open Application
- 4.2.2 Input Text 和 Click Element
- 4.2.3 Clear Text
- 4.2.4 Get Element Location
- 4.2.5 Get Current Context
- 4.2.6 Get Contexts
- 4.2.7 Switch To Context
- 4.2.8 Get Element Attribute
- 4.2.9 Get Network Connection Status 和 Set Network Connection Status
- 4.2.10 Element Attribute Should Match
- 4.2.11 Element Name Should Be 和 Element Value ShouldBe
- 4.2.16 AppiumLibrary 库其他的常见自动化关键字
4.1 Appium 介绍
Appium 是一个开源、跨平台的自动化测试工具,可以用来测试 Native 及混合的移动端应用,Appium 可以支持 IOS、Android 及 FirefoxOS 平台
Appium 为了实现自身提出的理念:“不必局限于某种语言或者框架来写/运行测试脚本,以及一个移动自动化的框架不应该在接口上重复造轮子”,它把 IOS、Android 等自身提供的第三方框架都封装成了一套 API,即 WebDriver
API.WebDriver(SeleniumWebDriver,Appium 对此进行了扩展)指定了客户端到服务端的协议,通过这种客户端/服务端的架构可以使用任何语言来编写客户端向服务端发送恰当的 HTTP 请求,只要 client 能够发送 http 请求给 server,那么 client 用什么语言来实现都是可以的,这就是 appium 及 webdriver 如何做到支持多语言的
Appium 的核心是一个 Web 服务器,提供了一套 REST 的接口,它收到客户端的连接,监听到命令,接着在移动设备上执行这些命令,然后将执行结果放在 HTTP 响应中返还给客户端
Appium 真正的工作引擎其实是第三方自动化框架:
- iOS:苹果的UIAutomation
- Android 4.2+:谷歌的UiAutomator
- Android 2.3+:谷歌的Instrumentation
- Instrumentation由单独的项目Selendroid提供支持。
4.1.1 Appium 中的常用术语
1. Session
Appium 自动化建立在一个 Session上 运行,客户端初始化一个 Session 来与服务端进行请求和交互,客户端会发送一个 POST 请求给服务端,请求中包含一个 JSON 对象,被称作 “desired Capabilities”,然后服务端就会开启一个自动化的 Session,并且返回一个 Session ID 给客户端,客户端的后续请求都会带上该 Session ID 给服务端做识别
2. Desired Capabilities
Desired Capabilities 是一些键值对的集合 (比如,一个 map 或者 hashmap),客户端将这些键值对发给服务端,告诉服务端需要怎么执行测试
比如,我们可以把 platformNamecapability 设置为 Android,告诉 Appium 服务端,我们想要一个 Android 的 Session,而不是一个 iOS 的;也可以设置 safariAllowPopupscapability 为 True,确保在 Safari 自动化 Session 中可以使用 JavaScript 来打开新窗口
3. Appium Server
Appium Server 是基于 Node.js 实现的,可以使用 NPM 直接安装
4.1.2 Appium 服务关键字
Appium 服务相关参数的说明
4.2 Appium Library 库的使用
安装:
pip install robotframework-appiumlibrary
4.2.1 Open Application
在 AppiumLibrary 库中,Open Application
关键字用来打开一个待测试移动 APP
- 欲了解 Appium 服务的搭建步骤,请查阅我的另一篇博文:Android APP 自动化测试搭建:Appium + Genymotion + [Robot Framework] Open Application
Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=9.0 deviceName=127.0.0.1:5555 app=/Users/chengrui/Documents/TestData/alipay_wap_main.apk appPackage=com.eg.android.AlipayGphone appActivity=com.eg.android.AlipayGphone.AlipayLogin
- 连接本机已经打开的 Appium 服务端,打开待测试的支付宝 APP,指定测试平台为 Android,测试的手机 deviceName 为127.0.0.1:5555 ,需要打开的APP路径为 /Users/chengrui/Documents/TestData/alipay_wap_main.apk,APP 的包名为 com.eg.android.AlipayGphone,启动的 appActivity 为 com.eg.android.AlipayGphone.AlipayLogin
4.2.2 Input Text 和 Click Element
我们可以使用安卓 SDK 提供的 UI Automator Viewer 工具来进行特定界面的资源定位或 Log Source
关键字获取页面元素信息以获得 locator
也可以通过 xpath 的方式定位元素:
另外,还可以通过 accessibility_id 的方式定位元素,accessibility_id 对应到安卓 APP 后,其对应的属性为 content-desc
Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=22 deviceName=98YFBP522VSU app=C:/Users/yongqing/Desktop/app-debug.apk appPackage=com.example.calculator appActivity=MainActivity
Input Text accessibility_id=输入框 23
Input Text id=com.example.calculator:id/factortwo 12
Click Button 计算
执行结果如下:
Starting test: RobotFrameworkTest1.TestSuite5.TestCase006
20170510 14:23:09.735 : INFO : Typing text '23' into text field 'accessibility_id=
输入框'
20170510 14:23:09.735 : INFO : msg:find accessibility_id=输入框
20170510 14:23:16.573 : INFO : Typing text '12' into text field
'id=com.example.calculator:id/factortwo'
20170510 14:23:16.573 : INFO : msg:find id=com.example.calculator:id/factortwo
20170510 14:23:22.799 : INFO : '计算'.
20170510 14:23:22.901 : INFO : Clicking element '计算'.
Ending test: RobotFrameworkTest1.TestSuite5.TestCase006
4.2.3 Clear Text
Clear Text
关键字用来清除输入框的数据,接收一个参数[ locator ],这里的 locator 指的就是界面元素的定位方式
4.2.4 Get Element Location
Get Element Location
关键字用来获取一个 Element 的 Location 位置,接收一个参数[ locator ]
4.2.5 Get Current Context
Get Current Context
关键字用于获取当前的上下文,不需要接收任何参数
4.2.6 Get Contexts
Get Contexts
关键字用于获取当前所有的上下文,不需要接收任何参数
4.2.7 Switch To Context
Switch To Context
关键字用来在多个 Context 之间进行切换,接收[context_name ]一个参数
我们在手机端经常会调用到 H5 页面,并且会在页面中做切换,它就可以帮助我们完成页面的切换操作
通过上面讲到的 Get Contexts
关键字可以获取到所有的 Context,然后执行此关键字就可以直接做切换了
4.2.8 Get Element Attribute
Get Element Attribute
关键字用来获取某个元素的属性值,接收[locator |attribute]两个参数
- 当匹配到了多个元素时默认只会使用第一个元素
4.2.9 Get Network Connection Status 和 Set Network Connection Status
Get Network Connection Status
关键字用来获取手机的网络连接状态
在获取到连接状态后,会返回不同的数字
Set Network Connection Status
关键字用来设置手机的网络连接状态
4.2.10 Element Attribute Should Match
Element Attribute Should Match
关键字用来判断元素的属性值是否和预期值匹配,接收[ locator | attr_name | match_pattern | regexp=False ]四个参数
- 当通过 locator 识别到元素超过1个元素时,会默认选择第一个元素 attr_name 参数代表所选元素的属性的名称
- match_pattern 参数代表预期匹配值
- regexp 代表了匹配时是否通过正则表达式来进行匹配
4.2.11 Element Name Should Be 和 Element Value ShouldBe
这是两个断言关键字,对元素 Element 的 name 和 value 的值进行直接断言处理
Element Name Should Be
关键字用来断言指定元素的名称是否和预期的一致,接收[ locator| expected ]两个参数
Element Value Should Be
关键字用来断言指定元素的 value 值是否和预期的一致,接收[ locator | expected ]两个参数
4.2.16 AppiumLibrary 库其他的常见自动化关键字