最近遇到的项目,发现很多元素,都没有标明id、text、content-desc,classname中又有很多是相同,导致无法定位

第一,appium1.5及之后的版本废弃了name属性(如name=账单,将不被支持用于定位),所以基本的定位就用下id就好了。其他的不多说了。

第二,下面就来说一下关于xpath的定位。主要场景为没有id或者没有text,或者text是一个不可控的值(或者叫会发生变化的值,就比如text字段为10元,可能这个10每次会变)的时候。其实简单点就是按路径定位包括一级或者多级路径。顺便说一下,路径方式分两种,一种是绝对路径(以第一个标签为参照物),另一种是相对路径(已其他已知的标签为参照物),且在定位的时候尽量采用相对路径的方式。

1,先说说有id或者text的场景使用xpath的情况。(有id或者name为什么不直接用?以下均为相对路径)

上面说的name被废弃了,但是xpath的写法如//android.widget.TextView[@text="账单"]是被支持的

就比如上面的"账单"和"我要"的id都是com.wlqq:id/title_left_btn,并且假设当前页面只有这两个位置id为前面写的,那么你在用id定位"账单"的时候,就可以用xpath了,因为id已经不唯一了。

用id定位“账单”的为:

xpath=(//android.widget.TextView[@resource-id="com.wlqq:id/title_left_btn"])[1],

定位"我要"的为:

xpath=(//android.widget.TextView[@resource-id="com.wlqq:id/title_left_btn"])[2]

此处注意三点:

a,下标是从1开始,而不是0;

b,如果有下标,需要用括号把前面的部分括起来,并且前面需要加xpath=,可能有些人习惯了前面都加xpath=,但是像我这种只习惯写//开头,不写xpath=的就被坑惨了。。。反正不容易发现是因为没有写xpath=,也可能是我个人比较坑吧。

c,就是和web不一样的就是标签的取值,在这里取的是class的值=android.widget.TextView而不是看到的标签TextView,具体原因没有深究。反正记住用class代替标签就对了。

另外,上面的只是为了说明只有1个层级的时候xpath的用法,1层也算是一种相对路径吧。因为没有从第一个位置的属性开始写。xpath的书写规则基本是越少越好。所以层级也是越少越好。有1层可以唯一定位就不要2层。 可能有点废话了。

2,现在就来说说没有id或者name的场景。 先来一张图:

现在有一个场景是,我要定位到我需要点击上面那个小人图标,但是没有text、id、content-desc,唯一classname还是和其它相同,能想到的方法是用xpath方式

用绝对路径的写法就是:如果图上的第一个是最顶上的话,就是:

这样的,也就是需要7个层级,依次写下来就是:

//android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.LinearLayout[2]/android.widget.ImageButton

这种写法注意一下几点:

a , [2]注意是2而不是3,因为与标签的值有关。只有2个LinearLayout。

b , 路径长度偏长,而且因为只有class的值,对于一些页面控件较多的,可能不止一个,也就是可能这种写法也都不是唯一。

c , 绝对路径基本很少使用,如果人品太差,遇到页面全是没有id或者name的,那就没办法了。或者考虑一些坐标。

3,(重要)没有id或者name的场景下使用相对路径的办法来定位。主要介绍一下层级关系中的父子关系(上下级)和兄弟关系。

大家可以看到,这个图里面有一个唯一的中文词汇--"钱包"。我们可以通过这个钱包来定位我们的小人图片。先分析下位置关系

找找关系也就是如图所示,小人图标3是钱包1的弟弟2LinearLayout标签的儿子ImageButton。儿子好理解,xpath的层级关系也就是父子关系用/表示。//android.widget.LinearLayout/android.widget.ImageButton这样就能表示弟弟的儿子了。但是现在问题是怎么表示钱包的弟弟?xpath里面有一个轴,简单点可以理解为一个函数吧。我这样认为的。preceding-sibling:: 可以找到节点前面也就是哥哥节点,following-sibling::可以找到节点后面也就是弟弟节点,关于轴的更多用法啊,可以自行百度xpath的语法。这里还有一个用的多的就是parent:: ,可以找到节点的父亲节点。但是父亲节点可以用..表示。下面就来具体说一下怎么用:

基本知识已经介绍到此了。那么这里的定位方法就是上图中的3个层级://android.widget.TextView[@text="钱包"]/following-sibling::android.widget.LinearLayout/android.widget.ImageButton。 第一级就同前面说的唯一的找到钱包这个位置,后面的一级就是钱包的弟弟,也就是following-sibling::android.widget.LinearLayout。当然注意因为是紧挨着的,所以弟弟没有下班,可想而知如果是第几个弟弟,就加个下标吧。哥哥也是同理。

前面用到了兄弟的关系,下面说一下儿子与父亲的关系。父子关系还是用图来说明

我们的钱包1的父亲2有一个儿子3的儿子4就是我们的小人图标。这就是找关系。关系找到了,那我们就可以用这个关系来写xpath了。

也就是钱包(//android.widget.TextView[@text="钱包"])的父亲(/parent::android.widget.RelativeLayout )的第二个class=android.widget.LinearLayout的儿子(/android.widget.LinearLayout[2])的儿子(小人/android.widget.ImageButton),好,我们连起来就是://android.widget.TextView[@text="钱包"]/parent::android.widget.RelativeLayout/android.widget.LinearLayout[2]/android.widget.ImageButton。

顺便说一下父亲这个位置可以用..来代替,相比很多人都知道..在路径里面指的就是上级。所以可以用//android.widget.TextView[@text="钱包"]/../android.widget.LinearLayout[2]/android.widget.ImageButton这个来代替上面的写法。

注:最后再强调下,关于这个地方,下标为什么是[2],是因为只与class相同的有关。钱包的class不一样。所以它就不算了。

关于相对路径的父子关系,以及兄弟关系,相比大家应该有所体会了吧。如果还是没太懂,咱们再来个复杂点的例子。可能只是举例说明下语法。实际下面的可能不会这样复杂的写。先上图:

假设我们需要通过加入购物车这个位置来定位我们的立即定位按钮,那么,我们的一种写法就是图上的这个关系7层级。也就是加入购物车7(//android.widget.TextView[@text="加入购物车"])的父亲1(/..)的父亲2(/..)的父亲3(/..)的第二个兄弟4(/following-sibling::android.view.View[2])的儿子5(/android.view.View)的儿子6(也就是我们的立即购买/android.widget.TextView),

连起来就是

//android.widget.TextView[@text="加入购物车"]/../../../following-sibling::android.view.View[2]/android.view.View/android.widget.TextView。

注意:使用text的时候避免使用输入框的默认输入值,因为当你真实输入值之后,就没有这个text了,也就找不到路径了。另外也可以用模糊匹配,xpath有一个contains函数。用法//android.widget.TextView[contains(@text,"购物车")].也能找到“加入购物车”这个位置。

场景:定位请输入密码这个输入框,上图,没有id、text、content-desc,classname也有很多重复

使用xpath,手写定位

1、先选取登录按钮作为节点

//android.widget.TextView[@text='登录']

2、再定位到父级

/.. 也就是  /parent::android.view.View

3、再定位同级的哥哥

/preceding-sibling::android.view.View[1]

注意:[1],下标是向上数的,适用于preceding-sibling

如果是following-sibling,则向下数的

都是从1开始取下标

4、再定位到孩子

child::android.widget.EditText

连起来就是:

//android.widget.TextView[@text='登录']/../preceding-sibling::android.view.View[1]/child::android.widget.EditText

android 控件xpath软件_Appium-关于appium的原生控件的 xpath 定位问题及常用方法相关推荐

  1. Appium-关于appium的原生控件的 xpath 定位问题及常用方法

    最近遇到的项目,发现很多元素,都没有标明id.text.content-desc,classname中又有很多是相同,导致无法定位 第一,appium1.5及之后的版本废弃了name属性(如name= ...

  2. ykhmi是什么触摸屏软件_YKHMI组态编程软件|中达优控触摸屏编程软件(YKBuilder)下载 v5.0.200 官方版 - 比克尔下载...

    YKBuilder是一款中达优控触摸屏编程软件,是中达优控YKHMI系列人机界面的集成开发环境,可以通过对现场数据的采集处理,以动画显示.报警处理.流程控制和报表输出等多种方式向用户提供解决实际工程问 ...

  3. 识别连笔字的软件_司捷分件著录软件下载-司捷分件著录软件最新版下载[文件分件]...

    司捷分件著录软件最新版是一款非常优秀的文件分件软件,司捷分件著录软件官方版支持Excel自动分件,人工看图分件,OCR自动著录等功能,让客户不断提高生产效率和降低人工成本,司捷分件著录软件最新版通过分 ...

  4. android 获取控件高度_安卓开发入门教程UI控件_ImageView

    什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...

  5. 云炬Android开发笔记 15评价晒单功能实现(自定义评分控件和仿微信自动多图选择控件)

    阅读目录 1. 晒单评价 1.1 点击页面跳转的实现 1.2 自定义评价订单的布局实现 1.3 星星布局的实现 2. 仿微信自动多图及删除控件 2.1 属性值及控件的定义 2.2 图片初始化方法onM ...

  6. android 获取控件高度_安卓开发入门教程UI控件_ProgressBar

    什么是ProgressBar ProgressBar是用于提示用户进行等待的UI控件,. 基础样例 1.loading图 效果图 代码 布局文件代码 <ProgressBarandroid:id ...

  7. Android 原生控件之三 ProgressBar

    Android 原生控件之三 ProgressBar 相关 来源 开始 不确定的进度 确定的进度 XML属性 1.android:animationResolution 2.android:indet ...

  8. Android 原生控件之一 TextView

    Android 原生控件之一 TextView 前言 来源 开始 XML属性 1.android:allowUndo 2.android:autoLink 3.android:autoSizeMaxT ...

  9. Android 原生控件之二 ImageView

    Android 原生控件之二 ImageView 相关 来源 开始 XML属性 1.android:adjustViewBounds 2.android:baseline 3.android:base ...

最新文章

  1. Ubuntu 14.04 64bit上安装有道词典Linux版本
  2. go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别
  3. 信步漫谈之Git—环境搭建及入门
  4. Tengine开源新特性:如何让HTTPS处理能力轻松翻倍?
  5. Git 提示fatal: remote origin already exists 错误解决办法
  6. 聊聊自己的高效学习方法~
  7. SharePoint中添加或者修改Item时调用EventReceiver(Event Handler)处理额外的逻辑
  8. win server 缓冲区队列不足_有赞延迟队列设计
  9. linux ubutu书籍,Ubuntu Linux入门到精通[图书]
  10. oracle cost小 比较慢,Oracle数据库中有关CBO优化的三个问题
  11. java GC垃圾回收
  12. c语言输入abc求方程的根,编写程序,输入系数abc,计算任意二次方根的实根
  13. 从深圳地铁看-------以损害乘客利益为目标的营运方式
  14. 简单投资组合净值的计算
  15. dos下用move命令移动文件夹
  16. 火了,新东方年会吐槽视频《释放自我》:累死累活干不过写PPT的
  17. Linux笔记 No.17---(磁盘分区fdisk,gdisk,parted、格式化mkfs,mke2fs、挂载mount、卸载umount、df、du、lsof命令)
  18. 解决tomcat正常启动但是对应的网页却无法访问
  19. 【转载】xp用户自动登录
  20. 圆满落幕!回顾 eBPF 技术的发展与挑战

热门文章

  1. 带负荷测试要求二次最小电流_差动保护带负荷测试
  2. response.sendRedirect(quot;http://www.baidu.comquot;);重定向
  3. java string传递_Java,将String从一种方法传递到另一种方法
  4. php mysql时间倒序,php mysql时间已过去计算
  5. vb net excel 剪贴板 粘贴_excel表格操作: 图形和图表编辑技巧汇总(一)
  6. 删除替换字符串中第一次出现的字符串
  7. JasperReport报表设计总结
  8. MySQL索引的Index method中btree和hash的优缺点
  9. 进程与线程的四个区别
  10. phpstudy mysql升级5.7