在做ios自动化测试项目过程中遇到测试运行非常缓慢,一直在考虑怎么优化下测试运行速度。经过不断的search和debug,发现还是使用ios的uiautomation的原生查找元素方法还是比较快的,后面把项目中用到xpath等查找方式都替换-ios uiautomation,测试运行速度大大提高。网上关于-ios uiautomation方式查找的资料挺少的,特地mark下,以免以后忘了。
一、predicate的基本语法:
(1)比较运算符>,<,==,>=,<=,!=
可用于数值及字符串
例:@"number > 100"
(2)范围运算符:IN、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','beijing'}"
(3)字符串本身:SELF
例:@“SELF == ‘APPLE’"
(4)字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例:@"name CONTAIN[cd] 'ang'" //包含某个字符串
@"name BEGINSWITH[c] 'sh'" //以某个字符串开头
@"name ENDSWITH[d] 'ang'" //以某个字符串结束
注:[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。
(5)通配符:LIKE
例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er*'"
(6)正则表达式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A开头,e结尾
@"name MATCHES %@",regex
二、应用
我们要找到上图中“周一001”名称的元素用-ios uiautomation方式该怎么找呢?我们以python为例的多种方法去查找
1、精确查找 .tableViews()[0].cells()[0].staticTexts()[5]
2、用withpredicate精确查找 .tableViews()[0].cells()[0].staticTexts().withPredicate("name == '周一001'")
3、用withpredicate模糊查找 .tableViews()[0].cells()[0].staticTexts().withPredicate("name CONTAINS '周一'")
4、用withpredicate模糊查找 .tableViews()[0].cells()[0].staticTexts().withPredicate("name BEGINSWITH '周'")
5、用withpredicate模糊查找 .tableViews()[0].cells()[0].staticTexts().withPredicate("name LIKE '周*'")
…………
使用firstWithPredicate和withPredicate关键字可以模糊匹配到元素,完全可以替代xpath慢查找的方式。
参考资料:http://appium.io/slate/en/master/?python#ios-predicate
https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/