官方地址
官方给的定位先后策略:
按其性能排序的可用位置策略列表(第一个是最快的)
- Class Name
- Accessibility Id
- Link Text
- Predicate
- Class Chain
- XPath
尽量尝试使用更接近此列表顶部的策略。XPath策略有时可能非常慢,因为XCTest本身不支持它,而WDA需要额外的努力才能实现它,这会严重影响查找时间。仅当没有其他替代方法时才使用XPath定位器,例如,如果查询中使用了某些特殊函数或轴。
当前搜索范围中的UI元素越多,您获得的查找时间就越长。默认情况下,搜索范围是整个页面的源(如表达式driver.findElement
)。通过将其限制到特定元素的源(例如tableEl.findElement
),可以适当地优化查找性能,尤其是如果要在同一根元素上执行多个查找。如果在有限范围内执行,此策略还可以帮助避免XPath定位器或改善它们的查找时间。
如果只有一个元素需要匹配,请不要搜索多个元素
dstElement = driver.findElements(By.xpath('//XCUIElementTypeTable'))[0] ->
dstElement = driver.findElement(By.className('XCUIElementTypeTable'))
通常findElements
需要更多的时间来完成findElement
,因为没有必要扫描整个源来查找所有匹配,而是在检测到第一个匹配后返回。
避免使用通用匹配器
By.xpath('//[@="1"]/parent::*') ->
By.xpath('//XCUIElementTypeButton[@name="1"]/parent::XCUIElementTypeCell')
像星号这样的通用匹配器*
与findElements
调用相结合可能需要扫描每个UI元素的所有属性,从性能角度来看这是非常无效的。
1、iOSClassChain 用法:
(1)绝对路径
XCUIElementTypeWindow/XCUIElementTypeButton[3] - 选择第一个子窗口元素的第三个子按钮
XCUIElementTypeWindow - 选择所有儿童窗户
XCUIElementTypeWindow[2] - 选择层次结构中的第二个子窗口。索引从1开始
XCUIElementTypeWindow/XCUIElementTypeAny[3] - 选择第一个子窗口的第三个子节点(任何类型)
XCUIElementTypeWindow[2]/XCUIElementTypeAny - 选择第二个子窗口的所有子项
XCUIElementTypeWindow[2]/XCUIElementTypeAny[-2] - 选择第二个子窗口的倒数第二个子节点
可以使用'*'(星号)字符替换通用的'XCUIElementTypeAny'类名
XCUIElementTypeWindow[name CONTAINS[cd] "blabla"
] - 选择所有窗口,其中name属性以“blabla”或“BlAbla”开头
XCUIElementTypeWindow[label BEGINSWITH "blabla"
][-1] - 选择最后一个窗口,标签文本以“blabla”开头
XCUIElementTypeWindow/XCUIElementTypeAny[value == "bla1" OR label == "bla2"
] - 选择第一个窗口的所有子项,其中值为“bla1”或标签为“bla2”
XCUIElementTypeWindow[name == "you're the winner"
]/XCUIElementTypeAny[visible == 1
] - 选择名为“你是赢家”的第一个窗口的所有可见子项
XCUIElementTypeWindow/XCUIElementTypeTable/XCUIElementTypeCell[visible == 1
][$type == XCUIElementTypeImage AND name == 'bla'$]/XCUIElementTypeTextField - 选择一个文本字段,它是可见表格单元格的直接子项,其中至少有一个带有标识符“bla”的后代图像
(2)间接后代搜索请求-相对路径
-
**/XCUIElementTypeCell[
name BEGINSWITH "A"][-1]/XCUIElementTypeButton[10]
- 选择树中最后一个单元格的第10个子按钮,其名称以“A”开头。 -
**/XCUIElementTypeCell[
name BEGINSWITH "B"]
- 选择树中的所有单元格,其中名称以“B”开头 -
**/XCUIElementTypeCell[
name BEGINSWITH "C"]/XCUIElementTypeButton[10]
- 选择树中第一个单元格的第10个子按钮,其名称以“C”开头,并且至少有十个直接子类型为XCUIElementTypeButton。 -
**/XCUIElementTypeCell[
name BEGINSWITH "D"]/**/XCUIElementTypeButton
- 选择树中第一个单元格的所有后代按钮,其名称以“D”开头
2、iOSNsPredicate 用法
(1)
WebDriverAgent当前定义了以下元素属性:
-
name
- 如果未设置第一个元素,则元素的可访问性标识符或元素标签的实际值 -
value
- 元素的价值。它始终是字符串类型(或者nil
如果未设置该值)并包含相应元素的值。根据元素的类型,可以是:文本字段中的文本或占位符文本; 文字标签的标签;'1'
或者'0'
如果这是一个复选框或开关 -
label
- 元素的标签值或nil
不存在 -
rect
- 元素的矩形作为字典,具有以下键:x,y,width,heigth -
type
- 键入字符串。在此 XCTest教程页面上枚举了所有可能的元素类型。 -
enabled
- 元素是否启用(1
/0
) -
visible
- 元素是否显示(1
/0
) -
accessible
- 元素是否可访问(1
/0
) -
accessibilityContainer
- 元素是否是辅助功能容器(1
/0
)
例如,所有这些属性名称也可以在具有wd
前缀的谓词查询中使用wdName
。
例子:
type == 'XCUIElementTypeButton' AND value BEGINSWITH[c] 'bla' AND visible == 1-发现型XCUIElementTypeButton其值始于的元件Bla/ bla/ BLA和它们是可见 type IN {'XCUIElementTypeIcon','XCUIElementTypeImage'} AND visible == 1-找到所有可见图标和图像 type == 'XCUIElementTypeCell' AND rect.width > 100-查找其宽度大于100的所有小区 type == 'XCUIElementTypeCheckBox' AND (visible == 1 OR enabled == 1)-找到所有复选框,其是可见的或启用
(2)
iOSNsPredicate("name = ‘head new‘"); // 等于
iOSNsPredicate("name LIKE ‘*new‘"); // 模糊匹配
iOSNsPredicate("name MATCHES ‘^$‘"); // 正则表达式匹配
iOSNsPredicate("name CONTAINS ‘我的‘"); // 包含
iOSNsPredicate("name BEGINSWITH ‘我的‘"); // 以"我的"开始
iOSNsPredicate("name BEGINSWITH ‘我的‘ && name ENDSWITH ‘消息‘"); // 以"我的"开始并且以"消息"结尾
其中属性名参照inspector的属性字段,关键字LIKE,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH必须是大写,匹配的字符需要用单引号
部分参考链接:https://blog.csdn.net/huodoubi/article/details/78784141
网友评论