自动化工具 基于 Appium 的 App UI 遍历 & Monkey 工具 (支持操作步骤回放)

Justin · 2018年05月06日 · 最后由 思寒_seveniruby 回复于 2018年08月17日 · 8124 次阅读
本帖已被设为精华帖!

UICrawler

https://github.com/lgxqf/UICrawler

基于Appium 1.8.1开发的 App UI遍历 & Monkey 工具(Java版 )

QQ 技术交流群 : 728183683

环境搭建及基本使用说明: https://testerhome.com/topics/14490 (感谢网友harsayer 倾力之作)

2.0 版 功能描述

1.UI遍历及以下功能 Android/iOS

  • 基于深度优先的原则,点击UI上的元素。当发现Crash时会提供操作步骤截图及相应的Log. * Android提供logcat的log. iOS提供系统log及crash相应的ips文件
  • 元素遍历结束或按下Ctrl + C键会生成HTML测试报告。测试报告中汇集了测试统计、log及截图的相应信息
  • 同一个元素只会点击一次(白名单中的元素可能会被多次点击)
  • 支持对输入框的文本输入(需在文件中进行配置 INPUT_TEXT_LIST)
  • 统计每个Activity点击数量(Android)
  • 支持滑动动作
  • 支持根据关键字和控件类型触发Back key(Android)

2.Monkey功能及以下事件 Android/iOS

  • 随机位置点击
  • 通过黑名单控制不想点击的区域
  • 特殊位置点击(需在文件中进行配置)
  • 特殊位置长按10秒(需在文件中进行配置)
  • 任意方向及长度的滑动
  • 触发Home键(Android Only)
  • 触发Back键(Android Only)
  • 重启app
  • 及以下手势操作(位置随机) * 双击 双指放大 双指缩小 拖拽

3.微信小程序

  • 微信小程序 Monkey (iOS & Android)
  • 微信小程序 UI遍历 (Android only)

4.其它功能

  • 运行时间限制
  • 每次点击都会生一个一截图,截图中被点击的位置会用红点标注,方便查找点击位置
  • 当检查到Crash时,为每个Crash提供单独的操作步骤截图和mp4格式的视频文件
  • 生成整体操作步骤视频,方便重现发现的问题
  • 性能数据采集,执行时添加-e参数
  • Android : 每秒采集一次CPU和Memory数据 生成perf_data.txt并写放到influxDB(需单添加-x参数,且influxDB要单独安装)
  • iOS: 要求以appium --session-override --relaxed-security 启动appium, 之后会生成XCode instrument能直接读取的性能数据 详见 https://appiumpro.com/editions/12

5.待开发功能

  • 将性能数据通过grafana显示
  • 支持遍历顺序控制
  • 根据执行步骤重现bug
  • 划动半屏 划动一屏
  • 黑名单支持XPath

运行工具

1.下载Jar包

UICrawler.jar

2.下载配置文件

config.yml

3.根据待测试App修改配置文件中下列各项的值 详情见 Config.md

Android

  • ANDROID_PACKAGE
  • ANDROID_MAIN_ACTIVITY iOS
  • IOS_BUNDLE_ID
  • IOS_BUNDLE_NAME
  • IOS_IPA_NAME Monkey配置项可选, 详情见 Monkey配置

4.启动appium

appium --session-override -p 4723
-p 设定appium server的端口 , 不加参数默认为4723

5.1 运行元素遍历(必须有yml配置文件)

java -jar UICrawler.jar -f config.yml -u udid -t 4723
-u 指定设备udid
-t 指定appium server的端口(此项为可选项,默认值是4723)

5.2 运行 Monkey功能

java -jar UICrawler.jar -f config.yml -u udid -t 4723 -m

5.3 运行微信小程序测试,需修改 MINI_PROGRAM_NAME的值,并按照下面的值设置 CRITICAL_ELEMENT中相应的值,才会启动微信进入小程序

