Appium-同一个元素不同定位方式的区别

发表于:2020-1-02 10:26  作者:wenshi11019   来源:思否

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: Appium

  前言
  使用过 Appium 的都知道,元素的定位方式有很多种,具体使用哪一种,主要看业务的需要和自己的使用爱好。下面总结一下,Appium 到底有哪些定位方式,定位的元素以下面截图指定的元素为例子:
 
  这里给 Macaca 的 inspector 查看器打个广告,的确很好用,有需要可到社区的 Macaca 版块自己查找啊!
  Appium 的定位方式种类
  我说的定位方式都是基于我自己亲测过,没使用或比较少用的就在这里不列举了,如有错误的地方,请多多包涵!常用的定位方式(仅限 Android 和 iOS 两种系统)有 className、id、xpath、AccessibilityId、AndroidUIAutomator、iOSNsPredicateString、iOSClassChain、IosUIAutomation等
  className
  使用元素的className属性定位,支持:Android 和 iOS,推荐使用。
  MobileBy.className("XCUIElementTypeButton")
  id
  使用元素的Resource Id属性定位,支持:Android,仅支持 Android 4.3或以上,推荐使用。反正我没有在 iOS 用过,大家有正确使用过的例子,可以分享一下。
  MobileBy.id("package.name:id/android")
  xpath
  支持:Android 和 iOS。但由于 iOS 10开始使用的 XCUITest 框架原声不支持,定位速度很慢,所以官方现在不推荐大家使用,也有其他替代的定位方式可使用。
  1、使用绝对路径定位,如截图所显示的 xpath 路径
 `MobileBy.xpath("className/className/className/className")`
  2、使用相对路径定位
 `MobileBy.xpath("//className")`
  3、通过元素的索引定位
 `MobileBy.xpath("//className[index]")`
  4、通过元素的属性定位
   一种属性:`MobileBy.xpath("//className[@label='更多信息']")`
  两种属性:`MobileBy.xpath("//className[@label='更多信息'][@isVisible='1']")`
  部分属性(最强大):`MobileBy.xpath("//className[contains(@label,'更多')]")`
  AccessibilityId
  替代以前的name定位方式,推荐使用。
  在 Android 上,主要使用元素的content-desc属性,如该属性为空,不能使用此定位方式。
  在 iOS 上,主要使用元素的label或name(两个属性的值都一样)属性进行定位,如该属性为空,如该属性为空,也是不能使用该属性。
  MobileBy.AccessibilityId("更多信息")
  AndroidUIAutomator
  仅支持 Android 4.2或以上,可支持元素的单个属性和多个属性定位,推荐使用。
  一种属性:MobileBy.AndroidUIAutomator("new UiSelector().text(\"发送\")")
  两种属性:MobileBy.AndroidUIAutomator("new UiSelector().text(\"发送\").clickable(true)")
  元素的所有属性都可用做定位,功能非常强大,且速度很快。
  iOSNsPredicateString
  仅支持 iOS 10或以上,可支持元素的单个属性和多个属性定位,推荐使用。
  一种属性:MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton'")
  两种属性:MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton' AND label == '更多信息'")
  具体 iOSNsPredicate语法结构可查看官方文档,或期待我下一个帖子。
  iOSClassChain
  仅支持 iOS 10或以上,这是 github 的 Mykola Mokhnach 大神开发,仅限在 WebDriverAgent 框架使用,用于替代 xpath 的,但使用一阵子后,感觉灵活性没有 xpath 和 iOSNsPredicate 好,应该还不完善吧。具体使用方法,请见:https://github.com/appium/app... 。
  MobileBy.iOSClassChain('XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeNavigationBar[1]/XCUIElementTypeOther[1]/XCUIElementTypeButton[2]')
  IosUIAutomation
  仅支持 iOS 19.3或以下,是 iOS 旧框架 UIAutomation 的定位方式,现在基本上很少使用
  总结:
  以上这个多定位方式,很少说全部用完。根据我的经验,推荐使用:Android:AndroidUIAutomator > className = id = AccessibilityId > xpath。iOS:iOSNsPredicateString > className = AccessibilityId

     本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理

评 论

论坛新帖



建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海信义律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2021, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道