Appium+python自动化(十二)- Android UIAutomator终极定位凶器(超详解)

宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入

简介

      乍眼一看,小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了,其实不然,上次介绍和分享的大哥是uiautomatorviewer,是一款定位工具。今天介绍的是一个java库,提供执行自动化测试的各种API。

  Android团队在4.1版本(API 16)中推出了一款全新的UI自动化测试工具UiAutomator,用来帮助开发人员更有效率的完成App的Debug工作,同时对于测试人员也是一大福音,为什么这么说呢?

QA:“那个谁谁谁,我刚刚操作的时候,我发现了一个bug,你写的App打开A页面,再打开B页面有时会出现闪屏问题。(内心独白:我去,这个奇怪的问题”

DEV:“嗯?还有这样的问题,麻烦你复现给我看看。(内心独白:吹牛逼,我这么牛逼,我写的App怎么会可能有bug,一定是你用的姿势不对)”

QA:一段忙碌的神操作之后...“咦,怎么不出现了?(内心独白:我去,怎么搞的啊,关键时刻掉链子,你倒是快点出来,让我丢脸丢大发了)”

DEV:“那你先回去吧,复现再告诉我。(内心独白:呵呵,和我心里想的一样,我写的怎么可能会有bug呢)”

几天过去了......

QA:满心欢喜状,那个谁谁谁“上次那个问题我复现了,操作给你看....我去,怎么又不出现了!(内心独白:一脸淫笑,我说有bug,你让我复现,这又回复现出来吧,刚想完。。。。。额。又看不到了,怎么搞的,气死我)”

DEV:“是不是设备有问题,你换个设备再试试呢?(内心独白:小样,都和你说了没有bug你不信非要复现)”

QA:“宝宝心里苦,但是宝宝不说!(内心独白:这个。唉。。。。。。。)”

有了UiAutomator之后:

QA:“我发现了一个bug,你写的App打开A页面,再打开B页面有时会出现闪屏问题。”

DEV:“这个简单,我用UiAutomator写个测试用例,分分钟解决。(内心独白:牛气哄哄的)”

QA:“厉害了Word哥!(内心独白:真特么牛逼,爱死你了)”

全剧终!

UiAutomator提供了以下两种工具来支持UI自动化测试:

  • uiautomatorviewer:用来分析UI控件的图形界面工具,位于SDK目录下的tools文件夹中。

  • uiautomator:一个java库,提供执行自动化测试的各种API。

1、android uiautomator text定位

  可能有人不知道为什么说android uiautomator是终极定位,而且android uiautomator和appium有什么关系呢?如果之前写了一些脚本,发现有的时候一些元素不能够很好的定位时,那么就需要采用android uiautomator去定位,它是一种非常强有力的定位方式,原理是通过android 自带的android uiautomator的类库去查找元素,都直接用官方公布出来的方法去找了还能找不到吗?

  首先和宏哥一起看一下下面的图片:

在上面的图片中我们不采用appium封装好的方法,直接使用android 的uiautomator去定位结果如下:

1 user = new Uiobject(new UiSelector().text("请输入淘宝账户"))
2 user.setText("test")

  这两句话看不懂也没关系,因为我们接下来讲的是appium已经对他进行了封装的方法,这里只是让你看一下他原始方法是怎么做的。首先他会根据你的定位信息new一个对象出来,然后再在你new的对象之上进行相关操作。下面我们看一下在appium中的实现方法:

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().text("请输入淘宝账户")')
2 ele.send_keys("123")

  对比两种代码的写法,我们可以发现他们的相同之处只是最后的定位信息是一样的,即:new UiSelector().text("请输入淘宝账户"),这句话是什么意思呢?简单的话就是根据一定条件来查找元素,我们这里的条件就是text属性为“请输入淘宝账户”,再根据图片去理解是不是很容易呢?android uiautomator的元素定位其实和appium的定位一样,或者说它比appium的定位方式更加多以及更加适用,并不是只有这一个,它也不仅支持className、id等定位,而且还支持模糊匹配进行定位,这样是不是感觉更高大上呢?下面我们简单介绍一下这几种定位方式。

2 、uiautomator text模糊定位

  模糊定位故名思义,通过text的部分信息就能够进行定位,我们直接看代码:

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("请输入淘")')
2 ele.send_keys("123")

  在上面的代码中我们只是将.text()的方法变成了.textContains(),在方法中传入模糊的数据就好。看到这里是否有人思考过一个问题,既然有类似的模糊寻找,那么有没有像正则表达式一样的查找呢?答案是肯定的,看我们下面的方法。

3、 textMatches 正则匹配查找

  textMatches故名思义就是通过正则的来进行查找定位,他也是通过text的属性来进行正则匹配,我们直接看代码:

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^请输入淘.*")')
2 ele.send_keys("123")

  上面匹配的一些信息可能一些刚做测试的小伙伴不是很了解,这个不要紧,下来可以搜索一下正则表达式教程,稍微了解一下就可以。

4、 uiautomator resourceID定位

  resourceId定位和appium封装好的id定位是一样的,只是这里将写法变成了uiautomator的写法而已,看下面代码:

1 1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.taobao.taobao:id/aliuser_login_account_et")')
2 2 ele.send_keys('234')

  通过上面的代码和之前的代码对比大家可能发现其实他们前面都是一样的,只是在定位的时候发生了一些变化,text变换成了resourceID即可,也就是页面对象属性的信息进行变更了,其他方法都是一样。下面其他方法我就不浪费篇幅,只给大家做一个简单的案例展示。

5、 resourceIDMatches 定位

  通过id进行正则匹配定位

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".+aliuser_login_account_et")')
2 ele.send_keys('234')

