Appium定位方法策略

发表于:2019-10-11 13:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:TungChiu    来源:简书

  官方给的定位先后策略:
  按其性能排序的可用位置策略列表(第一个是最快的)
  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必须是大写,匹配的字符需要用单引号

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号