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

简介

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

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

支持宏哥的朋友们和宏哥的宏粉记得点波推荐哦,您的肯定就是我进步的动力。宏哥先在这里给您道谢了,谢您嘞~~

个人公众号

微信群

原文地址:https://www.cnblogs.com/du-hong/p/11121417.html

时间: 2024-07-31 11:58:28

Appium+python自动化(十二)- Android UIAutomator终极定位凶“胸”器(七)(超详解)的相关文章

Appium+python自动化(二)- 环境搭建—下(超详解)

简介 宏哥的人品还算说得过去,虽然很久没有搭建环境了,但是换了新电脑设备,一气呵成,将android的测试开发环境已经搭建准备完毕.上一篇android测试开发环境已经准备好, 那么接下来就是appium的环境安装和搭建了. 嘿嘿!宏哥和小伙伴们开个玩笑,不要觉得自人品不好,就不会成功那都是骗人的.搭建环境和人品半毛钱关系也没有,搭建环境环境安装过程中切勿浮躁,静下心来一个一个慢慢地按照步骤一个个来. 遇到问题解决问题即可.宏哥倒是想遇到问题了,可是问题死活不找宏哥,怕被宏哥KO掉了,当然你们遇

Appium+Python 自动化测试之二:启动APP(Android篇)

前一篇写了环境安装,这篇记录是记录如何启动APP以及启动APP之前要做哪些事. Appium 启动APP至少需要5个参数,分别是'platformName','platformVersion','deviceName'.'appPackage'.'appActivity' 这几个参数如何得来的呢,下面一步一步为大家讲解 platformName,我们不是要玩Android app自动化测试吗,所以这个platformName值就是android: platformVersion就是Android

Appium+python自动化(二十一)- 让猴子按你指令大闹手机,让你成为耍猴高手(超详解)

简介 一年一度的暑假如期而至,每年必不可少的,便是<西游记>这部经典电视连续剧的播出,作为一名90后,对于这部经典剧的情谊,就是观看已成为一种习惯.依然深刻的记得,小时候妈妈为了催促我睡觉,而关掉我的<西游记>,那种哀求不成继而绝望的感觉,至今记忆犹新.长大后只要得空在家,哪怕手里做着其他的事情,也要把电视开着,听一听<西游记>.“你挑着担,我牵着马,迎来日出,送走晚霞——”这首基本人人能唱几句的歌曲,陪着我们一代又一代人,走过童年,青年和少年,甚至中年,或许还有将来的

appium+python自动化98-非select弹出选择框定位解决

前言 遇到问题:document.getElementsByClassName(...)[0] is undefined 选择框如果是select标签的,可以直接用select专用的方法去定位点击操作.其它不是select选择框的时候,那就按正常操作步骤先点输入框,再点选项就行了. 可是有些选择框就是不听话,你会发现用selenium死活定位不到,这个时候只能用万能的js来解决了. input选择框 1.先看下弹出框的常见,如下这种 2.查看元素属性,是input标签,并且是readonly属性

Appium+python自动化19-iOS模拟器(iOS Simulator)安装自家APP

前言 做过iOS上app测试的小伙伴应该都知道,普通用户安装app都是从appstore下载安装,安装测试版本的app,一般就是开发给的二维码扫码安装, 或者开发给个.ipa的安装包文件,通过itools安装.对于没有iPhone真机的小伙伴,想在iOS模拟器上安装app测试可不是那么容易的事情. 一.启动iOS Simulator 1.Xcode>Open Developer Tool>iOS Simulator,打开后在hardware里面选对应的iPhone版本就能启动模拟器了 2.第二

初学 Python(十二)——高阶函数

初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 称为高阶函数 ''' #函数作参 def f(x): return x*x #map函数为内置函数,意思为将第二个参数的list作用到f函数中 #最后的结果为一个list print map(f,[1,2,3,4,5]) #reduce函数为内置函数,意思将第二参数的序列作用到add函数值 #将结

Appium+python自动化

名称 链接地址 Appium+python自动化8-Appium Python API(上) http://mp.weixin.qq.com/s/WvpT5oRrYY22avI95FuypQ Appium+python自动化8-Appium Python API(下) http://mp.weixin.qq.com/s/rGWWf9m9-6n-J7KaGVlqoA Appium+python自动化9-SDK Manager http://mp.weixin.qq.com/s/wGyfXAwJ9M

appium+python自动化50-生成定位对象模板templet(jinja2)

前言 每次自己写pageobject定位元素对象太繁琐,格式都差不多,只是换个定位方法,这种就可以才有模板的方式,批量生成pageobject定位元素对象的模板 python里面生成模板有两个模块可以选择:templet和mako 简单来说,本篇实现的目的是用代码去自动生成代码,做到代码自动化 接着上一篇讲:appium+python自动化49-yaml管理定位元素 jinja2简介 1.jinja2官方文档:官方文档 要了解jinja2,那么需要先理解模板的概念.模板在Python的web开发

Python进阶(十二)----re模块

Python进阶(十二)----re模块 一丶re模块 ? re模块是python将正则表达式封装之后的一个模块.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. #正则表达式: 从一串字符中,找出你想要的字符串. import re ### 单个元字符的匹配 # \W 除了数字 ,字母,中文, 下划线 print(re.findall('\W','dsadas1231 +1-+2*/,.')) # \w 匹配中文,数字,字母,下划线 print(re.findall('\w