#小程序
MINI_PROGRAM:
MINI_PROGRAM_NAME: 此处值为待测的小程序的名字
MINI_PROGRAM_PROCESS: com.tencent.mm:appbrand1

CRITICAL_ELEMENT:
#Android 微信
ANDROID_PACKAGE: com.tencent.mm
ANDROID_MAIN_ACTIVITY: com.tencent.mm.ui.LauncherUI

#iOS 微信
IOS_BUNDLE_ID: com.tencent.xin
IOS_BUNDLE_NAME: 微信
IOS_IPA_NAME: wechat

查看支持的参数

java -jar UICrawler.jar -h

-a Android package's main activity
-b iOS bundle id
-c Maximum click count
-d Maximum crawler UI depth
-e Record performance data
-f Yaml config file
-h Print this usage information
-i Ignore crash
-l Execution loop count
-m Run monkey
-p Android package name
-r Crawler running time
-t Appium port
-u Device serial
-v Version
-w WDA port for ios
-x Write data to influxDB

一些常用命令

查看设备udid
Android:
adb devices
iOS:
instruments -s devices
idevice_id -l

Android 查看apk Main activity
./aapt dump badging "apk" | grep launchable-activity
aapt 通常在android sdk build-tools目录下
windows中将grep换成findstr
"apk"apk文件路径

配置文件主要可配置项

  • 截图数量控制
  • 黑名单、白名单
  • 限制遍历深度、次数、时间
  • 遍历界面元素的xpath
  • 自动登录的用户名和密码及相应的UI元素ID
  • 待输入文本列表及待输入的控件类型
  • Monkey触发事件类型及比率

注意事项

  • iOS设备一定要打开"开发者选项"里的“Enable UI Automation” https://www.jianshu.com/p/a1d075b3472c
  • iOS测试包必须是debug版的
  • 同时运行多台ios设备时要每台设备要设置不同的IOS_WDA_PORT : 8001-8888

测试报告

共收到 130 条回复 时间 点赞
  • 支持这个工具
  • 对这些不是太了解,工具是否有可以定制预期结果?还是遍历后不crash,就认为达到测试目的了?
  • ps: 顺便吐槽下,leader说不做检查点的自动化没意义,只能呵呵, 真是头发不长,见识也不长.
仅楼主可见
wangchen_neuq 回复

谈不上什么改进,遍历的方法不同 appcrawler做的还是比较完善的 我这个只提供比较基础的遍历功能。再者app cralwer我也没怎以用过。。。

谢谢支持:)

mixure 回复

谢谢支持 这个工具只是简单的点击UI上的元素 发现因元素点击导致的crash问题 比较适用界面复杂 层次比较深的app 至于预期结果能不能定制,我的回答是 预期结果就是不crash :) 不crash也只能说明app基本上还算稳定 ,算是稳定性测试的辅助手段

Justin 回复

懂了;靴靴;

我们公司有个同事给我推了这个工具,这个工具是github上开源的吗?

abelsheng 回复

目前还在测试阶段 还没开源 以后会开源

9楼 已删除

支持,老早之前看到@quqing也写了一个java版本的,后来自己集合这2者也做了一个广度优先的版本

Justin #11 · 2018年05月07日 作者
Unmurphy 回复

有链接吗 发来看看 我也学习学习

Justin #12 · 2018年05月07日 作者

至于区别用了就知道了 实践出真知 哈

Justin #13 · 2018年05月07日 作者
wangchen_neuq 回复

BTW, 那些头发不长 见识不长 又不听别人意见的管理者 确实挺烦人的。。。

14楼 已删除
15楼 已删除
Justin #16 · 2018年05月09日 作者

appcrawler的不太清楚 你可以参考 iosmoney 里面也有截图时加红点

forEach+random搞定这个问题

Justin #18 · 2018年05月09日 作者

等过一阵放出了源码 你可以研究一下 就是调用java的下些库函数 在图片上画圆

期待楼主完善,之后可以申请加精

