Appium+Python3+iOS定位元素

前言:

最近在作IOS自动化测试,IOS的Appium环境都配置OK,执行起来真的慢,慢到怀疑人生,那么今天就来总结一下IOS定位方式和各个定位方式的速度排序。ios


据我观察,按查找元素的顺序速度,从快到慢的顺序以下:git

ios_predicate >> accessibility_id >> class_name >>xpathgithub

注⚠️:(论坛比较多的说法是class_name>>accessibility_id,在这里咱们姑且认为它们的速度是同样的。)正则表达式


一、元素属性介绍

image.png

type:元素类型,与className做用一致,如:XCUIElementTypeButton
value: 通常不用
name:元素的文本内容,可用做 AccessibilityId定位方式,如:ClearEmail
label:绝大多数状况下,与 name 做用一致
enabled:元素是否可点击,通常值为true或者false
visible;元素是否可见,通常值为true或者false框架


二、ios_predicate

在 iOS 的 UI 自动化中,使用原生支持的Predicate定位方式是最好,可支持元素的单个属性和多个属性定位,强烈推荐使用。
使用方法,举例以下:测试

driver.find_element_by_ios_predicate("value == 'ClearEmail'")
driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")

1)比较运算符:>、<、==、>=、<=、!=
可用于数值和字符串的比较:
如:value>100value == 'ClearEmail'value != 'ClearEmail'3d

driver.find_element_by_ios_predicate("value>100")code

2)范围运算符:IN、BETWEEN
可用于数值和字符串的范围核对
如:value BETWEEN {1,6}value IN {'Clear','Email'}blog

driver.find_element_by_ios_predicate("value BETWEEN {1,6}")排序

3)字符串相关:CONTAINS、BEGINSWITH、ENDSWITH
包含某个字符串,如:value CONTAINS 'Email'
以某个字符串开头,如:value BEGINSWITH 'Clear'
以某个字符串结束,如:value ENDSWITH '班级Email'

driver.find_element_by_ios_predicate("value CONTAINS 'Email'")

4)通配符: LIKE
其中:?表明一个字符,*表明多个字符
如:一个元素的value属性为ClearEmail:
value LIKE 'Clear?mail'
value LIKE 'Clear*'
以上这么多种文本均可以被识别为同一个元素。

driver.find_element_by_ios_predicate("value LIKE 'Clear*'")

5)正则表达式:MATCHES
如:一个元素的value属性为ClearEmail:
value MATCHES '^C.+l$'

driver.find_element_by_ios_predicate("value MATCHES '^C.+l$'")

注⚠️:正则表达式详情可参考个人另外一篇文章《Python-正则表达式
6)两种及两种以上属性定位元素:AND
单个属性定位用符号AND链接起来便可,以下:

driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")


三、accessibility_id

替代之前的name定位方式,在 iOS 上,主要使用元素的labelname(两个属性的值都同样)属性进行定位,如该属性为空,也是不能使用该属性。
driver.find_element_by_accessibility_id('ClearEmail')


四、class_name

使用元素的type属性定位,特别注意该属性的惟一性!class_name惟一的状况并很少,通常状况下用不上。
driver.find_element_by_class_name('XCUIElementTypeButton')


五、xpath

因为 iOS 10开始使用的 XCUITest 框架原生不支持,定位速度很慢,因此官方如今不推荐你们使用,也有其余替代的定位方式可以使用。
1)使用绝对路径定位:
driver.find_element_by_xpath('/XCUIElementTypeApplication/XCUIElementTypeButton')
2)使用相对路径定位
driver.find_element_by_xpath('//XCUIElementTypeButton')
3)经过元素的索引定位
driver.find_element_by_xpath('//XCUIElementTypeButton[index]')
4.经过元素的属性定位
一种属性:
driver.find_element_by_xpath("//className[@value='ClearEmail']")
两种属性:
driver.find_element_by_xpath("//className[@value='ClearEmail'][@ visible =true]")
部分属性(最强大):driver.find_element_by_xpath("//className[contains(@value,'ClearEmail')]")


以上,对你有帮助的话,点赞❤️吧~~
欢迎关注个人简书,博客,TesterHome,Github~~~

相关文章
相关标签/搜索