文章目录
1. 元素属性介绍
下图是通过weditor定位的微博的“我的钱包”,各属性如下图:
- className:元素类型,如:XCUIElementTypeButton
- isEnabled:元素是否可点击,一般值为1或者0
- isVisible:元素是否可见,一般值为1或者0
- value: 一般不用
- label:绝大多数情况下,与 name 作用一致
- name:元素的文本内容,可用作 AccessibilityId定位方式
- xpath: 元素的绝对路径,可用作Xpath定位方式
2. IOS的几种元素定位方法
- ios_predicate(推荐优先使用,详细介绍见3.1)
- accessibility_id(推荐使用,对应name属性)
- class_name (不推荐使用,对应className属性)
- xpath(推荐使用)
- ios_uiautomation(目前没用过)
- ios_class_chain(目前没用过,不介绍)
具体参考appium.webdriver.common.mobileby文件。文件内容:
3. 元素定位方法详解
3.1 IOS_PREDICATE
推荐优先使用。仅支持 iOS 10或以上,可支持元素的单个属性和多个属性定位。具体 iOSNsPredicate语法结构可查看官方文档。
使用方法:
# 一个属性定位‘我的钱包’
driver.find_element_by_ios_predicate("label == '我的钱包')
# 两个属性定位‘我的钱包’
driver.find_element_by_ios_predicate("label == '我的钱包' AND name == 'WBPageDiscoverSubGirdView')
上面两个例子用的都是完全匹配(==),还可以用不完全匹配(如:CONTAINS、LIKE)的语法结构,具体可参考https://testerhome.com/topics/9405
3.2 ACCESSIBILITY_ID
推荐使用。替代以前的name定位方式。
在 Android 上,主要使用元素的content-desc属性,如该属性为空,不能使用此定位方式。
在 iOS 上,主要使用元素的label或name(两个属性的值都一样)属性进行定位,如该属性为空,也是不能使用该属性。
使用方法:
# 等同于by_name
driver.find_element_by_accessibility_id('WBPageDiscoverSubGirdView')
3.3 class_name
不推荐使用。支持:Android 和 iOS。需要特别注意该属性的唯一性!
class_name唯一的情况并不多,一般情况下用不上。
# 不推荐使用
driver.find_element_by_class_name('XCUIElementTypeButton')
3.4 xpath
推荐使用。支持:Android 和 iOS。但由于 iOS 10开始使用的 XCUITest 框架原生不支持,定位速度很慢。
- 使用绝对路径定位
MobileBy.xpath("className/className/className/className")
- 使用相对路径定位
MobileBy.xpath("//className")
- 通过元素的索引定位
MobileBy.xpath("//className[index]")
- 通过元素的属性定位
一种属性:MobileBy.xpath("//className[@label='更多信息']")
两种属性:MobileBy.xpath("//className[@label='更多信息'][@isVisible='1']")
部分属性(最强大):MobileBy.xpath("//className[contains(@label,'更多')]")
3.5 ios_uiautomation
仅支持 iOS 9.3或以下,是 iOS 旧框架 UIAutomation 的定位方式,现在基本上很少使用,这个定位类型同样可使用 iOS 谓词进行定位