UiAutomator 基于 uiautomator 与 shell 的自动化测试工具

bauul · October 12, 2015 · Last by bauul replied at July 02, 2018 · 3392 hits
本帖已被设为精华帖!

起因

  今年年初的时候,公司让写个做自动化测试的工具,真头疼!我都没做过这,心里怕怕的,但交待我来做,我又不能不接,罢了,做!
  因为没做过,我只学过些java,都毕业三四年了,哪记得那多,想着用python做,听说python容易上手,找了本python做GUI的书,全英文的,看了一遍,云里雾里的,没概念。思考再三,还是用java做,毕竟还有点基础不是,找了好几本用java做GUI的书,最后还是选中--《Java开发利器:Eclipse SWT/Jface核心应用》,这本书比较详细,靠谱。

怎么做

  这个工具点坐标就可以了吗?NO,要点控件,此前已经自学过uiautomator,也写过许多shell做自动化测试的脚本(Shell+sendevent),所以我考虑将uiautomator与shell结合起来做,写出来的测试脚本是一个个的shell脚本,用java做电脑端编写自动化测试脚本的工具。点击控件,我所想到的实现方法有两种:

一种是:

  通过uiautomator,通过传递参数到uiautomator脚本,将一些通用的方法,写出来,供shell来调用,比如我们可以在eclipse中,写一个ClickByText方法,然后在shell中调用,uiautomator runtest FileName.jar -c PackageName.ClassName -e text Phone,来点击text属性为Phone的控件。

    public UiObject objByText(String text) throws UiObjectNotFoundException{
    
      UiObject obj = new UiObject(new UiSelector().textMatches(text));
      return obj;
    }
