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

news2024/11/28 20:34:58

简介

      乍眼一看,小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了,其实不然,上次介绍和分享的大哥是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调试撤销权限,在重新获取

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


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战


四、App自动化项目实战

五、一线大厂简历


六、测试开发DevOps体系

七、常用自动化测试工具


八、JMeter性能测试

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

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

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

相关文章

小程序控制台警告:DevTools failed to load SourceMap(控制台报错DevTools 无法加载来源映射)

在调试项目的时候,控制台报错:**DevTools failed to load SourceMap: Could not load content for http://xxx.js. 这段报错的意思是dev工具未能成功加载source map(文件映射)。这里的报错实际上和项目本身的代码没有任何关系,而是…

基于 Fedora 38 的预期版本 Nobara 38 发布

导读基于 Fedora 38 的预期版本 Nobara 38 终于发布了,它带来了一系列用户友好的修复和功能增强。Nobara 是 Fedora Linux 的修改版本,旨在解决用户面临的常见问题,并提供开箱即用的顺滑的游戏、流媒体和内容创建体验。凭借一系列附加软件包和…

HTTP 缓存机制 强制缓存/协商缓存

Web 缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存。 浏览器缓存也包含很多内容: HTTP 缓存、indexDB、cookie、localstorage 等等。这里我们只讨论 HTTP 缓存相关内容。 在具体了解 HTTP …

美国电动汽车公司Lucid在中国市场的投资机会

来源:猛兽财经 作者:猛兽财经 总结: (1)Lucid计划进入快速增长的中国电动汽车市场,未来可能会加速交付和收入增长。 (2)中国人口众多,电动汽车采用率高,政府…

深度学习开发环境

Ubuntu搭建深度学习开发环境(Pytorch Tensorflow GPU版本) 显卡驱动系列 深度学习主要涉及到显卡的使用(如开发时使用GPU版本库,就需要提前安装好显卡驱动方可使用),所以这里主要说明显卡驱动的安装。 显卡驱动(Driver) | 官网:显卡驱动下载CUDA(NVID…

汤姆猫+AI求IP“翻红”?股东年内忙减持

作为初代手机宠物陪伴游戏,“会说话的汤姆猫”曾在全球积累了大量粉丝,汤姆猫IP也成为一代经典。2017年,A股上市公司金科文化将诞生自海外“汤姆猫”收入麾下。你或许不知道,汤姆猫已成为中国A股市场的一只股票代码。 在金科文化…

曲师大2023大一新生排位赛-B.Sort题解

题目描述 插入排序是一种非常常见且简单的排序算法。王同学是一名大一的新生,今天许师哥刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 ,则插入排序可以以 的时间复杂度完成长度为 n� 的数组的排序。不妨假设这 n 个数字分…

如何将大批量将行驶证合并转为excel?

我们知道,金鸣识别小程序和网页在线版都支持将行驶证转为excel,但这二种方案只适合小量、零星的转换(小程序只能一次提交4张图片,网页在线版只能一次提交5张),要想大批量识别,就要下载安装金鸣识…

栈与队列 理论基础

我们都知道栈和队列是STL(C标准库)里面的两个数据结构。 栈是前进后出,队列是先进先出 C标准库是有多个版本的,要知道我们使用的STL是哪个版本,才能知道对应的栈和队列的实现原理。 那么来介绍一下,三个最…

springboot项目自定义注解+Aop实现收集日志

一 工程结构 二 配置 2.1 配置pom <!--spring boot的启动类 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.…

Sentinel的线程隔离和熔断降级

上一节整理了Sentinel的限流&#xff0c;限流可以降低微服务的负载&#xff0c;避免因为高并发而故障&#xff0c;进而传递给其他相关服务而引发服务雪崩。以上仅为避免服务故障&#xff0c;而当某个服务真正故障时&#xff0c;如何处理才能防止服务雪崩&#xff1f; ⇒ Sentin…

二十一、vm 适配

目录&#xff1a; 1. 基础准备 2. 详解 一、基础准备 目的&#xff1a;前面我们通过0.1333vm x 对应的设计图像素&#xff0c;找到vm值&#xff0c;这个方法不准确&#xff0c;且操作复杂&#xff0c;有没有什么优化方法呢&#xff1f; 解决&#xff1a;vw的适配&#xff08;在…

Bard:一个可以描述图像的人工智能

Bard 是一个大型语言模型&#xff0c;可以对各种提示和问题进行交流和生成类似人类的文本。它接受了大量的文字和代码训练&#xff0c;可以生成文本、翻译语言、编写不同类型的创意内容&#xff0c;并以信息丰富的方式回答你的问题。 Bard 还可以识别图像。它可以识别图像中的…

python编程语言之进阶语法

迭代器 可迭代对象 讲迭代器之前&#xff0c;我们先了解一个概念&#xff1a;可迭代对象(Iterable)。 那么什么是可迭代&#xff1f;什么是对象&#xff1f; 迭代(Iteration)&#xff0c;是指通过遍历获取某容器内所有元素&#xff0c;特指遍历获取这个动作。 可迭代 (iter…

EasyCVR录像阈值配置未生效,是什么原因?

有用户反馈&#xff0c;在平台中设置了录像阈值不生效&#xff0c;导致磁盘爆满。针对该反馈&#xff0c;我们立即进行了排查。 EasyCVR基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;在视频能力上&#xff0c;平台可实现视频直播、录像、回放、检…

用C语言对学生成绩进行排序(归并排序与基数排序)

一.前言 我们内部排序已经学了插入排序&#xff08;直接插入排序、折半插入排序、希尔排序&#xff09;&#xff0c;交换排序&#xff08;冒泡排序、快速排序&#xff09;&#xff0c;选择排序&#xff08;简单选择排序、堆排序&#xff09;&#xff0c;这些都属于内部排序&…

ShardingSphere分库分表实战之绑定表

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

DAY48:动态规划(十二)完全平方数(类似零钱兑换)+单词拆分(注意背包思路!)

文章目录 279.完全平方数&#xff08;类似零钱兑换&#xff09;思路DP数组含义递推公式初始化遍历顺序 最开始的写法&#xff1a;有1个用例没过修改完整版总结 139.单词拆分&#xff08;递推公式注意&#xff09;思路1&#xff1a;遍历单词分割点DP数组含义递推公式初始化遍历顺…

基于Java+SpringBoot+Vue前后端分离旅游网站详细设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

导航菜单 改变背景色

直接参考官网上的案例即可 //active-text-color 点击时修改字体颜色 // background-color 背景色 // text-color 字体颜色<el-menudefault-active"2"class"el-menu-vertical-demo"open"handleOpen"close"handleClose"background…