学习了一下appcrawler,奈何源码是Scala的,看起来比较吃力,非常期待您的java版UIcrawler源码,BTW,后续要是也能支持自己写插件就更好了,楼主加油!

在三星s7 edge上测试了一下,发现进入一个页面以后,要等待很长时间才会有下一步操作。

22楼 已删除
Justin #23 · 2018年05月10日 作者
hongjojjay 回复

你的S7是android 7吗? 装uiautomator2 server apk了吗

Justin #24 · 2018年05月10日 作者

Good to know about that :)

Justin #25 · 2018年05月10日 作者
木头 回复

还在测试阶段 有些小bug 还在加一些功能 6月中旬前估计能开源

Justin #26 · 2018年05月10日 作者
木头 回复

插件目前还没考虑 不过以后可能会考虑加插件 谢谢你的建议

ITEM_WHITE_LIST
是表示有这些按钮的时候优先点它们吗?

执行报错,Android6.0,华为荣耀7
为啥要往/system/bin/sh 上面写结果呢?
lz帮忙看看有啥解决办法?

$ java -jar UICrawler.jar -f config.yml -u MYV0215818005565 -t 4723
14:47:33.227 [main] INFO Crawler - /Users/waterhuang/Downloads/UICrawler/config.yml
14:47:33.231 [main] INFO util.ConfigUtil - Reading config file /Users/waterhuang/Downloads/UICrawler/config.yml
14:47:33.344 [main] INFO util.ConfigUtil - Config : PORT = 4723
14:47:33.344 [main] INFO util.ConfigUtil - Config : MAX_CLICK_COUNT = 100000
14:47:33.347 [main] INFO util.ConfigUtil - Config : ANDROID_PACKAGE = xxx.xx
14:47:33.347 [main] INFO util.ConfigUtil - Config : ANDROID_MAIN_ACTIVITY = .xxx.xxxxxx
14:47:33.368 [main] INFO util.Driver - ===== Method : prepareForAppiumAndroid
14:47:33.524 [main] INFO util.Util - adb -s MYV0215818005565 shell getprop | grep version.sdk ---output is : /system/bin/sh: grep: can't execute: Permission denied
getprop: write: Broken pipe
14:47:33.525 [main] INFO util.Driver - sdk version : re
Exception in thread "main" java.lang.NumberFormatException: For input string: "re"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.valueOf(Integer.java:766)
at util.Driver.getSDKVersion(Driver.java:912)
at util.Driver.prepareForAppiumAndroid(Driver.java:823)
at Crawler.main(Crawler.java:98)
14:47:33.559 [Thread-1] INFO Crawler - 0 elements are clicked
14:47:33.559 [Thread-1] INFO Crawler - ==============list end==========
14:47:33.560 [Thread-1] INFO util.XPathUtil - Method: getClickCount
14:47:33.570 [Thread-1] INFO util.Util - Write to file report.html
14:47:33.571 [Thread-1] INFO Crawler -

------------------------------Test report :/Users/waterhuang/Downloads/UICrawler/MYV0215818005565-2018-05-11-14_47_33/report.html

大佬大佬,学习了

我15岁就出来打工,从以前的一无所有到现在的身无分文,我就是我,看到自己都上火。其实也不要为了眼前的境地而悲伤,也许明天更绝望了。

Justin #31 · 2018年05月11日 作者
water 回复

adb -s MYV0215818005565 shell getprop | grep version.sdk 这个是linux上运行的命令 你的电脑是windows?

Justin #32 · 2018年05月11日 作者
water 回复

白名单的意义是 所有包含白名单文本的控件 有会被点击多次 (元素遍历会限制同一个元素只点击一次,白名单中的元素无些限制)

Justin #33 · 2018年05月11日 作者
Justin 回复

这个命令你直接运行 报错吗?

Justin 回复

我的是mac

Justin 回复

单独运行这个命令是没问题的哦!可以成功返回:

