在没有重新安装系统以前我用的appium1.4.X,现在用了1.5.3,我把在1.4.X上运行成功的用例在1.5.3上运行。结果报错。说find_element_by_name 已经不支持了。
马上百度,网上的确说appium已经把这个借口给关闭了。然后只能只能用xpath去定为,效果不是很好,网上查询了下资料,因为appium是去打开instruments,所以提供了一个元素的定位方式是find_element_by_i0s_uiautomation。这个定位方式会很快的去定位元素,相对比xpath 快速有效。
但是定位的规则是什么呢?开始的时候我查看了网上别人贴出来的资料和经验。但是还是不知道怎么去定位,因为定位的命名不知道怎么去写。
大家如果熟悉instruments中的automation的话,那么这个就很简单了。如果不会,建议去学一下,估计10分钟就能录制脚本,我们只需要拿到元素定位的信息就可以了。脚本是否能跑起来就不去关心了。
比如xpath中
//UIATableView/UIATableCell/UIAStaticText
在i0s_uiautomation中
.tableViews()[0].cells()[0].staticTexts()[0]
.tableViews().firstWithPredicate("value like 'rows 1 to 2 of 7'").cells()["精选"].buttons()["查询更多"]
上面两种写法定位到的元素是一样的,但是因为用了匹配查找,就算将来位置又变动,也可能用匹配查找定位到,用过xpath定位的知道写死的定位,只要稍有调整,脚本需要全部重新写,那种工作量可大可小,但是总的来说没有利。
automation也提供了一种查询方式就是语法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
总结xpath 和 i0s_uiautomation之间的对照。
1.UIATableView : tableViews()
2.UIATableCell :cells()
3.UIAStaticText : staticTexts()
4.UIAButton : buttons()
5. :textFields()
6.:alert()
7.:switches()
8.:sliders()
10 月25日
今天第一次在实战中用predicate,以为很简单,其实还是遇上一个坑。
用automation 拿到了定位语句
.staticTexts().firstWithPredicate("value like '登录后,马上添加感兴趣的栏目到这里'")
按照平时的写法应该是
elem = driver.find_element_by_os_uiautomation(".staticTexts().firstWithPredicate("value like '登录后,马上添加感兴趣的栏目到这里'")")
由于python的语法,不认识“”中再使用“”
经过一阵调试后才跑通了,请看下面我写的列子
elem = driver.find_element_by_ios_uiautomation(".staticTexts().firstWithPredicate("+'"'+"value BEGINSWITH '登录后'"+'"'+")")是使用+ 把“拼接到定位语句中的。
另外这里用到了 beginswith 因为我怕以后万一这里显示的提示文字需要修改,但是前面几个字修改的可能很小,于是就用模糊匹配进行查找。