【Python+Appium】开展自动化测试(5)appium元素定位常用方法

news2025/7/20 20:57:07

         目录

前言

一,使用uiautomatorview对app页面截图,查看元素属性

二,appium移动端自动化常用的元素定位方法

1,find_element_by_id()

2,find_element_by_class_name()

3,find_element_by_xpath()

三,总结。

结语


前言

对于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】咨询

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

D-014 温度传感器硬件电路设计

温度传感器硬件电路设计1 简介1.1 温度湿度传感器DHT111.2 温度传感器DS18B202 电路实战3 温度传感器芯片1 简介 温度传感器是指能感受温度并转换成可用输出信号的传感器。温度传感器是温度测量仪表的核心部分,品种繁多。常见的温度传感器有: 1.1 温度…

PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八]

PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八] 原项目链接:fork一下即可:https://aistudio.baidu.com/aistudio/projectdetail/5096910?contributionType1 相关项目参考:(其余图神经网络相关项目见主页) …

你理解的 ANR 监控可能一直是错的……

主要说了几种主流的卡顿监控方式: 通过开一个子线程不断去轮询主线程。原理就是不断向主线程发送Message,每隔一段时间检查一次刚刚发送的消息是否被处理,如果没被处理,说明这段时间主线程被卡住了。 通过使用系统方法 setMessag…

ADAU1860调试心得(3)接口说明以及硬件搭建步骤

这个板子是我做的,我做了 3 路模拟输入,1 路模拟输出,我做硬件设计从来就是怎么省事怎么来,所以就直接照着ADI给我的参考设计来的,关键电路坚决不创新,抄就完了。来看看接口的布局情况:三个绿色…

HttpClient别说话,用心看

官网:Apache HttpComponents – Apache HttpComponents 常见使用场景:1.爬虫(python相对做爬虫专业,但是java也可以做) 2.与其他应用进行交互时候 注意下,不同的HttpClient的jar包版本,API和包路径有明显不同 先使用JDK原生API请求网页 将控制台的复制保存为html文件 双击打…

vscode配置自定义代码片段模板

目录1、打开vscode,使用快捷键打开搜索面板2、输入snippets, 点击 代码片段:配置用户代码片段3、模板配置3.1 vue模板配置3.2 全局模板配置1、打开vscode,使用快捷键打开搜索面板 win: Ctrl Shift P mac: command Shift P 2、输入snipp…

圆通山美食城旅游发展总体规划

目 录 目 录 - 1 - 第一章 项目背景及区域概况 - 4 - 一、项目开发背景 - 4 - (一)项目区位 - 4 - (二)自然环境条件 - 4 - 1.气候 - 4 - 2.植被 - 5 - (三)社会经济条件 - 5 - 第二章 SWOT分析 - 6 - 一、…

L16物联网ARM开发--开发环境搭建及平台及GPIO口操作平台介绍(day2、3)

目录 一、MDK-ARM环境介绍及安装 二、STM32Cube简介及安装 STM32CubeMX安装 加载固件库 ​编辑 三、 STM32F0存储器映射 四、STM32启动文件分析 略 五、GPIO的基本概念及寄存器介绍1 1、GPIO接口简介 2、GPIO功能复用 3、GPIO寄存器介绍 GPIO工作原理框图: …

android 签名打包 Invalid keystore format,配置JDK,报错javax.xml.bind.JAXBException

如果AndroidStudio版本高,把Gradle JDK换成更高的版本,就解决了。如下,由1.8换成11,解决了。 这个是全局配置 单独配置项目 File ---> Project Structure---->SDK Location ---> Gradle Srttings jdk配置 MAC 安装JD…

上海亚商投顾:沪指重返3100点 房地产板块掀涨停潮

上海亚商投顾前言:无惧大盘大跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪大小指数今日走势分化,沪指低开后震荡走高,重返3100点上方,以中字头为首的权重股…

Vue3 按需引入 Element Plus

本文记录博主亲测在 Vite 创建的 Vue3 项目框架中从0开始安装配置按需引入 Element Plus 的步骤 注:以下配置的示例为 Vite 构建的 Vue3 脚手架项目 Element UI 官方指南 安装所需插件 请在项目根目录打开终端分别执行如下安装指令: 1.安装 Element …

实时车载激光雷达感知的点云深度学习

又来卷这个了,此次调查了神经网络中使用的计算表示与其性能特征之间的关系,提出了现代深度神经网络中用于3D点云处理的LiDAR点云表示的新计算分类法。使用这种分类法,对不同的方法家族进行结构化分析,论文揭示了在计算效率、内存需…

Resnet的在指静脉识别应用与改进

一、《基于改进残差网络的指静脉识别算法》_易芮 2020.5.20 由于指静脉具有区分性的特征在于其细节特征,为了减少网络训练过程中的信息丢失,在网络中采用改进的大卷积层以及BottleNeck模块. ResNet网络模型采用残差结构和跳跃连接的方式缓解了随着网络的加深而…

web前端-javascript-相等运算符(说明,== 相等运算, != 不相等运算,=== 全等运算,!== 不全等 运算)

文章目录相等运算符1. 说明2. 相等运算2.1. 当使用来比较两个值时,如果值的类型不同,则会自动进行类型转换,将其转换为相同的类型然后再比较2.2. undefined 衍生自 null2.3. NaN 不和任何值相等,包括他本身3. ! 不相等运算4. 全…

【无百度智能云与实体经济“双向奔赴”: 一场1+1>2的双赢 标题】

实体经济,已经成为检验科技企业潜力的试金石。 在最近的财报季中,各家大厂的财报里“实体经济”都是关键字眼,已经成为各家心照不宣的共同目的地。 当然,条条大路通罗马。每一家的战略思路和打法都不一样。11月22日,…

数据结构题目收录(二十四)

1、在将序列(6,1,5,9,8,4,7)建成大根堆时,正确的序列变化过程是()。 A:6,1,7,9,8,4,5->6,9,7,1,8,4,5->9,6,7,1,8,4,5->9,8,7,1,6,4,5B:6,9,5,1,8,4,7->6,9,7,1,8,4,5->9,6,7,1,8,4,5->9,8,7,1,6,4…

【TUN模式】对QQ或者微信域名相关的网站访问非常慢、图片加载不出来、网页空白的解决方案

一、问题背景 最近在电脑上登录微信时,或者浏览微信公众号的文章时,经常出现卡顿得出不来图片的情况,即使出来了也是排版异常。 二、研究现状(哈哈哈哈科研人的写作习惯?) 目前网上有些大咖对这个问…

qt 实现PDF阅读器

1、前言 查阅资料可发现,网上的几种pdf阅读器的实现,几乎大多依赖的第三方库,这里就不做介绍了。 qt 自带的关于pdf的显示:pdfwriter、printpreviewwidget,分别为创建pdf 和 打印预览pdf。由此,后者似乎满足…

快速上手Python命令行模块Click

关于Click? 说下 Click 模块是干啥的,简单说,它就是把我们的 Python 脚本的一些函数,通过 添加带有 Click 关键字的装饰器进行装饰进而将函数调用的形式转化为命令行传参的形式然后执行。听不懂也没关系,我们会一步一步来&#x…

【OpenGL开发】VS2017+nuget配置OpenGL开发环境

文章目录1、简介1.1 先决条件1.2 查找并安装包1.3 卸载软件包1.4 更新包1.5 管理解决方案的包1.6 “合并”选项卡2、nuget配置程序源2.1 在线源2.2 本地源3、nuget安装库3.1 nuget安装nupengl.core(C)3.2 nuget安装Giawa.OpenGL(C#&#xff0…