adb -s MYV0215818005565 shell getprop | grep version.sdk
[ro.build.version.sdk]: [23]

帮忙解决一下撒~~否则你的工具在mac上用不了哎
mac上面没有 /system/bin目录哦!

Justin #36 · 2018年05月14日 作者
water 回复

我就是在mac上开发的 也是在mac上测试的 没有这个问题啊 你用env查查 SHELL bash的目录是什么?

Justin 回复

SHELL=/bin/bash

Justin 回复

真的不行啊…………

Justin 回复

请看下面的例子,进入adb shell之后,再执行grep就会报错,android里面没有grep命令,报错跟我现在的情况一样的。而直接adb -s MYV0215818005565 shell getprop | grep version.sdk 是不会报错,因为Mac上有grep。
请帮忙解决一下呗!考虑一下adb shell里面不支持grep的手机的情况。

99-6-88-54:UICrawler waterhuang$ adb -s MYV0215818005565 shell getprop | grep version.sdk
[ro.build.version.sdk]: [23]
99-6-88-54:UICrawler waterhuang$ adb shell
shell@HWPLK:/ $ getprop | grep version.sdk
/system/bin/sh: grep: can't execute: Permission denied
getprop: write: Broken pipe
Justin #40 · 2018年05月14日 作者
water 回复

这个命令是在mac上运行的 不是在adb shell后运行的 | 是管道符 你可以查查相关资料

Justin #41 · 2018年05月14日 作者
water 回复

你是Java9吗? 我用的是Java8

Justin 回复
java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
Justin #43 · 2018年05月14日 作者
water 回复

OK, 我再改改代码 一会改完了告诉你 你试一下 看行不行

Justin 回复

但是实际结果就是在adb shell后台运行了grep结果报错。你这边能处理一下吗?例如先获取出来之后用java来截取版本。

Justin 回复

好的,多谢啦!早点开源出来我可以帮忙一起改

谢谢支持 下个月估计差不多能开源 还有一些bug没改完 功能上还需要完善一下 然后就可以开源了

Justin 回复

这个版本也太大了……要下一个多小时

Justin #49 · 2018年05月14日 作者

恩 因为加入了测试回放的功能 引入了一些包 所以比较大。。。

Justin 回复

能发到我邮箱吗?实在受不了十几k的下载速度了 312743168@qq.com

Justin 回复

或者qq发我?

Justin #52 · 2018年05月14日 作者

好 我发你qq邮箱

Justin 回复
java -jar UICrawler.jar -f config.yml -u MYV0215818005565 -t 4723
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:314)
at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:268)
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:316)
at java.util.jar.JarVerifier.update(JarVerifier.java:228)
at java.util.jar.JarFile.initializeVerifier(JarFile.java:383)
at java.util.jar.JarFile.getInputStream(JarFile.java:450)
at sun.misc.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:977)
at sun.misc.Resource.cachedInputStream(Resource.java:77)
at sun.misc.Resource.getByteBuffer(Resource.java:160)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:454)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)

运行直接报这个错

Justin #54 · 2018年05月14日 作者
water 回复

