简介
乍眼一看, 小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了, 其实不然, 上次介绍和分享的大哥是 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 去定位结果如下:
- user = new Uiobject(new UiSelector().text("请输入淘宝账户"))
- user.setText("test")
这两句话看不懂也没关系, 因为我们接下来讲的是 appium 已经对他进行了封装的方法, 这里只是让你看一下他原始方法是怎么做的. 首先他会根据你的定位信息 new 一个对象出来, 然后再在你 new 的对象之上进行相关操作. 下面我们看一下在 appium 中的实现方法:
- ele = self.driver.find_element_by_android_uiautomator('new UiSelector().text(" 请输入淘宝账户 ")')
- ele.send_keys("123")
对比两种代码的写法, 我们可以发现他们的相同之处只是最后的定位信息是一样的, 即: new UiSelector().text("请输入淘宝账户"), 这句话是什么意思呢? 简单的话就是根据一定条件来查找元素, 我们这里的条件就是 text 属性为 "请输入淘宝账户", 再根据图片去理解是不是很容易呢? Android uiautomator 的元素定位其实和 appium 的定位一样, 或者说它比 appium 的定位方式更加多以及更加适用, 并不是只有这一个, 它也不仅支持 className,id 等定位, 而且还支持模糊匹配进行定位, 这样是不是感觉更高大上呢? 下面我们简单介绍一下这几种定位方式.
2 ,uiautomator text 模糊定位
模糊定位故名思义, 通过 text 的部分信息就能够进行定位, 我们直接看代码:
- ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textContains(" 请输入淘 ")')
- ele.send_keys("123")
在上面的代码中我们只是将. text()的方法变成了. textContains(), 在方法中传入模糊的数据就好. 看到这里是否有人思考过一个问题, 既然有类似的模糊寻找, 那么有没有像正则表达式一样的查找呢? 答案是肯定的, 看我们下面的方法.
3, textMatches 正则匹配查找
textMatches 故名思义就是通过正则的来进行查找定位, 他也是通过 text 的属性来进行正则匹配, 我们直接看代码:
- ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^ 请输入淘.*")')
- ele.send_keys("123")
上面匹配的一些信息可能一些刚做测试的小伙伴不是很了解, 这个不要紧, 下来可以搜索一下正则表达式教程, 稍微了解一下就可以.
4, uiautomator resourceID 定位
resourceId 定位和 appium 封装好的 id 定位是一样的, 只是这里将写法变成了 uiautomator 的写法而已, 看下面代码:
- ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.taobao.taobao:id/aliuser_login_account_et")')
- ele.send_keys('234')
通过上面的代码和之前的代码对比大家可能发现其实他们前面都是一样的, 只是在定位的时候发生了一些变化, text 变换成了 resourceID 即可, 也就是页面对象属性的信息进行变更了, 其他方法都是一样. 下面其他方法我就不浪费篇幅, 只给大家做一个简单的案例展示.
5, resourceIDMatches 定位
通过 id 进行正则匹配定位
- ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".+aliuser_login_account_et")')
- ele.send_keys('234')
6,uiautomator className 定位
通过调用 Android uiautomator 使用 className 进行定位
- ele = self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')
- ele.send_keys('234')
7, uiautomator classNameMatches 定位
通过 className 正则匹配进行定位
- ele = self.driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches (".*EditText")')
- 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