appium定位方法策略

官方地址
官方给的定位先后策略:
按其性能排序的可用位置策略列表(第一个是最快的)

  1. Class Name
  2. Accessibility Id
  3. Link Text
  4. Predicate
  5. Class Chain
  6. 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当前定义了以下元素属性:

  1. name - 如果未设置第一个元素,则元素的可访问性标识符或元素标签的实际值
  2. value - 元素的价值。它始终是字符串类型(或者nil如果未设置该值)并包含相应元素的值。根据元素的类型,可以是:文本字段中的文本或占位符文本; 文字标签的标签; '1'或者'0'如果这是一个复选框或开关
  3. label- 元素的标签值或nil不存在
  4. rect - 元素的矩形作为字典,具有以下键:x,y,width,heigth
  5. type - 键入字符串。在此 XCTest教程页面上枚举了所有可能的元素类型。
  6. enabled- 元素是否启用(1/ 0
  7. visible- 元素是否显示(1/ 0
  8. accessible- 元素是否可访问(1/ 0
  9. 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

你可能感兴趣的:(appium定位方法策略)