Python+Appium自动化测试(5)-appium元素定位常用方法
对于Android而言,查找appUI界面元素属性的工具有三种:appium desktop,uiautomatorviewer.bat,weditor。之前已经介绍过了weditor的使用,这里我将通过使用uiautomatorview工具查看元素的属性值,来介绍Android app通过appium进行元素定位常用的几种方法。
一,使用uiautomatorview对app页面截图,查看元素属性
连接Android手机
在Android SDK的目录里的tools文件夹中找到uiautomatorviewer.bat文件,双击启动,会出现如下页面:(未安装Android SDK的请参考Android SDK 安装与配置)

建议创建uiautomatorviewer.bat的快捷方式到桌面,下次使用时就不需要进入到android-sdk/tools里打开。
如下图,1所示位置从左至右依次为:Open(打开之前保存的布局),Device Screenshot(获取详细布局),Device Screenshot -compressed(获取简单布局),Save(保存当前页面的布局);2所示位置展示app当前页面的UI树;3所示位置展示当前app页面被选择元素的属性值。

确认手机连接后,点击页面的Device Screenshot(获取详细布局)按钮,获取app当前页面的截图。此时工具页面可能会报错,请参考以下方法解决:
1,手机系统为Android 8.0以上版本请参考Android8.0以上版本使用uiautomatorviewer定位报错解决方法,替换SDK中相应的文件。
2,参考教程替换SDK中相应的文件后,仍然报错。请确认appium是否关闭,appium开启的状态下,uiautomatorviewer会与之冲突。
查看app当前页面的元素及对应的元素属性值。
以今日头条app为例,Node Detail里展示的便是【发布】按钮的各种属性值,后续在自动化代码中,我们就可以通过查找元素对应的属性来定位该元素并做相关操作。

二,appium移动端自动化常用的元素定位方法
appium继承了selenium框架中webdriver提供的元素定位方法,接下介绍几种常用的方法。

1,find_element_by_id()
如果某个元素的resource-id对应的值在app当前页面是唯一,那么就可以优先通过id定位该元素。以上图中点击【发布】按钮为例,写法如下
driver.find_element_by_id("com.ss.android.article.news:id/cde").click()
2,find_element_by_class_name()
元素的class属性值唯一,可以通过class name定位。如下图中所指的元素,其class属性值在当前页面唯一
![]()
写法如下
find_element_by_class_name("android.widget.HorizontalScrollView")
3,find_element_by_xpath()
这大概是元素定位过程中用的最多的方法,使用比较灵活。以下是xpath的具体实现方式。
3.1,使用text文本构造xpath
如果当前页面某元素的text属性值唯一,就可以使用text文本构造xpath,如【发布】按钮
# "//*[@text='发布']"该字符串表示:当前页面下所有元素里面text='发布'的元素
drvier.find_element_by_xpath("//*[@text='发布']").click()
3.2,使用class与其他属性结合构成xpath
class唯一的话可以使用find_element_by_class_name()定位,但大部分情况向class都不是唯一的,此时可以用class与其他属性结合构成xpath,如:
# class与text
driver.find_element_by_xpath("//android.widget.TextView[@text='消息通知']").click()
# class、text、resource-id结合,注意text与id之间使用and
driver.find_element_by_xpath("//android.widget.TextView[@text='消息通知' and @resource-id='com.ss.android.article.news:id/c_3']").click()
![]()
3.3,通过父元素定位子元素
在实际项目中,我们可能通过UI的层级结果进行定位。如下图,我们要定位【收藏】按钮,除了使用2方外,还可以它的上一级元素定位。
# 父元素下面有4个class相同的子元素,子元素后面不加索引,则默认定位的是第一个子元素
driver.find_element_by_xpath("//androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout")
![]()
子元素有多个,通过class的索引定位
# 后面的2表示索引,注意uiautomatorviewer里显示的是从0开始的,而xpath里面是从1开始
driver.find_element_by_xpath("//androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout[2]")
![]()
3.4,通过元素子元素定位父元素
即通过下一级元素定位上一级元素。
# 后面的/..表示当前级的上一级,此处即整个下载管理按钮区域
driver.find_element_by_xpath("//android.widget.TextView[@text='下载管理']/..")
![]()
同样定位元素的上一级的上一级(孙子定位爷爷),如下
driver.find_element_by_xpath("//android.widget.TextView[@text='下载管理']/../..")
3.5,定位兄弟元素
通过同级元素定位,下面以定位【下载管理】上的图标为例
# 兄->父->兄
driver.find_element_by_xpath("//android.widget.TextView[@text='下载管理']/../android.widget.ImageView")
![]()
三,总结。
具体使用什么样的方式定位,与app开发框架有关,一般使用id与xpath使用的比较多。需要注意的是,能使用的id定位元素的话就不要使用xpath定位,因为id定位元素方便维护的同时,效率也相对xpath更高。
xpath语法的基础知识需要有所了解,这样有助于能更好的理解元素定位。
当然appium还有其他的定位元素方法,这里不做过多的介绍,有兴趣的话可以去百度其他方法。实际使用过程中,常用的就是以上几种方法。

