在iOS APP自动化测试中,最基本的操作就是元素定位了。与Android APP自动化测试一样,iOS也支持 ( XCUITest 或 UIAutomation测试框架) 使用属性值定位,比如id、className等元素属性,然而,有时候属性值并不是唯一的,appium、facebook-wda等框架也封装了XPath定位方法,使用XPath和属性值定位方法基本可以定位到99%的元素。但是在性能方面,XPath的定位速度相对较慢,我们可以选择iOS特有的定位策略: predicate 和 class chain定位方法。本文介绍predicate定位方法, class chain定位将在下一篇文章中介绍。
Predicate语法
Predicate定位是iOS原生支持的定位方式,定位速度比较快,它可以通过使用多个匹配条件来准确定位某一个或某一组元素。
基本比较
符号 | 说明 | 示例 |
---|---|---|
= , == | 等于 | name == “通知” |
> | 大于 | name > 10 |
< | 小于 | name < 10 |
>= , => | 大于等于 | name >= 10 |
<= , =< | 小于等于 | name <= 10 |
!= , <> | 不等于 | name != “通知” |
集合操作
符号 | 说明 | 示例 |
---|---|---|
ANY , SOME | 满足表达式的任意元素 | ANY children.age < 18 |
ALL | 满足表达式的所有元素 | ALL children.age < 18 |
NONE | 不包含满足表达式的任意元素 | NONE children.age < 18 |
IN | 元素在集合中 | name IN { ‘Ben’, ‘Melissa’, ‘Nick’ } |
BETWEEN | 位于某个范围 | 1 BETWEEN { 0 , 33 } |
array[index] | 数组array中指定索引的元素 | |
array[FIRST] | 数组中的第一个元素 | |
array[LAST] | 数组中的最后一个元素 | |
array[SIZE] | 指定数组大小 |
布尔值
符号 | 说明 | 示例 |
---|---|---|
TRUEPREDICATE | TRUE | |
FALSEPREDICATE | FALSE |
逻辑运算符
符号 | 说明 | 示例 |
---|---|---|
AND , && | 逻辑与 | name="通知" AND label="通知" |
OR , || | 逻辑或 | |
NOT , ! | 逻辑非 |
字符串比较
关键字 | 说明 | 示例 |
---|---|---|
BEGINSWITH | 以某个字符串开始 | name BEGINSWITH "屏幕" |
ENDSWITH | 以某个字符串结束 | name ENDSWITH "时间" |
CONTAINS | 包含 | name CONTAINS "使用时间" |
LIKE | 通配符 | name LIKE '*Total: $*' |
MATCHES | 正则匹配 | value MATCHES '.*of 7' |
默认情况下,字符串比较是大小写和变音敏感的,可以在关键字后面加上[cd]
,[c]
不区分大小写,[d]
表示不区分变音符号。
变音符号是附加在字母上的符号,用于提示发音或区分相似的单词。很多语言使用变音符,比如法语、西班牙语等。比如法语单词:Pêche 桃子
Predicate定位示例
使用facebook-wda进行元素操作示例:
s = c.session('com.apple.Preferences') # 打开设置
s(predicate='name == "通知"').click()
s(predicate='name IN {"通知"}').click()
s(predicate='name="通知" AND label="通知"').click()
s(predicate='name BEGINSWITH "屏幕"').click() # 点击屏幕使用时间
s(predicate='name ENDSWITH "时间"').click()
s(predicate='name CONTAINS "使用时间"').click()
s(predicate='name LIKE "*使用*"').click()
s(predicate='name MATCHES ".*使用时间$"').click()
s(predicate='name MATCHES "^屏幕.*"').click()
s(predicate='name CONTAINS[c] "apple"').click()
s(predicate='visible==true AND name ENDSWITH "时间"').click()
参考文档:
- http://appium.io/docs/cn/writing-running-appium/ios/ios-predicate/
- https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html
系列文章
1、Appium 介绍及环境安装
2、selenium/appium 等待方式介绍
3、App控件定位:Android 控件介绍及元素定位方法
4、Appium元素定位(一)
5、Appium元素定位(二):UiAutomator定位
6、Appium控件交互
7、Android WebView测试
8、AppCrawler自动遍历测试
9、自动遍历测试之Monkey工具
10、App自动化测试工具Uiautomator2
11、App自动化测试工具Airtest
12、Android手机管理平台搭建:STF和atxserver2
13、Windows上实现iOS APP自动化测试:tidevice + WDA + facebook-wda / appium
14、iOS APP自动化:predicate定位
15、iOS APP自动化:class chain定位方法
16、使用facebook-wda进行iOS APP自动化测试