今天要给大家分享的是对元素的定位,在一个页面中有很多不同的策略来定位一个元素,我们选择最合适的方法即可。
一个页面最基本组成单元是元素,想要定位一个元素,我们需要特定的信息来说明这个元素的唯一特征。
? iOS自动化元素查找工具,我使用的是Appium的inspector。最新版的appium自动展示多种元素定位表达式,还可以查看每种定位表达式的执行效率。
?
type | 元素类型,与className作用一致,如:XCUIElementTypeButton |
value | 一般不用 |
name | 元素的文本内容,可用作 AccessibilityId定位方式,如:ClearEmail |
label | 绝大多数情况下,与 name 作用一致 |
enabled | 元素是否可点击,一般值为true或者false |
visible | 元素是否可见,一般值为true或者false |
? Appium的inspector功能中,选择某个元素后在“selected Element”中会展示多个定位表达式,而且点击定位表达式后面的“Get Timing”,可以显示每个定位表达式的执行时间。
?
? iOS自动化测试元素定位的accessibility_id主要使用元素的label或name(两个属性的值都一样)属性进行定位。
? 例如:第一张截图中label或name都是“我的功能”
driver.find_element_by_accessibility_id("我的功能") driver.find_element(MobileBy.ACCESSIBILITY_ID, "我的功能")
class_name定位方法使用元素的type属性,type属性表示控件类型,一般不具有唯一性,因此class_name不常用。
? 例如:type属性为:XCUIElementTypeButton
driver.find_element_by_class_name("XCUIElementTypeButton") driver.find_element(MobileBy.CLASS_NAME, "XCUIElementTypeButton")
? Appium对app原生环境的xpath定位方法执行效率很低,从iOS 10开始使用的 XCUITest 框架原生不支持,定位速度很慢,官方不推荐这种方式。但是在实际使用中,当其他定位方式都不能找到元素时,可以尝试xpath定位。
?例如:第一张截图中“我的功能”定位
driver.find_element_by_xpath("//XCUIElementTypeStaticText[@name='我的功能']") driver.find_element(MobileBy.XPATH, "//XCUIElementTypeStaticText[@name='我的功能']")
?
? ios_class_chain仅支持iOS 10或以上,且仅限于WebDriverAgent 框架中使用。此方法用于替代xpath,但该方法还有待完善,没有纳入官方文档。
?Github说明地址:https://github.com/appium/appium-xcuitest-driver
? 例如:第一张截图中“我的功能”定位
driver.find_element_by_ios_class_chain('**/XCUIElementTypeStaticText[`label == "我的功能"`]') driver.find_element(MobileBy.IOS_CLASS_CHAIN, '**/XCUIElementTypeStaticText[`label == "我的功能"`]')
? iOS Predicate 即谓词逻辑。ios_predicate定位方法支持iOS所有的版本,也就是能适配XCUITest 和 UIAutomation底层测试框架,使用的就是iOS编程语言,因此可以把此方法作为首选定位方式。
? 谓词表达式由属性、运算符和值构成。
? ?1.1、常用的属性
? ?在上面的表格中已经介绍,可以使用的元素属性:type、value、name、label、enabled、visible
? ?1.2、运算符
? ?1.2.1、比较运算符
比较运算符 | >, <, ==, >=, <=, != |
? ?可用于数值和字符串的比较,如:label == ‘我的功能’,label >= 500
? ?示例:
driver.find_element_by_ios_predicate("label == '我的功能'") driver.find_element(MobileBy.IOS_PREDICATE, "label == '我的功能'") driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")
? ?1.2.2、范围运算符
? ?常用的范围运算符有:
范围运算符 | 说明 | 实例 |
IN | 用于字符串的范围核对 | name IN {'Alan','May'} |
BETWEEN | 用于数值的范围核对 |
|
??示例:
driver.find_element(MobileBy.IOS_PREDICATE, "name IN {'id_cell', 'id_alert'}") driver.find_element_by_ios_predicate("value BETWEEN {5, 7}")
? ?1.2.3、字符串相关
字符串相关 运算符 | 说明 |
CONTAINS | 表示包含某个字符串 |
BEGINSWITH | 表示以某个字符串开头 |
ENDSWITH | 表示以某个字符串结束 |
?
?以字符串“自动化软件测试”为例:
??扩展:在三个关键字后加上[c]、或者[d]、[cd]
[c]:表示不区分大小写,可用于字母的校验;
[d]:不区分发音符号,即没有重音符号($、#等);
[cd]:既不区分大小写,也不区分发音符号;
? ?例如:name CONTAINS[c] ABcd 和 ?name CONTAINS abcd是等同的
? ?示例:
driver.find_element_by_ios_predicate("label CONTAINS ‘软件’")
? 1.2.4、模糊匹配:LIKE
? ?模糊匹配也可以称为通配符匹配,?代表一个字符,*代表多个字符。
? ?示例:现有元素的label属性:“自动化软件测试”
? ?label LIKE ‘自动化软件测试’ ? # 完全匹配
? ?label LIKE ‘自动化?件测试’ ? ?# ? 匹配一个字符
? ?label LIKE ‘自动化??测试’ ? ?# 两个?号匹配两个字符
? ?label LIKE ‘自?化?件测试’
? ?label LIKE ‘*软件测试’ ? ? ?# *代表多个字符
? ?label LIKE ‘自动化软件*’
? ?label LIKE ‘自动化*件测*’
? ?示例:
driver.find_element(MobileBy.IOS_PREDICATE, "label LIKE ‘*软件测试")
1.2.5、逻辑运算符
逻辑运算符 | 说明 | 实例 |
AND | 逻辑与:必须同时满足所有条件 | type == XCUIElementTypeStaticText AND label CONTAINS '测试 |
&& | type == XCUIElementTypeStaticText && label CONTAINS '测试 |
OR | 逻辑或:只需要满足一个条件即可 | enabled == true OR visible == false |
|| | enabled == true || visible == false |
NOT | 逻辑非:取反 | |
! |
?
?
??1.2.6、正则表达式:MATCHES
? ?以字符串的匹配为例:匹配字符串“自动化软件测试”,以“自”开头,然后以“试”结尾。
? ?表达式:label MATCHES ‘^自.+试$’
? ?示例:
driver.find_element(MobileBy.IOS_PREDICATE, " label MATCHES ‘^自.+试$’")
? ? 符号说明:?^??匹配字符串的开头
? ?.? ?匹配任意字符,除了换行符
? ? ? ? ? ?+??匹配 1 个或多个的表达式。
? ? ? ? ? ?$??匹配字符串的末尾
?
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取?
?