当uiautomator遇到xpath和ocr,畅快

导读

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 执行点击操作。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180509G1AJQE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券