转载原文:https://www.jianshu.com/p/efe9dcf8bbaf

一、定位工具

在安装appium环境的时候我们已经安装了SDK,里面就自带有元素定位的工具,位置在.../sdk/tools/uiautomatorviewer.bat,由于安装路径各有不同,如果实在找不到可以具体路径,可以在电脑中查找uiautomatorviewer.bat文件,找到后双击打开即可,初始界面如下:

 
 
 

打开工具后,将手机连接电脑,这里要提醒的是,该工具只能获取手机当前的界面截图,而无法实时同步的显示手机界面,工具上有两个按钮:第一个图标是获取设备截屏,可以获取元素完整的层级关系。

 
 
 
 
 
 

第二个图标是获取压缩后的设备截屏,包含各个元素的属性,无法获得完整的层级路径

 

 

 
 
 
 
 
 
 
 
 

所以我们一般使用第一个获取设备截屏的按钮就行,连接好手机后点击第一个按钮得到当前手机界面,可以通过鼠标定位界面上的各个元素,右侧可查看该元素的相关值

 

ps:有一点要特别提醒,由于在自动化运行过程中一定要运行Appium,但我在使用中发现uiautomatorviewer在获取设备截图时好像与Appium有冲突,经常会报错:Error obtaining UI hierarchy。如果是在脚本调试阶段,可以停止运行Appium即可,调试完成后再开启Appium跑脚本

二、定位方法

1、ID定位(取resource-id、id、name)

当定位到元素后,在node detail中有该元素的所有参数,如果有resource-id属性就取resource-id值,有id属性就取id值,有name属性就取name值

但是在取resource-id、id、name值时这些值一定要唯一,可以唯一定位到该元素才行,如果值是一个通用值,那么无法区别出元素仍然无法定位,这时就要换其他定位方法

2、class、text定位(取class、text)

class是一个类属性,一般重复性会很高,所以很少直接使用,这里讲class属性是由于在xpath中会频繁用到class属性

text属性是文本,如果是要定位到唯一的标题之类的可以直接使用text属性

3、xpath定位

通过上面两种方法可知,如果有id属性当然就直接使用id值,但如果没有就干脆使用xpath,理论上xpath可以定位到所有元素

xpath的写法是根据层级的class属性一级一级定位到元素

绝对路径:

元素的全路径,包含了全部节点。这种方法首先一看就觉得太长写起来好累,如果层级再多那写起来简直无休无止了;另一方面由于涉及到太多层,一旦中间任何一层有变动,那元素就定位不到了,例如:

//android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.ImageButton

相对路径:

1.如果当前class内存在唯一text可以定位元素,直接用当前class+text,例如://android.widget.TextView[@text='日常巡查']

2.如果当前class内存在唯一content-desc可以定位元素,直接用当前class+content-desc,例如://android.widget.TextView[@content-desc='巡场排查']

3.如果当前class内,resource-id、text、content-desc三者取其二或者取其三能唯一定位元素,直接用当前class+两者/三者并列,例如://android.widget.TextView[@resource-id='com.space.grid.debug:id/text' and @text='数据采集']

4.如果当前class内,text、content-desc中的文本内容不是完全符合,但能匹配部分内容,可用当前class+模糊定位contains,例如://android.widget.TextView[contains(@text,'重点管控')]

5.如果在当前class内无法通过以上4种办法定位元素,则向上寻找元素的父节点或者祖父节点通过以上4种办法定位,总之是找到能唯一定位且离元素最近的一个上层节点,例如://android.widget.RelativeLayout[@resource-id='com.space.grid.debug:id/address']/android.widget.ImageView[2]

ps:这里特别要强调的一点是android.widget.ImageView的index=1,但为什么写法却是android.widget.ImageView[2]下标为2,因为xpath的下标是从1开始的,没有0

4、坐标点定位

如果上面说的几种办法都无法定位,那只能采用终极办法,通过像素的坐标位置来定位元素了,比方我有个表单的选项是浮层,但工具没办法获取到浮层中每个项,这个时候只能通过关键字Click A Point [ x | y]来定位元素

PS:但有一点要注意的是,由于不同手机的分辨率不同,坐标位置也是会有一定的差异,同一个脚本在不同手机上运行可能会有不同的结果

 
 

 
 

