Appium-关于appium的原生控件的 xpath 定位问题及常用方法
最近遇到的项目,发现很多元素,都没有标明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
转载于:https://www.cnblogs.com/R-bear/p/7569616.html
Appium-关于appium的原生控件的 xpath 定位问题及常用方法相关推荐
- android 控件xpath软件_Appium-关于appium的原生控件的 xpath 定位问题及常用方法
最近遇到的项目,发现很多元素,都没有标明id.text.content-desc,classname中又有很多是相同,导致无法定位 第一,appium1.5及之后的版本废弃了name属性(如name= ...
- MAUI中构建跨平台原生控件实现
简介 MAUI中使用Handler体系来处理不同平台的原生控件实现, 即对应的, 如果我们想要创建控件, 只需要创建基于不同平台的Handler即可. 那么下面主要教大家如何通过创建Handler(事 ...
- JS与APP原生控件交互
"热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...
- Android 原生控件之三 ProgressBar
Android 原生控件之三 ProgressBar 相关 来源 开始 不确定的进度 确定的进度 XML属性 1.android:animationResolution 2.android:indet ...
- ScrollView中嵌套原生控件+WebView+原生控件出现的WebView滑动顶部的冲突问题。
开发中常有一个界面中为了灵活动态可配,常常出现在一个界面中添加WebView来加载动态URL, 界面如下所示(图中最外层为ScrollView,红色为原生控件,中间的绿色是一个WebView来动态加载 ...
- Android 原生控件之一 TextView
Android 原生控件之一 TextView 前言 来源 开始 XML属性 1.android:allowUndo 2.android:autoLink 3.android:autoSizeMaxT ...
- Android 原生控件之二 ImageView
Android 原生控件之二 ImageView 相关 来源 开始 XML属性 1.android:adjustViewBounds 2.android:baseline 3.android:base ...
- android 获取控件 id 工具,如何使用appium desktop 获取Android APP 控件的id
背景: 随着Android 版本的更新,你会发现我们之前用的最新的版本的Appium 1.5.3无法启动我们的 Android APP 在模拟器为7.0的设备上,所以我们有必要了解如何使用 appiu ...
- Appium 关于 swipe 滑动时间控件选择时间问题,swipe 滑动没效果,用 TouchAction代替
一开始一直想用 swipe 进行滑动去操作滑动时间控件,选择时间. 后来尝试了几次后也没有滑动效果出现,各种百度搜索也找不到解决办法. 于是就采取了 TouchAction 方法,真机可以用开发者选项 ...
最新文章
- 解决python中import时无法识别自己写的包和模块的方法
- JavaScript tips and tricks - 4
- python中collections_Python中collections模块的基本使用教程
- C# Windows服务
- 调用DM FLDR JNI导出数据库文件
- 前端学习(491):script元素
- python 类的简单实用和定义
- C语言实现GBK/GB2312/五大码之间的转换(转)
- TCP/IP路由技术 -1.3 IPv4地址
- 多线程--对象及变量的并发访问
- 蓝桥杯--并查集1 sdutoj 小雷的冰茶几
- 台式计算机能分享热点吗,台式机能做wifi热点吗
- win10 查看版本信息(家庭版 专业版 企业版)
- 设计院总工毕生总结的200条经验
- mathtype打出花体小写字母
- iPhone/iPad/Touch苹果设备型号对应名称表
- HTTPS为什么安全 分析 HTTPS 连接建立全过程
- 用理性决策生活——《长得好看能当饭吃么》
- 阿里巴巴iconfont加入新的图标如何操作
- Latex中输入大小写罗马数字
热门文章
- 【面试准备·2】webpack
- 红帽和Mirantis宣告结束OpenStack合作
- [Diary]6.12
- mysql--innodb索引原理详解_MYSQL索引机制(InnoDB索引原理详解)
- 01章.计算机网络概述(1.7)
- sci写作sci写作模板_2020年写作主题
- onenote组织知识体系_如何提升组织的安全专业知识
- 开放接口加密方案_27种开放式解决方案,适用于所有教育
- 武德 | 年轻人!这才叫真正的程序猿的武德
- ROS笔记(39) 串口配置