6、uiautomator className定位

  通过调用android uiautomator使用className进行定位

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')
2 ele.send_keys('234')

7、 uiautomator classNameMatches定位

  通过className正则匹配进行定位

1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches (".*EditText")')
2 ele.send_keys('234')

  通过上面的学习我相信大家对uiautomator的定位有一定的了解了,但是我想告诉大家的是这个并不是所有的,还有很多很多的定位方式,这个需要大家在以后不断的学习中去积累,我也不可能把所有的方法都告诉大家,这里只是给大家一个起头,但是我希望大家在学习定位的时候不只是看appium的定位,毕竟他也是封装的uiautomator的定位方式,所以在学习appium的同时把uiautomator去大概学习一下这个很有帮助,并且对以后的提升自己以及工作中重新封装appium有很大的帮助。

8、小结

1、以前运行工具没有问题。今天使用uiautomatorviewer 查看android某些页面元素,出现错误Error obtaining UI hierarchy  Reason: Error taking device screenshot: null 如图:

再网上找了很多解决办法依然没解决

宏哥总结了一下原因:

1、该app不支持该页面的截屏功能所以uiautomatorviewer捕捉不到

2、手机需要重启

3、非原装数据线

4、appium服务异常需要重新连接

5、可以尝试切换USB接口

6、最后可以把手机开发者选项的USB调试撤销权限,在重新获取

最后记住重启再重启解决一切问题,可能这次报错了,但是重启之后就成功了,这个一般是没地方说理的。

  每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 03:强化你的子系统

这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字,英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

docker怎么拉取全部镜像,打包所有镜像

因为docker,所以我把电脑上之前的镜像全部打包出来了 你们也可以打包,我提供一个脚本,你运行即可 export_docker.sh #!/bin/bash# 导出目录 EXPORT_DIR"docker_images_backup" mkdir -p "$EXPORT_DIR"# 获取所有镜像 …

一文看懂!iThenticate查重报告全解读

在科研界,原创性和知识产权保护的重要性不言而喻。iThenticate作为全球领先的文献比对和不端检测工具,为广大科研工作者提供了一道坚实的防线保障。据统计,全球有超过16000家学术机构、出版社、高校与企业使用iThenticate查重系统&#xff0c…

Dubbo-使用zookeeper作为注册中心时节点的概述

本文内容很容易理解,会阐述当dubbo使用zookeeper作为注册中心时候,zookeeper节点是什么样子的 本文的代码使用的dubbo版本是2.7.x,几年前的版本了,但是不影响探究 首先我们创建一个简单的maven项目,然后写出一段dubb…

黑马苍穹外卖2 员工的增查改+异常处理+ThreadLocal

员工管理 新增员工 Controller: PostMapping//post类型的请求ApiOperation("添加员工")public Result save(RequestBody EmployeeDTO employeeDTO) {log.info("新增员工{}", employeeDTO);employeeService.save(employeeDTO);return Result.su…

有监督学习——梯度下降