【转】Appium如何定位安卓APP元素的更多相关文章

  1. 使用appium框架测试安卓app时,获取toast弹框文字时,前一步千万不要加time.sleep等等待时间。

    使用appium框架测试安卓app时,如果需要获取toast弹框的文案内容,那么再点击弹框按钮之前,一定记得千万不要加time.sleep()等待时间,否则有延迟,一直获取不到: 获取弹框的代码: m ...

  2. XP定位(APP元素定位)

    Appium app自动化测试经验分享-Xpath定位总结 在我看来,自动化测试中元素定位的倚天剑和屠龙刀莫过于 Xpath和CSS,但CSS只用于Web(之前已经分享过),这次就分享下Xpath的定 ...

  3. python_appium 之使用Appium Inspector定位工具进行元素识别,编写验证demo

    一.前提条件 appium环境搭建完成,模拟器Genymotion 安装完成,且已经下载成功了模拟设备 二.元素识别操作步骤及demo 1.进入appium如下菜单 2.填写Desired Capab ...

  4. Appium+python自动化-查看app元素属性

    本文转自:https://www.cnblogs.com/yoyoketang/p/7581831.html 前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道 ...

  5. Appium Inspector定位Webview/H5页面元素

    目录 操作步骤 Python操作该混合App代码 Appium在操作混合App或Android App的H5页面时, 常常需要定位H5页面中的元素, 传统方式是 翻墙 + 使用Chrome://ins ...

  6. 篇3 安卓app自动化测试-搞定界面元素

    篇3                 安卓app自动化测试-搞定界面元素 --lamecho辣么丑 1.1概要 大家好! 我是lamecho(辣么丑),今天是<安卓app自动化测试>的第三 ...

  7. 篇4 安卓app自动化测试-Appium API进阶

    篇4                 安卓app自动化测试-Appium API进阶 --lamecho辣么丑 1.1概要 大家好! 我是lamecho(辣么丑),今天是<安卓app自动化测试& ...

  8. 篇2 安卓app自动化测试-初识python调用appium

    篇2              安卓app自动化测试-初识python调用appium --lamecho辣么丑 1.1概要 大家好!我是lamecho(辣么丑),上一篇也是<安卓app自动化测 ...

  9. Appium常用操作之「元素定位、swipe 滑屏操作」

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.打开 uiautomatorviewer 二.Appium 常用操作 1.用 layui 做 ...

随机推荐

  1. 下载caffe慢

    国内在github上下载软件慢,应在gitee下载git clone https://gitee.com/cuibixuan/caffe.git

  2. 1. centos下安装docker

    CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发 ...

  3. zigbee组网函数的一些用法

    1.NLME_PermitJoiningRequest(0)  :(1)值0x00:表示禁止加入网络  (2)值0x01-0xFE:表示允许链接的秒数 (3) 值0xff:表示启用网络 同时此函数:是 ...

  4. 在java中使用Mysql数据库,如何在MyBatis的xml里面处理时间为Int类型的数据

    主要是将显示在页面上的数据变成日期格式,而不是相应的毫秒数,具体的做法如下: 1.首先需要在相关的xml文件里面修改时间为下面语句,其中reg_time为要修改的日期列名 FROM_UNIXTIME( ...

  5. redis的数据持久化策略

    redis提供了两种不同的持久化方法来将数据存储到硬盘里面.一种方法叫快照,它可以将存在于某一时刻的所有数据都写入硬盘里面.另一种方法叫只追加文件(AOF),它会在执行写命令时,将被执行的写命令复制到 ...

  6. ElasticSearch(十一)Elasticsearch清空指定Index/Type数据

    POST /index_name/type_name/_delete_by_query?conflicts=proceed { "query": { "match_all ...

  7. kubernets controller 和 CRD 具体组件分析

    (dlv) b k8s.io/sample-controller/pkg/client/informers/externalversions.(*sharedInformerFactory).Info ...

  8. js 控制 class 类名(classList) 和 自定义属性(dataset)

    classList 用法: const div = document.querySelector('div') div.classList.add('myclass') // 添加类名 div.cla ...

  9. 字符和字符串在Java中的旅程

    以下是个人对java中字符和字符串的见解,如有疏漏之处,还请不吝赐教. 下面通过一个简单的程序来说明字符和字符串在Java中的旅程. 以字符 ' 中 '为例, 它的GBK编码是2个字节:0xd6d0, ...

  10. 2018年-2019年第二学期第六周C#学习个人总结

    在这一周,我学习了5.4抽象类和接口.首先,抽象类当中我知道了C#允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰例如:abstract void ...