Robotium GetInfo-弱弱的发布一个之前说要做成 UI 的半成品

剪烛 · 2014年07月23日 · 最后由 卡斯 回复于 2014年07月25日 · 5856 次阅读
本帖已被设为精华帖!

来源和原理,如这个帖子 http://testerhome.com/topics/1050(默默的说一句这段代码不是我写的,也是以前一个前辈给我的)
本来有许多细节诸如 ui 还有一些 bug 需要调整的,但是最近要开始疯忙了,再加上越来越觉得自己基础不扎实,想把这一块赶紧弄完放一下,去深入学下 Android 测试本身的东西。
工具的原理:
1 在手机端调用 robotium 框架获取当前界面的所有 View,存入本地 xml 文件
2 PC 运行界面程序,用 adb 拉取 xml 文件并分析,然后界面展示出来
缺陷: (未来可能的解决方法)
1 界面各种细节需要调整 (重构界面)
2 获取的界面信息实际是一个 list,很不利于查找 (获取成 tree,同时展示成 tree)
3 只展示了截图,当点击具体一个 view 时,没有在截图上标明 (选择一个特定的 view 时,在截图上绘图)
4 需要导入 Robotium 包,操作略麻烦 (直接对 Instrumentation 封装)
5 界面程序是 python 写的,但是环境问题一直没有打包 exe 成功
优点:
1 不需要 root 啊!!!
2 开发如果使用的自定义的组件,可以显示出组件名(在 uiautomatorviewer 里边只会显示基类的类名,hierarchyviewer 未尝试)
3 几乎 100% 可以识别出 id
4 支持将界面信息存储在 PC 本地,并且离线直接读取本地文件
5 手机端提供三个调用入口,方便实现通过脚本自动获取所有所需界面的信息

使用方法:
1 新建一个 Android 测试工程,填好各项配置
2 导入 robotium 框架和 getinfo.jar
robotium 地址:http://www.robotium.cn/download
getInfo.jar 地址:http://pan.baidu.com/s/1ANfL8
请保证该处打钩:

3 getInfo.jar 提供三个方法,在测试脚本中使用其中一个

GetCurrentInfo gci = new GetCurrentInfo(solo);
//每隔5s获取一次界面元素
gci.loopGetInfo();
//每隔time毫秒获取一次界面元素
gci.loopGetInfo(int time);
//获取一次界面元素(loop暂时无用,可以随便赋值)
gci.getCurrentInfo(boolean loop);

以 gci.loopGetInfo();为例:建立一个普通的测试任务,新建一个测试方法:

public class GetInfoTest extends ActivityInstrumentationTestCase2 {
    private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "yourTestAppPackageName";
    private Solo solo;
    public GetInfoTest() throws ClassNotFoundException {
        super(Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME));
    }
    protected void setUp() throws Exception {
        solo = new Solo(getInstrumentation(), getActivity());
    }
    public void tearDown() throws Exception {...}

    public void testGetInfo() {     
        GetCurrentInfo gci = new GetCurrentInfo(solo);
        gci.loopGetInfo();
    }
}

4 执行该方法,因为 loopGetInfo() 中使用了 while(true) 循环,所有不手动中止测试,会一直运行(最简便的是直接退出被测应用)
你需要做的是,在每个你需要的界面停留至少 5s
5 运行 PC 端程序 getinfoviewer.py
运行之前需要安装环境(哪位同学能帮忙生成下 exe,就不需要这些环境了……):
Python2.7 下载地址:https://www.python.org/downloads/
PyQt4 下载地址:http://www.riverbankcomputing.co.uk/software/pyqt/download/
pyqt 选择对应 python 版本的安装包,如下:

还可以安装个 pyDev 的 eclipse 插件(非必须):
http://sourceforge.net/projects/pydev/files/ 可以百度如果安装和配置 PyDev 插件
解压http://pan.baidu.com/s/15xzZKgetinfoviewer.py,点击开始,执行
需要保证 adb devices 返回只有一个设备,按 ‘检测’ 按钮可以检测设备情况
按理论,步骤 4 和 5 无先后

额……因为调试用的是盒子,所以截图显示不全,如果是手机,是可以显示完全的
6 如何载入本地的信息

ps:如果在测试脚本中使用 gci.getCurrentInfo(boolean loop),并增加脚本,每次新的测试包都可以跑一遍,然后使用文本比对工具查看是否有更改的 UI

这个工具,可能实际并不实用,但是已经基本实现当时所想,也因为这个想法,督促自己学了 Python 和 PyQt,相当于是一个练习之作吧。
半成品作品,等以后工作稳定下来并且闲一点,再更新吧。
有任何建议,bug,请告诉我


已更新 github,多谢关注!

https://github.com/shixue33/GetViewInfo_for_Android