Python+Appium自动化测试(5)-appium元素定位常用方法的更多相关文章
- appium+python搭建自动化测试框架_Appium元素定位(二)
Appium元素定位: 工具:Android\android-sdk\tools uiautomatorviewer.bat 1. id定位: self.driver.find_element_ ...
- appium自动化测试之UIautomatorviewer元素定位
appium自动化测试之UIautomatorviewer元素定位 标签(空格分隔): uiautomatorviewer元素定位 前面的章节,已经总结了怎么搭建环境,怎样成功启动一个APP了,这里具 ...
- 5、通过Appium Desktop实现页面元素定位
之前我们已经安装了Appium Desktop,下面就让我们使用Appium Desktop实现页面元素定位 1.首先我们打开Appium Desktop,进入如下界面,点击Start Server ...
- Appium+python自动化(十一)- 元素定位秘籍助你打通任督二脉 - 下卷(超详解)
简介 宏哥看你骨骼惊奇,印堂发亮,必是练武之奇才! 按照上一篇的节目预告,这一篇还是继续由宏哥给小伙伴们分享元素定位,是不是按照上一篇的秘籍修炼,是不是感觉到头顶盖好像被掀开,内气从头上冒出去,顿时觉 ...
- Appium移动自动化测试(三)之元素定位
实验简介 做过UI自动化(web自动化, 移动自动化)的同学都会知道, 除去框架的选型和搭建以外, 落到实处的对元素进行定位就成了最重要的技能. 做过UI自动化的同学会知道, 对页面元素的定位方式有8 ...
- python+Appium自动化:H5元素定位
问题思考 在混合开发的App中,经常会有内嵌的H5页面.那么这些H5页面元素该如何进行定位操作呢? 解决思路 针对这种场景直接使用前面所讲的方法来进行定位是行不通的,因为前面的都是基于Andriod原 ...
- python+Appium自动化:各种元素定位方法
name定位 driver.find_element_by_name('飞利浦净水').click() 测试结果报错:selenium.common.exceptions.InvalidSelecto ...
- python+Appium自动化:id元素定位
元素定位 与web自动化一样,app自动化元素定位也是非常重要的一环,,appium也是提供了很多元素定位的方法,比如:id.name.class.层级定位等等. 元素定位方式 id name cla ...
- Python+Appium自动化测试(2)-appium连接真机启动app
app自动化测试的第一步,是启动被测app.appium环境搭建好后,我们就可以连接真机启动app了.环境为windows,Appium1.18.0,Android手机,被测app为今日头条app,让 ...
随机推荐
- jinja2快速实现自定义的robotframework的测试报告
一.背景 RF的结果报告可以方便我们查看每一条用例集.用例的执行结果统计,但是有的项目涉及到一些数据的比对,希望能够直观到看到数据,原生的测试报告就无法满足这个需求了. 原生的报告 项目需求报告格式 ...
- pycharm可以运行但无法debug的解决方法
错误信息:pydev debugger: process 4588 is connecting 如果您尝试了网上的很多方法如防火墙设置,去掉 ".idea"文件,甚至重装pycha ...
- 使用zabbix监控sql server的发布订阅
(一)背景 个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制.在发布订阅环境搭建完成后,最重要的就是如何监控复制的状态了,sql serve ...
- 使用Hint /*+ full(emp)*/ 将索引全扫描改成全表扫描,看cost差别
索引全扫描的执行计划: SQL> select max(age) from tb_emp04 emp; 已用时间: 00: 00: 00.01 执行计划 -------------------- ...
- VMware虚拟中输入ifconfig提示not found解决办法
1. 查看虚拟机是否没有IP地址:命令行中输入ip addr,如图红框所示,若无是需要设置. 2. 进入sbin目录确认ifconfig是否安装:可以通过命令[ls | grep 'if']来看 3. ...
- pytest测试框架 -- skip跳过执行测试用例
跳过执行测试用例 1.@pytest.mark.skip(reason=" ") -- 跳过执行测试函数 可传入一个非必须参数reason表示原因 import pytest@ ...
- oracle之三闪回flashback
闪回 flashback 5.1 flashback 的功能:1)利用undo data回溯或撤销提交的数据,2)flashback log 使database 可以恢复到过去某个时间点,可以作为不完 ...
- oracle之复杂查询之一:多表连接技术
复杂查询之一:多表连接技术 7.1 简单查询的解析方法: 全表扫描:指针从第一条记录开始,依次逐行处理,直到最后一条记录结束: 横向选择+纵向投影=结果集 7.2 多表连接 交叉连接(笛卡尔积) 非等 ...
- Linux下日志文件过大解决方案
很多Linux服务器里的应用程序都是无间断的输出日志,这对于服务器的硬盘是一个很大的考验.良许之前也分享过一篇文章,介绍如何让应用程序在后台执行: linux后台执行命令:&与nohup的用法 ...
- Mac部署spark2.4.4
环境信息 操作系统:macOS Mojave 10.14.6 JDK:1.8.0_211 (安装位置:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jd ...