另一种是

  通过uiautomator dump生成xml文件,通过shell分析这个xml档,方法可见:[https://testerhome.com/topics/2806]

  所以,写出来的测试脚本,是shell脚本,我写了一个Template.sh,这里面包含所有的通用操作,比如Click,ClickByText,PinchIn等等,其他的测试用例,都去调用这里面的方法。当然,不仅仅包含这些按键的方法,还包含测试设备状态的一些方法,比如抓取某一进程memory(使用procrank命令)使用的大小保存到一xls表格中,等
  

  可以点击控件,但是不能在本工具查看控件,控件查看需要通过uiautomatorviewer这个工具,被同仁反鐀,不方便,虽然自我感觉还行啊!我在eclipse中用uiautomator写测试用例的时候,也是要看uiautomatorviewer的控件啊,习惯了,所以不觉得有什么问题。没有用过的同仁就觉得,呀,你为什么不能把uiautomatorviewer上面显示的控件信息,显示到你的工具上去呢,那样多好。

优点

  对比uiautomator,我这还有一优点呢,选中一行,单击debug即可单步调试,而在eclipse中用uiautomator写测试用例时,则需要编译,push,最后才可执行

缺点

  因为测试用例都是Shell脚本,所以可以在后台跑,但是不能进sleep模式,进sleep模式,shell会被挂起,直到唤醒后继续run

后来

  后来,我在testerhome看到了 @cpfeng0124的帖子[https://testerhome.com/topics/2632] ,这与我的想法刚好相反,我想在我的工具上加入uiautomatorviewer显示控件的信息,而这个贴子则是在uiautomatorviewer的基础上,加入了各种操作。但我没有找到uiautomatorviewer的源码,在群里一位叫文武不辉的同学的帮助下,找到了uiautomatorviewer的源码,然后我又基于uiautomatorviewer的源码,做了一新工具:

在开发过程中,就一同事用,各种bug,被她各种吐槽,各种不爽,唉,不过还好,虽然做的慢,但还是做出来了。

碰到的一些问题(问题非常多,挑一两个主要的讲吧)

如何在点击控件时,自动获取控件的instance信息?

  开始我默认是点击instance为1的控件,后台在开会时,同事问我,是否可以自动抓到第几个控件,比如在上图中,我们看到当前选中的是第三个text属性为Phone的控件,工具就会在选择Attribution operation > Click > text之后,自动点击text属性为Phone的第三个控件,并刷新点击操作后的屏幕与控件信息到工具上来,我在uiautomatorviewer的源码uiautomatorviewer.java中加入了一列,用来显示text,resource-id及content-desc是第几个,这里是判断text属性是第几个控件的代码,

                     if (((AttributePair) element).key.equals("text")) {

List<BasicTreeNode> totalTreeNode = mModel.getmNodelist();

for (int i=0; i<totalTreeNode.size(); i++) {

BasicTreeNode selectedNode = mModel.getSelectedNode();

if (selectedNode.equals(totalTreeNode.get(i))) {
//查找时,如果找到了当前选中的控件,则停止查找
break;
} else {

Object [] selectedElement = totalTreeNode.get(i).getAttributesArray();

for (int j=0; j<selectedElement.length; j++) {

if (((AttributePair) selectedElement[j]).key.equals("text")) {

                //如果某一控件的text属性与当前选中的控件的text属性相同,则instance变量+1
if (((AttributePair) selectedElement[j]).value.equals(((AttributePair) element).value)) {
instance++;
}
}
}
}
}

return String.valueOf(instance);
}
在使用uiautomator dump过程中发现,有时会发生uiaumator进程死锁,导致我的测试脚本卡死,不再继续执行,这里我通过shell判断,如果2秒钟后,进程仍在,将它杀掉:
KillUiautomator()
{
uiautomatorPID=`busybox ps|busybox grep uiautomator|busybox grep -v grep|busybox awk '{print $1}'`
if test ! "$uiautomatorPID" == ""
then
kill -9 $uiautomatorPID
fi
}

#这里调用的其实是uiautomator 中的UiDevice.getInstance().dumpWindowHierarchy(fileName);方法
uiautomator runtest /data/local/tmp/CommonAction.jar -c com.fih.liguo.GetAttributionXML&
busybox usleep 2000000
KillUiautomator

感谢

  首先,得感谢,让你最先痛苦的人,是公司的上司吧,如果不是他,我也不打算做这工具,其实公司另一部门有一自动化工具,这个就不细说了。然后要感谢TesterHome让我从不同的大牛的帖子中学到了许多知识与想法,感谢我那一直吐槽我的同事,催我改进工具啊!

未来

  这个工具,还可以继续优化,编辑区域可以优化,做成shell脚本代码高亮,伸缩显示等效果,可以将ddms的部分功能移植过来,等等

接下来的学习计划

  在学习uiautomator2.0,同时想学一下espresso,以及html+css+javascript,用来做漂亮点的自动化测试报告。

uiautomatorviewer源码

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 42 条回复 时间 点赞

不错,很棒的gui工具!

PS: testerhome拼错了,少了 er

bauul #2 · October 12, 2015 作者

#1楼 @chenhengjie123 尴尬,已更新,既然还可以,请点击“喜欢”😍

没看明白,这个工具具体是如何进行自动化测试的?又怎么跟shell结合起来的?是否能详细分享一下?

4Floor has been deleted

挺好的,如果能把人工操作转化成脚本,然后以后可以批量执行,相信用的人会更多~

bauul #6 · October 12, 2015 作者

#3楼 @happystone 更新了下,有问题可以回我,喜欢,请点击“喜欢”,嘿嘿

bauul #7 · October 12, 2015 作者

#5楼 @yangchengtest 你所说的,人工操作转成脚本,是说将逻辑测试转成脚本吗?还是怎么样?批量执行没有问题呀,这是shell 测试脚本,批量不成问题的。

#6楼 @carl 。。。分享技术,内敛宣传。

@carl 最好是将可视化的操作转化可以重复操作的内容。比如按键用UI操作,可以自动转成脚本,后续可以重复执行。仅供参考。

bauul #10 · October 13, 2015 作者

#9楼 @yangchengtest 现在按键(我这里指Hardkey,比如Power/Menu/Volume Down/Volume Up)用的是keyevent,看过uiautomator的源码,也是用的这个啊!然后你说的的意思,我还是不太明白,可以讲的再清楚些么?感谢

对比自己和 @carl 的动手能力,惭愧啊。
虽然自己手上有很多资源,但是没做出什么像样的东西。
感谢 @carl 的分享啊。
(P.S:我是文武不辉)

很厉害!~

_^ 赞一个

@carl 我的意思是比如你一个按键就可以自动生成一条或数条脚本语言,然后这个脚本语言可以重复执行,这样不就啥也不会的人也可以跑脚本了么。
比如CLICK某个元素,就是CLICK ITEM类似这种翻译过的。

bauul #15 · October 13, 2015 作者

#13楼 @shixue33 哈哈,谢谢,听说咱们公司接下来还有一个3D的项目呢,估计还会再合作,嘿嘿

bauul #16 · October 13, 2015 作者

#14楼 @yangchengtest 这是可以的,现在工具本身就可以给不会的人用了,上手还是容易的,再次翻译,我在考虑有没有必要,封装太多,会导致效率低下的

工具放上来,让大家使用一下啊

bauul #18 · October 14, 2015 作者

#17楼 @562243985 还不够好

工具能分享出来么

bauul #21 · October 21, 2015 作者

#20楼 @itboyst
还不够好,做得自己能稍微满意就分享出来

屌屌的

楼主,看你说在研究uiautomator 2.0,打算做漂亮一些的自动化报告,有什么进展么?我也想了解一下这方面的东西,./gradew cC可以生成网页报告,界面还算漂亮。但如果需要执行部分用例就不好弄了,你有什么看法?

bauul #24 · January 28, 2016 作者

#23楼 @apple1987 初步完成了已经,需要学习html, css, javascript的知识

可否分享一下,O(∩_∩)O,也想学习一下

你这里的调试 和运行时 每次 push 那个jar包到 手机里么

bauul #27 · March 30, 2016 作者

#26楼 @taki
不需要啊,做一个通用版的操作就行,用例是shell脚本,直接调用。所以只需要push一次就OK

#27楼 @carl 每次执行 uiautomator 脚本是吧

bauul #29 · March 30, 2016 作者

#28楼 @taki 是shell脚本

#29楼 @carl 安卓的shell??

bauul #31 · March 30, 2016 作者

#30楼 @taki
安卓的shell?这个问题很怪,不过或许可以这么说,可以借助busybox

#31楼 @carl 一直没做过移动端的东西,所以说到shell,第一时间想到的就是 linux 服务器的shell

bauul #33 · March 30, 2016 作者

#32楼 @taki
嗯,Android与linux是有渊源的,Android的内核是从linux移植过来的。那你之前 做什么?

#33楼 @carl 我知道安卓是基于linux ,之前都做 PC端 的, 接口的 , 开发工具 ,开发系统什么的,最近想学学appium才有点接触

bauul #35 · March 30, 2016 作者

#34楼 @taki
哈哈,互相学习

@carl 能够把该工具分享,互相学习一下呗

bauul #37 · May 13, 2016 作者

#36楼 @yangmingquan6
等到6月底争取开源

38Floor has been deleted

前辈,我是小米工程师,想加个微信好友交流下,我的微信是shaoxy1992.

bauul #40 · May 02, 2017 作者
翔宇 回复

你好,加了

恒温 感谢 fir.im —— 结果公布 中提及了此贴 05 Jun 13:20
Author only
bauul #43 · July 02, 2018 作者
无言祖 回复

嗯,4年

Author only
bauul #45 · July 02, 2018 作者
无言祖 回复

😊

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up