当uiautomator遇到xpath和ocr,畅快

2018-05-24   出处:腾讯移动品质中心TMQ  作/译者: tango  

导读


Android 的 UI 测试中,经常要点击某个控件,google 给出了 uiautomator 工具可以方便的查看控件信息,但是写测试用例的时候,仍然经常遇到控件无法获取或者不方便获取的情况,比如:


  • 没有为每个控件属性赋值;


  • 不能通过 xpath 获取控件;


  • 需要操作的元素属于 webview;


  • 不能获取某个元素的父元素、子元素、兄弟元素。


发现腾讯优图的 ocr 可以返回文字所在的区域后,灵光一闪感觉可以用在 uiautoamtor 上,加上一直想要一个可以通过 xpath 获取元素的想法,因此 adbui 诞生了。


adbui 是一个 python 库,可以在 pc 上通过 python 代码执行 adb 命令,基于 腾讯优图的 ocr 识别和 lxml 对 xml 文件的解析,可以方便的获取需要的 UI 元素。


项目地址:https://github.com/hao1032/adbui 求 star 啊,项目页面已经列出了使用的方式,这里简单列一下。首先使用 pip install adbui 安装库,然后初始一个 device 的对象。


方便的 adb 命令执行:

常用命令的封装:

UI 元素的获取:


通过 by_attr 和 by_xpath 获取的元素,有一个 element 属性,该属性是一个 lxml 的 Element 对象,可以通过该对象获取其父元素、子元素、兄弟元素。


xpath 和 ocr 的支持比较少见,下面介绍 adbui 是如何做到使用 xpath 和 ocr 获取元素。

BY XPATH 的实现


众所周知,google 的 uiautoamtor 获取控件,实际上就是在一个 xml 文件中查找符合要求的 node 节点。


对应的 xml 文件:

由此可以看到,获取的原生的 xml 文件每个 tag 都是 node,不过在显示的时候换成了 class 的最后一个单词。想要使用直观的 xpath 路径,第一步是将 tag 的 name 换成 class 的最后一个单词。


经过上面代码的处理后,xml 的 tag name 都已经发生变化。

在 adbui 中使用 lxml 作为 xml 的解析库,因为 lxml 支持 xpath 语法搜索节点。当 tag name 变成想要的样子,然后就能使用 lxml 的 xpath 查找节点。


找到节点后,根据节点的 bounds 属性里面的坐标值,获取元素的 x, y, width, height 值,根据这些值构造一个 UI 对象,UI 对象里面可以放置 click 等想要的方法。

综上,adbui 才能提供方便的调用方式,用来获取想要的 UI。如获取上图麦克风图标,并点击为例,mic_btn 就以 UI 的实例,可以直接调用 click 执行点击操作。

BY OCR 的实现


首先体验一下牛逼的腾讯优图 OCR,http://open.youtu.qq.com/#/char-general

可以看到优图的 OCR,不仅仅可以识别出文字,还给出了文字在图片中的坐标信息,拿到坐标信息使用 adb 命令点击,就是我们想要的结果。


在 adbui 中,首先使用 screencap 截图保存到电脑,由于截图是 png 格式,经常会有上 M 的大小,因此第二步使用 pillow 将 png 格式的图片转换为 jpg 格式(不用保存到电脑)。然后将 jpg 格式的数据交给 ocr 类,将数据通过 POST 请求优图服务,获取上图类似的 json 结果。在结果中检索需要的文字,然后获取相关的位置信息。使用位置信息像 by xpath 一样,构造一个 UI 的实例,然后就可以执行 click 操作了。


如图,爱拍按钮在 View 内部,不能获取其控件的位置,因此使用 by ocr 获取。

最后衷心的提醒大家,如果 ocr 需求的请求量不大,就不要用 tesseract 这样的产品了。在线的 ocr 效果甩它们几条街,特别是本文中的印刷体识别,对优图来说易如反掌。


最后欢迎大家到 github 给 adbui 提建议:


https://github.com/hao1032/adbui


欢迎给测试窝投稿或参与内容翻译工作,请邮件至editors@testwo.com。也欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,并与我们的编辑和其他窝友交流。
137°|1370 人阅读|0 条评论

登录 后发表评论