1. 梯度下降 梯度下降(Gradient Descent)是计算机计算能力有限的条件下启用的逐步逼近、迭代求解方法,在理论上不保证下降求得最优解。 e.g. 假设有三维曲面表达函数空间,长(x)、宽(y)轴为子变量,高(z)是因变量&…

themleaf 页面弹层取值

themleaf 页面弹层取值 创作背景themleaf页面事件onbluronclick 页面参数提交 创作背景 个人在日常开发中,遇到了一个需求页面,页面交互较多,用到的事件也很丰富,特此记录,方便后续查找也方便有需要的开发者采用&…

软件测试期末复习

软件测试期末复习 Author 雨 2024年6月18日 1. 什么是软件测试 从一个通常为无限的执行域中选取合适的有限的测试用例,对程序所期望的行为进行动态验证的活动过程。 2. 软件测试的目的 尽早地发现软件的缺陷 3.什么是测试什么是缺陷 从软件内部看:软件开…

SpringCloudStream原理和深入使用

简单概述 Spring Cloud Stream是一个用于构建与共享消息传递系统连接的高度可扩展的事件驱动型微服务的框架。 应用程序通过inputs或outputs来与Spring Cloud Stream中binder对象交互,binder对象负责与消息中间件交互。也就是说:Spring Cloud Stream能…

探索Web Components

title: 探索Web Components date: 2024/6/16 updated: 2024/6/16 author: cmdragon excerpt: 这篇文章介绍了Web Components技术,它允许开发者创建可复用、封装良好的自定义HTML元素,并直接在浏览器中运行,无需依赖外部库。通过组合HTML模…

多尺度特征提取:原理、应用与挑战

多尺度 多尺度特征提取:原理、应用与挑战**原理****应用****挑战****总结** 多尺度特征提取:原理、应用与挑战 在计算机视觉、自然语言处理和信号处理等领域,有效地捕捉和解析数据的多种尺度特性是至关重要的。多尺度特征提取是一种技术&…

【机器学习】智能创意工厂:机器学习驱动的AIGC,打造未来内容新生态

🚀时空传送门 🔍机器学习在AIGC中的核心技术📕深度学习🎈生成对抗网络(GANs) 🚀机器学习在AIGC中的具体应用🍀图像生成与编辑⭐文本生成与对话系统🌠音频生成与语音合成 …

SpringMVC01-初始SpringMVC

SpringMVC 回顾MVC 什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模…

高通Android 12 右边导航栏改成底部显示

最近同事说需要修改右边导航栏到底部,问怎么搞?然后看下源码尝试下。 1、Android 12修改代码路径 frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java a/frameworks/base/services/core/java/com/android/server/wm/Display…

【LeetCode:2786. 访问数组中的位置使分数最大 + 递归 + 记忆化缓存 + dp】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

电感的本质是什么

什么是电感? 电感器件一般是指螺线圈,由导线圈一圈靠一圈地绕在绝缘管上,绝缘管可以是空心的,也可以包含铁芯或磁粉芯。 为什么把’线’绕成’圈’就是电感? 电感的工作原理非常抽象,为了解释什么是电感…

IntelliJ IDEA 使用 Maven 时不加载本地私服的最新版本快照(snapshot)JAR 包

IntelliJ IDEA 使用 Maven 时不加载本地私服的最新版本快照(snapshot)JAR 包 目录 IntelliJ IDEA 使用 Maven 时不加载本地私服的最新版本快照(snapshot)JAR 包1. 检查 settings.xml2. IDEA Maven 配置3. 强制更新 Snapshot4. 使用…

使用 C# 学习面向对象编程:第 8 部分

抽象方法 亲爱的读者,本文是 OOP 的第四大支柱,也是最后一大支柱。对于 OOP 初学者来说,这很容易让人困惑。因此,我们用非常简单的语言提供了一个示例。 “抽象用于管理复杂性。无法创建抽象类的对象。抽象类用于继承。” 例如…

端口映射工具下载?

天联是一款强大的端口映射工具,它能够帮助用户实现远程数据采集管理、异地统一管理、随时随地协同办公等多种场景的应用。无论您是医药、餐饮、商超等零售行业的企业,还是需要使用OA、CRM、ERP、财务进销存等系统的企业,甚至是使用视频监控设…

Python自动化测试面试题精选(一)

今天大家介绍一些Python自动化测试中常见的面试题,涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容,希望能够帮助你提升自己的水平和信心。 项目相关 什么项目适合做自动化测试? 答:一般来说,适合做自…