~~(╯﹏╰) b 换了台电脑终于把 32 位的 exe 成功打出来了,已经更新到 github,如果没有 python 和 pyqt 环境也没关系~(≧▽≦)/~啦啦啦

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

UIAutomator 的翻版么?哈哈......大力支持!

  1. adb shell 执行/system/bin/uiautomator dump /data/local/tmp/uidump.xml 2.adb pull 拉出 xml
  2. 解析 xml 展现在界面上

pyqt 打包一下吧~

#1 楼 @qddegtya 其实初衷是为了解决 UIAutomator 有时候无法获取到 id(跟设备有关),和 hierarchyviewer 需要 root
获取是从程序内部获取的,有些情况下,这个工具获取的信息要比 UIAutomator 要准确(我猜的……)
说错请指正(- -Android 系统其实好多不懂)

#3 楼 @shixue33 区别在于,一个是直接通过命令的方式在内部执行,一个是通过内部提供的 server,外部调用执行,这是 uiautomatorviewer 和 hierarchyviewer 最本质的区别,不过还是想说,想法,实践到做出来,非常不错!pyqt 都耍的不错~

能把代码放到 github 上去么?

来我们公司吧,渴求人才

#6 楼 @seveniruby 楼主思路清晰,喜欢折腾,精通 GUI 编程,写工具杠杠的啊。。。

看楼主对 pyqt 颇有实战经验,来参加我的一个项目吧 ! https://github.com/qddegtya/PyQtLab

我拜读下代码,嵌入 sdk 是我赞赏的方式。这个比 Uiautomator 的方式更靠谱。

来我们公司吧,渴求人才

#11 楼 @monkey monkey 你来深圳我找你签名啊

剪烛 #13 · 2014年07月23日 Author

#8 楼 @qddegtya 好,我先学下 github 怎么用

#13 楼 @shixue33 绝对没有问题,我给你跪签了!!!

#16 楼 @shixue33 mac 端的 app 我已经打包好了。

剪烛 #13 · 2014年07月23日 Author

#17 楼 @qddegtya 能否试下可以正常使用吗?

#18 楼 @shixue33 你放心好了,我打包的时候都是测试过的~ dmg 安装文件我已经推送到 github 上了,我给你 pull request 了

#20 楼 @shixue33 pyqt4 有点大而已,打包下来的 dmg 19mb,不过不影响使用。

剪烛 #17 · 2014年07月23日 Author

#21 楼 @qddegtya !!!! 你整理得好好……

@ 几位老大,建议吸收 shixue 为 testerhome Github 管理员…

很效率啊

我觉得界面上可以支持多元化,我记得以前腾讯出过一个产品,可以在本地用 html5 生成原生的GUI。
我更建议这个做成一个网络服务

#27 楼 @seveniruby 多元化是指?

#27 楼 @seveniruby @shixue33 @qddegtya 做为 Milestone 2 吧。 目前代码实现的还不是很面向可插拔。

#28 楼 @qddegtya
通过 adb 发送信息是一种。直接发送到网络上也是一种方式。
展现上,可以支持 GUI,也可以支持 web 端。

比如可以做个小网站,把 jar 获取的信息直接发送到网络上,通过网站来操作。 这个网站也可以是搭建在本地的应用。

#30 楼 @seveniruby 嗯 这个还是比较容易的。

#31 楼 @lihuazhang 这样的扩展性就更好了。html 的展现比 Qt 丰富些。

#32 楼 @seveniruby 原来是指这个~

剪烛 #34 · 2014年07月24日 Author

#30 楼 @seveniruby 直接发网络,是否 json 比 xml 更好?

剪烛 #35 · 2014年07月24日 Author

#29 楼 @lihuazhang 恩。可插拔是需要满足什么?

39楼 已删除

#34 楼 @shixue33 是的,我只是提个大方向,Qt 的方式没法自动化,最起码 web 方式和接口方式可以很容易的跟持续集成结合。比如我用你的 jar 就可以扩展一个自动遍历服务了,或者其他的什么服务。 Qt 容易把功能限制的太死。

剪烛 #31 · 2014年07月24日 Author

#37 楼 @seveniruby !!!!!!!!!!!!!!!!!!!!!!

剪烛 #40 · 2014年07月24日 Author

#39 楼 @seveniruby 没有,就是觉得,原来还可以这样……

剪烛 #26 · 2014年07月24日 Author

#39 楼 @seveniruby 好,我晚上回去开写

#41 楼 @shixue33 不用这么拼命啊,慢慢来。 架构良好的框架更容易被更多人接受和参与

剪烛 #35 · 2014年07月24日 Author

#42 楼 @seveniruby =。=这就是没有男朋友的害处

#43 楼 @shixue33 我感觉论坛上的汉子们要沸腾了

纳尼

46楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册