这是什么鬼 :( , 莫非我打包有问题? 我试试啊

Justin 回复

我百度的结果就是打包的时候有问题

1.第一种解决:导入jcommander-1.48.jar包后运行.

下载路径为:http://download.csdn.net/detail/u010340178/9782044

2.创建项目的时候,选择JRE时要选择第二个,选择第一个就会报这样的错误。
Justin #56 · 2018年05月14日 作者

我加你qq 你是谁? 哈哈哈

仅楼主可见
Justin #58 · 2018年05月14日 作者

OK 我qq发你我的微信 我不怎么用qq

Justin #59 · 2018年05月15日 作者

最新版Jar包和配置文件已上传至 https://pan.baidu.com/s/1mNci6SWNHPuLj_mvrfgIbg#list/path=%2F

仅楼主可见
Justin #61 · 2018年05月16日 作者

目前还不支持其它地方input

感觉整个流程操作动作,比较慢,能不能优化一下操作速度~

Justin #63 · 2018年05月29日 作者

UI遍历时确实是慢,因为要界面分析,要截图还要保证 所有截图都能正确生成。 Monkey的功能已经优化,比原来快了。 你可以下新版试试

Justin 回复

感谢~

楼主,我使用的是appium-desktop的,启动后执行你那个命令时报错,我看了下报的是"JAVA_HOME is no set currently,please set JAVA_HOME",但是我java_home是没有问题的,求解答!!

同一个公司的。。。我在线这边的

Justin #68 · 2018年05月29日 作者

你这是环境的问题啊 npm install -g appium-doctor 然后运行 appium-doctor 看看报什么错

Justin #69 · 2018年05月29日 作者
mark 回复

你是在人大附近的ZD吗? 我在集团总部 哈

仅楼主可见
Justin 回复

楼主,有个问题,我这边跑App,试了很多次,没有一次能完整的跑完遍历...

72楼 已删除
Justin #73 · 2018年05月30日 作者
Smile 回复

你的是什么app啊? 我下载来试试

仅楼主可见

下载太慢了,无论是网盘下还是迅雷,都是20kb/s....

Justin #76 · 2018年05月30日 作者
Smile 回复

android的是吧?

Justin #77 · 2018年05月30日 作者
黑山老妖 回复

百度网盘就这龟速。。。 你有什么好建议吗

Justin 回复

对对对~

Justin #79 · 2018年05月30日 作者
Smile 回复

等我有空试试 看看是什么效果 然后回复你

Justin 回复

直接放git上?

Justin #81 · 2018年05月30日 作者
Smile 回复

ANDROID_BOTTOM_TAB_BAR_ID: com.huxiu:id/footer_bar

ANDROID_CLICK_XPATH_HEADER: 'string-length(@text)<30'

两个值是这么设的吗?按这个设一下试试

qiu
求解这是什么原因

Justin #83 · 2018年05月30日 作者
301000232 回复

你的命令错了 删掉udid : java -jar UICrawler.jar -f config.yml -u 设备udid -t 4723

Justin 回复

确实是我命令弄错了,但是报一样的错诶

85楼 已删除
Justin 回复

看了下配置,都设置过了~😖

Justin 回复

楼主,如果在跑的过程中,手动操作了了App,是不是就打乱了它的遍历步骤,还能继续往下走么?

Justin #88 · 2018年05月30日 作者
Justin 回复

这个错的意思是 udid有误 找不到设备 你看看是udid 设的值不对

Justin #89 · 2018年05月30日 作者
Smile 回复

会啊 你试试就知道了 但遍历的可能会不完整

Justin #90 · 2018年05月30日 作者
Smile 回复

我这几天忙 有空时我试一下 看看运行是什么效果 然后告诉你

Justin 回复

好哒好哒~

总是进入到入口activity后就退回到桌面,然后就一直不动

Justin #93 · 2018年05月31日 作者
301000232 回复

你有mac吗 在mac上试试 我是在mac 上开发的 windows上还没试呢

仅楼主可见
Justin 回复



楼主,今天一直遇到这个问题,然后还是没有遍历完整过...

这是什么问题APP已经启动成功了,为什么说APP包无效?然后一直在重复启动APP。手机系统是:5.0.2
楼主求解

chen 回复

这个问题我稍后解决一下 xml解析用的库的win上运行有问题 mac上OK的

Justin #98 · 2018年05月31日 作者
Smile 回复

这个问题我正在解决 下周出新版

99楼 已删除

已发~

Justin #101 · 2018年05月31日 作者
Smile 回复

收到

Justin #102 · 2018年05月31日 作者

QQ 技术交流群 : 728183683

Justin #103 · 2018年05月31日 作者
chen 回复

你的配置文件发我一下 LGXQF@163.COM 注明是哪个app

https://github.com/lgxqf/UICrawler/blob/master/doc/Config.md

NODE_NAME_EXCLUDE_LIST:
STRUCTURE_NODE_NAME_EXCLUDE_LIST:

@lgxqf 这两个没注释

Justin 回复

楼主今天调iOS跑的时候,出现下面的报错~

Justin #106 · 2018年06月01日 作者
Smile 回复

你需要先修改配置文件里的bundle id 请先查看github上 关于配置文件的说明文档

Justin #107 · 2018年06月01日 作者
小马 回复

这个我现在还解释不清 呵呵 以后再加上

Justin 回复

楼主,我配了iOS的参数,下面是报错。。。

Justin #109 · 2018年06月02日 作者

ios developer 选项里的enable UI autoamtion 功能打开了吗

Justin 回复

打开了~

Smile 回复

你的WDA没配好吧~~

112楼 已删除

我这里ios也跟109楼报一样的错

我的Android 已运行启动APP的登录页面,就报错了

Justin #115 · 2018年06月05日 作者
chen 回复

该问题已解决 请下载最新的jar和config.yml

Justin #116 · 2018年06月05日 作者

新版已经上传到百度网盘 , 遇到问题的朋友就先下载最新版jar和config.yml

修改了Windows运行失败的问题
修改了Windows上HTML报告乱码的问题

小马 自动遍历工具 UICrawler 使用记录 中提及了此贴 06月05日 16:11

@lgxqf 有开源计划么

Justin #119 · 2018年06月05日 作者

初步计划是等工具稳定一些后 6月底开源 目前还有好多细节需要完善

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
at java.lang.String.substring(String.java:1963)
at util.Driver.getSDKVersion(Driver.java:939)
at util.Driver.prepareForAppiumAndroid(Driver.java:849)
at Crawler.main(Crawler.java:115)
哪位大神指导这个怎么解决?

Justin #121 · 2018年06月05日 作者
xiaoduola666 回复

这个明显是你的设备udid 传的不对 有问题在群里说吧

Justin 回复

完美~ 已加入=

支持自动滚动页面遍历所有元素吗

Justin #124 · 2018年06月19日 作者
张艳祺 回复

支持

用谷歌打开测试报告乱码是为什么呢,设置了谷歌的编码格式
这几种编码格式都试过,还是乱码,请问这是为什么,生成的测试报告在哪里可以修改编码格式呢

Justin #126 · 2018年06月25日 作者

用HTML编辑器打开report.html 找到UTF-8 改编码格式. 这个问题我记得已经解决了 你下载的什么时候的版本 是最新版吗

楼主,这些以源码已经开源了吗



楼主能帮看看这是什么错误吗

Justin #129 · 2018年07月02日 作者
yajunzheng 回复

你的appium 要么设置有问题 要么就是版本太低了 用1.8.1试试

Justin 回复

谢谢楼主的回复,现在已经可以运行了,请问楼主可以发我源码研究研究吗

Justin #131 · 2018年07月02日 作者
yajunzheng 回复

目前还没开源 开源了就能看到了

仅楼主可见
Justin #133 · 2018年07月05日 作者
AItestwork 回复

没有微信群 只有qq群~

仅楼主可见
Justin #135 · 2018年07月05日 作者
Justin 回复

728183683 QQ群里聊吧 平时工作忙 没太多时间聊微信

Justin #136 · 2018年08月03日 作者

Doc is updated to latest version, feel free to let me know if you any suggestion about this tool :)

Justin #137 · 2018年08月07日 作者

这个工具的Monkey功能有人用过吗?现在需要一些反馈,看看如何增强对Monkey功能的支持

138楼 已删除
Justin #139 · 2018年08月17日 作者

@seveniruby 怎么才能申请加精?

Justin 回复

当时没加精的原因就是没开源。现在是完全开源,还是部分开源?

思寒_seveniruby 将本帖设为了精华贴 08月17日 17:29
142楼 已删除
143楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册