AppCrawler App 自动遍历工具初版

思寒_seveniruby · 2016年02月18日 · 最后由 xdf 回复于 2017年02月27日 · 最后更新自管理员 恒温 · 8682 次阅读
本帖已被设为精华帖!

新版本已经发布. 请大家搜索appcrawler新版本

以下内容有过时

下载地址

appcrawler 1.1.2版本
http://pan.baidu.com/s/1skowOVV

仅限社区内测, 不要外传. 如遇Bug请轻骂
开源申请已经提. 还未正式发布. 所以先发个打包好的jar包给大家先试用下. 收集下改进意见.
目前我们自己也是在探索中

工具基于Appium设计, 所以有一定的使用门槛. 请做好心理准备.

为什么做这个工具

  • 各大云市场上自动遍历功能都是限制了时长, 企业无法自由定制.
  • 解决monkey等工具可控性差的缺点
  • 发现深层次的布局问题. 通过新老版本的diff可以发现每个版本的UI变动范围

设计目标

  • 自动爬取加上规则引导(完成)
  • 支持定制化, 可以自己设定遍历深度(完成)
  • 支持插件化, 允许别人改造和增强(完成)
  • 支持滑动等更多动作(完成)
  • 支持自动截获接口请求(Doing)
  • 支持新老版本的界面对比(Doing)

安装依赖

mac下安装appium

brew install node
npm install -g appium

真机或者模拟器均可. 确保adb devices可以看到就行

启动appium

启动appium

#ios测试默认连接4724默认端口
appium --session-override
#android测试默认连接4730默认端口
appium --session-override -p 4730

下载appcrawler.

下载appcrawler工具, 解压. 只要有java即可

快速遍历

#使用默认规则运行
appcrawler -a xueqiu.apk
#查看帮助文档
appcrawler --help

配置文件运行方式

#配置文件的方式运行
#Android测试
appcrawler -c conf/xueqiu.json -p Android
#iOS测试
appcrawler -c conf/xueqiu.json -p iOS

混合使用

-c参数表示是配置模板. 其他参数会在模板的基础上应用指定配置, --capability指定的参数会覆盖模板中的capability配置

bin/appcrawler -c xueqiu.json  -p ios --capability udid="[你的udid]"  -a Snowball.app
bin/appcrawler -c xueqiu.json -p android -a http://xxxxxxx/xueqiu.apk

通过修改配置文件. 可以实现细节的控制. 具体细节说明可参考conf下的雪球app的自动遍历示例.

输出结果

在当前目录下会生成一个包含输出结果的目录, 以时间命名. 包含了如下的测试结果

  • 每个步骤的截图
  • 所有遍历过的控件组成的思维导图
  • 一些点击和元素log

设计理念

定义url

界面唯一性:每个screen都有一个唯一的id, 这样可以类比为普通的接口测试中的url.

android的url默认为当前的activity名字.

iOS没有activity概念, 默认使用当前页面dom的md5值的后五位作为标记. 如果页面不变. 那么这个md5值也不会变.

也可以自己指定某些特征作为url, 比如title或者某些关键控件的文本

控件的唯一性取决于这个url和控件自身的id name tag text loc等属性.

比如一个输入框id=input, 在多个页面中都出现了.

如果url为空, 那么它只会被点击一次.
如果url设置为当前activiy的名字, 那么有多少页面包含它他就会被点击多少次.

url的定义是一门艺术, 可以决定如何优雅的遍历.

设定引导规则

遇到什么控件触发什么操作, 用来做引导输入, 是一种触发机制.

rule方法有三个参数. 元素的id或者name属性.第二个参数为输入. "click"会执行点击操作. 其他都会被当成文本输入.

第三个参数为这个规则被应用多少次. 默认是无限. 比如登录时的输入,可以设置为1次. 大部分情况默认即可.

"elementActions":[
{
"action":"click",
"idOrName":"已有帐号?立即登录",
"times":0
},
{
"action":"click",
"idOrName":"登录",
"times":0
},
{
"action":"156005347XX",
"idOrName":"account",
"times":0
},
{
"action":"xxxxxxxx",
"idOrName":"password",
"times":0
}
]

后退标记back

android默认是back键,不需要设定.

iOS上没有back键, 需要自己指定, 通过xpath定位方式指定遍历完所有控件应该点击什么控件返回.

"backButton":[
"//*[@name='nav_icon_back']",
"//UIAButton[@name='取消']",
"//UIAButton[@name='Cancel']",
"//UIAButton[@name='关闭']",
"//*[@value='首页']",
"//UIAButton[@name='首页']"
],

黑名单black

控件黑名单为black方法. 他会绕过id name或者text中包含特定关键词的控件.

url黑名单可以绕过特定的activity或者window

"blackList" : [ "消息", "聊天室" ]

遍历顺序控制

适用于在一些列表页或者tab页中精确的控制点击顺序

selectedList表示默认要遍历的元素特征

first表示优先遍历元素特征

last表示最后应该遍历的元素特征

统一使用XPath来表示

"firstList":[
"//android.widget.ListView//android.widget.TextView",
"//android.widget.ListView//android.widget.Button"
],
"selectedList":[
"//*[@enabled='true' and @resource-id!='' and not(contains(name(), 'Layout'))]",
"//*[@enabled='true' and @content-desc!='' and not(contains(name(), 'Layout'))]",
"//android.widget.TextView[@enabled='true' and @clickable='true']",
"//android.widget.ImageView[@clickable='true']",
"//android.widget.ImageView[@enabled='true' and @clickable='true']"
],
"lastList":[
"//*[contains(@resource-id,'group_header_view')]//android.widget.TextView"
],

url控制

支持黑名单, 最大遍历深度, 和重命名url, 重新设定初始url

"defineUrl":"//*[contains(@resource-id, '_title')]",
"baseUrl":".*Main.*",
"maxDepth":3,
"blackUrlList":[
"StockMoreInfoActivity",
"StockDetailActivity",
"UserProfileActivity"
],

结果截图

发现的崩溃截图示例

思维导图

所有遍历过的控件和布局会汇总为一个思维导图

技术交流群

QQ: 177933995

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

ui遍历 这个赞赞赞。

目前可否遍历webview?

不明觉厉啊

这个赞!有时间好好研究下

想问下这个针对那些需要权限的页面是否能遍历到呢,还有目前app中可能嵌入动画比较多,这个用起来是否能正常遍历呢

谢谢分享,考虑的挺全面。
对如何实现挺感兴趣,截获接口请求用socket服务做代理吗?新老版本界面对比是图片对比还是结构对比,是一次跑2个版本还是和指定版本跑下来的结果做对比?

之前使用Uiautomator 做了一个遍历的工具,最多执行到3层,再多逻辑就不好控制,

研究一下你这个

思寒 什么时候开源能通过啊,想学习一下代码呢 .

appcrawler这个工具下载解压后需要和Java放一块吗?还有需要配置appcrawler的环境变量吗?那个APK是我可以使用任意的吗?能有一些具体操作的截图就更好了,谢谢楼主!

#6楼 @kilmer 遍历的逻辑应该跟层次无关吧.

#5楼 @quqing 还没完成这两个feature. 设计思路是结构对比和代理拦截.

#4楼 @tcat 没什么关联吧. 支持自动输入引导.

#9楼 @seveniruby 在这种遍历里面,是不是一定要有引导规则在里面

#8楼 @testor windows下如何运行我没测试. 得你们自己探索了

#12楼 @kilmer 有些界面需要用户登录, 不登陆遍历不到的. 所以一定要支持自动引导输入

略屌,坐等开源

有空玩玩看

@seveniruby
思寒 等開源,然後能問個不相關的嗎?製作這樣的工具之前,都要先確定自己的設計目標嗎?還有要考量甚麼?
最近在弄公司網頁軟體自動化測試框架,不知道是不是到現在只有看過單體測試文件的關係,總覺得自己不是在架構整個系統,是配合軟體在拼拼圖。

立马去尝鲜,期待开源~

#17楼 @wkx101 技术和工具都是用来解决问题的. 做工具之前就已经想清楚了. 当时提出了设想. 组内的领导和同事也都赞成. 所以我就开始动手做了, 然后就越做越多.
加了一堆的功能. 也是刚刚开始使用没多久. 当时的背景如下

面临的问题

  • 新版本升级后, 某些UI的界面feature会略有改变. 比如新版本少了一个文字项, 不细心很难发现
  • 不在变更范围内的功能也容易被影响. 比如更改了代码导致老的功能crash或者发生变化. 但是我们又不能全部回归
  • monkey的控制力度较弱, 虽然借助monkeyrunner实现了自动登录, 但是有时候也会在乱点中给线上带来未知的效果, 比如给其他的用户发消息等干扰用户行为的事情.
  • 各大云测服务中的遍历层次很浅. 时长不够限制也大
  • 比如某个列表每一行的逻辑都差不多, 只是数据不同. 重复点击意义也不大
  • 希望是遍历, 更希望是可控的遍历. 从而节省时间. 更快的遍历到想要的功能
  • 在触发app动作的时候经常需要抓取接口数据. 自动遍历如果可以结合接口数据的抓取. 就可以方便qa更快的了解产品的功能和逻辑

解决方法

问题有了方法就来了

  • 结构Diff. 每个界面的结构其实也是数据化的. 跟接口测试一样. 这样就会diff带来了可能
  • 抓取接口数据. 结合代理工具即可. 或者借助其他的xposed框架.
  • 自动遍历有了, 有些功能需要登录等特殊操作. 所以需要指出自动输入.

目前的进展

自动输入被我关闭了.这个特性有点危险. 只支持自定义规则输入.
结构Diff和接口拦截还未实现完
自动遍历, 指出android和ios, 真机和模拟器, 已经做到了. 可以生成截图和思维导图.
自动识别不同屏幕尺寸的兼容性问题也能做到, 只是还需要时间.
目前我自己也没太多精力做这个. 这次发出来只是先告一里程碑. 给感兴趣的同学做个参考. 我也趟了很多坑, 算是给大家一个经验吧.

mark,谢大神分享。

error: Logcat capture failed: spawn "/Users/eric/Library/Android/sdk/platform-tools/adb" ENOENT Appium也是蛋疼,难不成我ANDROID_HOME白加到PATH里的

期待开源和windows版本

你在soho么 公司隔壁就是雪球。。

#21楼 @shenkai600 这是你appium的配置. 跟appcrawler无关. 得自己解决了. 你可以运行appium-doctor检查下.

先赞👍 +收藏❤ 慢慢悦读,之后尝试。 感谢分享🌹

赞,回头试试看能不能把它整合到STF框架中去!

轻轻撸过,拿来看看,回头好评

—— 来自TesterHome官方 安卓客户端

#26楼 @xubin98246 STF在你们公司运用的如何

#28楼 @seveniruby 目前还在试用验证阶段,主要集中于以下几个功能:

1. 收编管理android自动化执行机

说白了就是把原来的安卓执行机接到这个平台上,通过远程调试跑appium脚本,再增加了一些环境自动重连和重置的机制,目前看效果还行,管理上轻松了很多,但稳定性仍在观察改进。

2. 搭建兼容性测试平台

收集了部门中很多稀有机型,省的其他测试和开发人员到处找设备,效率上改进不少。近期准备在上面再添加批量应用安装和跑简单的monkey(或者你这遍历工具)的功能,搞个小型的兼容性云测平台。

3.固化可靠性测试环境

也很简单,找几台虚拟机,上面安装了很多性能\安全\稳定性测试相关的工具,然后部分手机也是,这样测试人员需要的时候登上来就可以直接开始用了。

不过也有些问题:

  • 平台终究存在稳定性问题和部分功能限制,很多人还是习惯拿着手机干,所以也就导致这只能是个辅助,基本每个人还是有自己专用的终端。
  • 我们是基于mac搭建的环境,目前20几个终端运行还算稳定,再多就不知道了,考虑转移到linux服务器上去。

#28楼 @seveniruby 另外,这个遍历工具有没有办法处理代码动态生成的view,或者提供坐标点击的功能?我们的应用中有很多这种view,比如密码输入的安全键盘,根本识别不了。

#30楼 @xubin98246 他只是封装自appium. 所以appium支持它就应该可以支持. 代码动态生成的view应该是支持的. 但是安全键盘就不行. 需要借助其他的手段辅助.

#31楼 @seveniruby 哈哈 由于没有源码,没法定制此需求,现在只能人肉辅助==

赞!!!

#32楼 @xubin98246 我已经做了一个插件机制了. 可以用java自己写插件. 不过我可以在输入引导那增加一个外部的命令调用

35楼 已删除

#34楼 @seveniruby 嗯,最好是在规则引导中加上外部命令调用,比较灵活,如果进一步能支持appium脚本调用,就更强大了。还有,SlidingMenu这种侧边栏菜单,我之前看到仅进入了一个菜单子项,其它的都没能遍历到,有办法优化吗?

#36楼 @xubin98246 这个需要优化的. 暂时可以通过指定遍历规则顺序和引导输入可以遍历到.

现在的能在windows 上运行吗?怎么跟appium结合起来?

#38楼 @aa3673436 文档里面提了. 里面有windows的.bat启动文件. 不过我没测试过. 我是mac

#29楼 @xubin98246 我们就是在centOS7上搭建的。 目前10台是比较稳定的。

#40楼 @anikikun 我现在比较想知道怎样的服务器配置、操作系统、hub型号搭在一起能支撑50台以上的设备运行,尤其是在自动化这种并发高频操作的场景下。感觉一台mac肯定扛不住==

#41楼 @xubin98246 机器配置能达到,adb的性能不一定可以吧...

#41楼 @xubin98246 我是按照官方推荐的基础上提高了一个档次配的。

#43楼 @anikikun 那你有测过单台服务器最多能稳定支持多少设备吗?或者有没啥办法能增强adb的性能?

有一个小疑问:思寒你怎么避免重复遍历某一个控件的?

#45楼 @cryingdream94 我把每个界面和控件的唯一性都用一个url来表示. 是否需要点击是根据这个url.
给控件命名的方式决定了是否重复遍历. 是否点击过的判断是根据控件的名字. 控件的名字在框架中是支持自定义的. 所以如果你把一个控件命名为tag_id_text的组合, 那么只要text不一样, 就会挨个点击. 如果你命名为tag_id 那么基本就会点击一次. 如果控件的名字是tag, 那么同类型的控件就只会被点击一次.

目前的命名方式是url=activity_tag_id_text 所以文本按钮会挨个点击. 不同界面中的相同按钮也会点击. 这个方式会比较完善的覆盖大多数的功能操作. 想减少点击量或者增加点击量. 只需要重定义这个命名方式就行了

#41楼 @xubin98246 @anikikun 你们现在单台机器支撑了多少台设备.

@xubin98246 有没有好的让截图更快的办法. 支撑iOS和Android. 目前发现遍历的截图过程挺慢的.

#48楼 @seveniruby 我们的截图就很快,iOS和android都可以。android用minicap,ios用一个第三方的jar包

@seveniruby 【目前的命名方式是url=activity_tag_id_text 所以文本按钮会挨个点击. 不同界面中的相同按钮也会点击】
那怎么避免出现环路?
假设界面A 只有button A,界面B 只有buttonB。buttonA点击接入界面B,buttonB点击会进入A界面。。很极端的情况..TT。。。

#47楼 @seveniruby @anikikun 我现在一台i5 4g的mac外接两个20w的13口hub,连了20多台设备。

—— 来自TesterHome官方 安卓客户端

#10楼 @seveniruby 关于支持新老版本的界面对比,如果不基于appium(考虑到稳定性欠佳),如何获取界面的DOM结构是否有方案?

#49楼 @doctorq 你们是怎样用minicap实现最简单的截图的,我之前也试过,但还是要设备上起minicap的服务,pc上起监听和数据解析的服务,整个流程对于单纯的一次性截图来说太长了。

#52楼 @quqing 直接用uiautomator dump应该是最快的: adb shell uiautomator dump /data/local/tmp/uidump.xml

#49楼 @doctorq android的较快. iOS如果是在虚拟机上截图很慢, 而且消耗内存. 那个第三方的jar是什么啊

#51楼 @xubin98246 20w是什么意思, 一个设备能连接20个设备, 已经不少了

#52楼 @quqing 一样的. UI本身就是结构化的. 我的结构Diff还没做那. 最近忙. 思路应该是没问题的. 把结构保存为以json结构即可.

#50楼 @cryingdream94 如果命名合适 不会出现环路的. 按照我的url定义方式
A.a click
B.b click
A.a clicked
所以无论那个按钮只会点击一次. 如果想让业务路径覆盖的好. 还可以这样定义url, 把url设置为只记录一定深度的activity序列. 比如4层.
A.a click
A.B.b click
A.B.A.a click
A.B.A.B.b click
A.B.A.B.A.a url深度为4层. 简化为A.B.A.a 已经被点击过 不会点击

#55楼 @doctorq 我用插件的方式实现支持minicap.

#60楼 @seveniruby libimobiledevice

#55楼 @doctorq 不是这个意思,你文章中的方法更偏向于屏幕监控这种画面不间断的实时传输,所以需要也应该起这么多服务。不过就截图而已,我希望的是adb shell screencap这样一次性的操作,前后两次之间最好不存在关联,这样的话里面的流程就显得有点长了。

#57楼 @seveniruby 功率,自带的电源的usb hub。刚发现20台还是不太行,mac的内存爆了 ,4g物理内存耗尽,还用了6.6g虚拟内存。也就运行了不到一星期而已。

#62楼 @xubin98246 这个需要 你自己去改,我的那个只是提供了获取的方式,每次获取到截图的二进制信息转化为BufferImage展示出来,你不展示出来,可以保存的图片,频率自己控制

#54楼 @xubin98246 这个针对android,ios呢?

#49楼 @doctorq 想问下 iOS 用的是什么第三方 jar 包?截图速度大概是多久?

#66楼 @chenhengjie123 他的速度应该在1s以内吧,原理用的是instruments,所以很快。

#67楼 @doctorq 关于ios的第三方jar包,是不是封装了“po [[UIWindow keyWindow] recursiveDescription]”的处理?

#68楼 @quqing 这个就不清楚了,我只知道这个jar包

#65楼 @quqing ios可以通过uiautomation脚本 UIATarget.localTarget().logElementTree() 读取。将以上语句导出为js脚本,再通过cmd instruments命令执行,应该可以,未经验证。

赞赞赞~我要好好学习下

@seveniruby 謝謝。細嚼慢嚥仔細想了一下,所以這道謝回得晚了。這篇文章多看幾次,想做的事情也慢慢充實起來,只是不知道自己在學還是在模仿。然後現在看下來,有個相關問題想問,測試結果產生完了之後,由人工進行驗證該結果是否正確?因為我現在也在想要抓甚麼來做測試結果比較。我弄的是線上閱讀器,都是圖片,沒文字可以抓取。

想试一下效果,结果运行时遇到一个问题:ANDROID_HOME是有配置正常的,Appium客户启动时是可以获取到的,然后在使用命令运行就会报错。请思寒指教

./appcrawler -c ../conf/xueqiu.json -p android

#73楼 @ivan 还是你的环境配置问题. 自己google吧. PATH变量设置的不对.

#72楼 @wkx101 人工验证结果. 自动化不能完全替代人工. 验证还是尽量让人做. 当然也可以尝试自己写脚本分析结果找有规律的bug. 目前我都是手工测试. 崩溃的话, bugly上有统计. 接口异常在后台也能查. 然后就是交互和展示用肉眼去看.

@seveniruby 百度网盘Chrome不让下载,直接报病毒!

#76楼 @jet 百度部分地区的服务器被chrome标记为恶意网站了. 这个自行解决吧.

赞,最近正想做相关的东西,大概什么时候能开源,好想看看

我的平台是mac os x + iOS 请问要如何使用你这个小工具。

clydeiMac:~ cly$ /Users/cly/appcrawler/bin/appcrawler -c xueqiu.json -p ios
Error: xueqiu.json not exist
Try --help for more information.

我是这样操作的

#81楼 @keen_lau 踩了这么多坑啊. 我周末录制个视频给大家.

@seveniruby json文件里的很多字段在appcrawler --help找不到(比如resultDir);能不能提供详细点的字段描述?

#83楼 @keen_lau 参数肯定是为了足够的简单. 更多的配置需要自己编写配置文件, 配置文件的介绍在源代码里. 我可以生成一个javadoc出来给大家.

#81楼 @keen_lau 你那个文章高亮都没有,不如发到这里来

@seveniruby 那你提供下javadoc文档吧

期待开源版本和windows下版本,没MAC环境的飘过。。。

感谢分享,
期待开源看源码学习

#29楼 @xubin98246 你好,我想问下stf搭建的问题,
我遇到了问题,请问你们如何解决的,Device database cannot match device

#89楼 @yrguo_iflytek 也遇到这个还没解决的坑。
1、表现是能看到设备连接上了,但进去了页面上没有显示设备图片,界面操作在手机端也不响应。
2、后台有打印“Device database cannot match device”,但不知道是否和该问题有关系!
3、楼盖的好高啊...

91楼 已删除

#89楼 @yrguo_iflytek 你这设备是一直这样,还是偶尔出现这种情况?必现的话感觉没什么救,偶现的话通过adb重启下手机上的minirev服务:
1、ps |grep minirev 杀掉已经起来的服务;
2、adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minirev 重启下服务 忘了,会自动重启该服务的

赞。期待开源。在做UI自动化脚本录制时,我们只能采集操作的绝对坐标,在想是否能结合自动遍历UI控件来定位控件情况从而生成更好的脚本。

#92楼 @xubin98246 一直这个情况。不是偶然出现的。必现的话有解决办法吗?

#90楼 @walkwall 你也遇到了是吗?怎么救。。。??

是否有windows运行的版本??求教……

@seveniruby

我们这有个直播类app,试了下遍历。遇到了如下问题,帮看看哈?

  1. 保存的图片打不开,提示 not a jpeg file: starts with 0x89 0x50 ---我用的ubentu14
  2. 开头进入直播间会遍历的点一点,但之后再进入其他直播间 仅做了下进入房间,然后就退出了,看log都会打印find back button error

很高大上的感觉,支持

#97楼 @zhangzhao_lenovo 需要定义自己的遍历规则文件. 另外你可以贴下你的执行命令. 出错的原因是app支持设定back按钮, 如果找不到指定的back按钮. 就会使用android默认的后退按键. android默认不需要设定. 感觉是你参数用错了

100楼 已删除

#99楼 @seveniruby

  1. 保存的图片打不开,提示 not a jpeg file: starts with 0x89 0x50 ---我用的ubentu14

google了下查到这个结果:

ubuntu圖片瀏覽器打開提示
Not a JPEG file: starts with 0x89 0x50
經查明發現是程式里 create的是PNG格式,輸出保存成了jpg造成的

@seveniruby
"
控件的唯一性取决于这个url和控件自身的id name tag text loc等属性.
比如一个输入框id=input, 在多个页面中都出现了.
如果url为空, 那么它只会被点击一次.
如果url设置为当前activiy的名字, 那么有多少页面包含它他就会被点击多少次."

思寒 这个规则能否再说明下。确实没看明白..

#13楼 @seveniruby windows下,使用Cygwin可以。昨天尝鲜,也够折腾的

#102楼 貌似存在一个问题, firstlist,selectedlist, 和elementActions 中的配置没有按先后顺序遍历组件。
比如发消息 elementActions 中写 messageedittext 和sendButtion , 测试过程中出现过 前找到sendbuttion 而后才 messageedittext,而预期应该是 反过来。

#104楼 @zhangzhao_lenovo 你可以把log发给我. 理论上不会, 他就是从elementActions里面顺序遍历匹配 我的邮箱是1516491904@qq.com

#30楼 @xubin98246 我可以先把代码给你开放权限. 你算是testerhome的核心成员了. 告诉我邮箱即可

#105楼 @seveniruby THX 问题已经搞定了。 还是控件的唯一性的问题。 defineUrl 定义的标签在 messageedittext的页面里不存在 ,所以第二次执行时按重复的也就没执行到。。。

另外试用过程中 貌似觉得 截图的速度似乎是有些瓶颈的。

@seveniruby 有没有偶现过控件添加blacklist不管用的状况?

#107楼 @zhangzhao_lenovo 截图慢, 还没法异步去做. 所以最近我都取消了. 在还未发布的新版本里我用dom结构的文本取代了截图. 在配置文件里面有了saveScreen, 设置为false即可.

这个是页面中所有的控件都能获取,然后自动执行一遍么?

#109楼 @seveniruby 请问对于需要滑动才能显示出来的控件是怎么处理的?

#111楼 @darren_dp 目前默认会自动滑动尝试找新的元素. 如果是特殊的滑动. 需要自己去自定义行为.

#113楼 @zhangzhao_lenovo 你做过测试吗, 速度如何. 我使用的是截图是appium自己的. 所以很慢. 但是架构上是合理的. 考虑到跑case的时候环境不一定是直接走adb线. 额外的截图方案一般需要做下适配. 我想先保持目前架构上的清晰. 不同的截图方案用工具自身提供的插件来实现.
我之前试过一些录屏方案. 结果录屏会影响内存. 长时间还容易不稳定. 所以录屏的方案也放弃了.

#114楼 @seveniruby 这个工具怎么配来调插件?

录屏好像5.0以上google有api接口了。4.x的都还得先root。感觉更重量了

#112楼 @seveniruby 请问,这个遍历 就是用XPATH把需要遍历的元素表示出来,然后用appium的findElements方法遍历吗?

117楼 已删除

#116楼 @darren_dp 是的. 已经内置了基本的遍历规则.

#115楼 @zhangzhao_lenovo 是啊. 就怕加入的功能太重.

请问 对于 webview 页面较多的 apk 还能正常执行 吗 ?

#120楼 @gengasterisk appium支持. 所以这个工具也是支持的

求解appium要如何获得当前activity的信息?

#121楼 @seveniruby 大神~什么时候可以开源?

IDevice这个接口用来Record Screen还不错,我之前实践时可以设置limit 60s为一个周期,进行pull和remove,视频1mb左右大小

#124楼 @shenkai600 哪个框架的idevice啊

#125楼 @seveniruby ddmlib里面的

是否有windows运行的版本??求教……

@seveniruby 从Appium的日志分析,Inspector工具的Refresh操作是通过BootStrap里面的source实现的,并没有调用chromedriver和android-hybrid.js,就直接获取到WebView的内容了。请教Appium如何获取Hybrid App里webivew的页面元素呢,是在哪部分实现的?非常感谢!

#128楼 @our166 不是有switch_context api吗. 你追下这个api吧. 新版本的appium把代码完全重构了. 具体地方得重新查查.

关于何时能开源有什么好消息吗!

#130楼 @shenkai600 我已经先把代码发给小部分人了. 正式的开源这个不太容易. 代码要好看. 文档要齐全. 不然会被喷. 所以会谨慎点.

#131楼 @seveniruby 太想学习这个源码~能给开个权限吗。只学习,不外传。

#132楼 @darren_dp 我只发给社区里面活跃的成员. 7月份之前肯定会开源的. 作为新人你不妨再等等. 反正工具目前还是可用的. 明天我会发个新版本出来.

#131楼 @seveniruby 能否给个权限,想把录屏折腾下。。

#134楼 @shenkai600 加QQ群 177933995.

赞赞!。有几个问题想问一下,问题比较多,多包涵。

  1. 如果activity中元素是变化的,即点击或其他后出现了新的元素,遍历是否能遍历到这些元素并进行相应操作?
  2. 如果1可以,当前activity的md5发生变化后,工具认为是新的activity还是旧的?后续遍历是否还是进入该activity?
  3. 业务逻辑中如果发生activity跳转,即 原先路径为A->B->C, C中的某个业务触发后发生了C->A,此时B的遍历是否还会继续?
  4. 业务中有可能会发生完全一模一样的界面,且activity名称相同,我们的工具是如何来区别这2个功能页面的?
  5. 当前性能如何?遍历一个app大致需要多少时间?
  6. 如果出现类似扫码和拍照界面,我们是继续操作还是跳出?
  7. 如果6成立,发生了类似"从相册中选择"的事件,是否支持切换回被测应用?
  8. 具体遍历时,在Android上如果需要有滚屏去显示更多的元素并针对这些元素进行操作,是否支持类似的遍历?

看了优酷上的视频, 想知道DFS中的回环是怎么处理的

还有个问题是: 返回是怎么处理的. Android上当遍历到首页的时候, 按Back就退出了.

不明觉厉。。。

—— 来自TesterHome官方 安卓客户端

#138楼 @winkar 已经处理了. 思路等下个版本我写进说明.

#139楼 @winkar 加判断即可. 判断当前界面是否是被测app

#137楼 @tbya

  1. 如果activity中元素是变化的,即点击或其他后出现了新的元素,遍历是否能遍历到这些元素并进行相应操作?
    可以

  2. 如果1可以,当前activity的md5发生变化后,工具认为是新的activity还是旧的?后续遍历是否还是进入该activity?
    新增加的元素仍然计算入当前的activity

  3. 业务逻辑中如果发生activity跳转,即 原先路径为A->B->C, C中的某个业务触发后发生了C->A,此时B的遍历是否还会继续?
    *会继续. 这个是可以定制化等. 界面路径是有个URI的定义规则.
    通过制定规则可以决定是否会继续遍历. *

  4. 业务中有可能会发生完全一模一样的界面,且activity名称相同,我们的工具是如何来区别这2个功能页面的?
    通过URI. URI的定义有点新颖. 我以后会详解.

  5. 当前性能如何?遍历一个app大致需要多少时间?
    一个小时一两千左右的点击动作.

  6. 如果出现类似扫码和拍照界面,我们是继续操作还是跳出?
    通过黑名单避免跳进.
    跳进了也会自动调用back返回的.

  7. 如果6成立,发生了类似"从相册中选择"的事件,是否支持切换回被测应用?
    支持

  8. 具体遍历时,在Android上如果需要有滚屏去显示更多的元素并针对这些元素进行操作,是否支持类似的遍历?
    支持自动滚屏.

#142楼 @seveniruby 谢谢回答, 不过我还是没太明白. 如果重新返回App的话, 也仍然在那个界面, 那么要如何返回DFS当中的上一层呢?

win7 64位这样提示:

点赞!目前做的项目中也写了个自动化遍历。学到了。
----有关于判断重复页面,我的方法是通过Activity中全部控件和控件文本的一个序列,进行序列比对。设计时考虑的问题是存在Activity名称相同,但实际内容不同的情况。本来也是和 @tbya 一样,对于只通过ActivityName进行页面判重有疑问。细想一下,如果重复进入同一ActivityName的页面,在获取元素后,发现存在不同文本(或其他属性)的控件,那么这个Activity又会继续遍历这些新的控件。实际的遍历效果相当于发现了一个新的Activity。
----@seveniruby 如果Activity中元素是变化的,除了增加新元素之外,有的元素可能还没遍历到,就已经消失。像这种情况的话,Activity包含的遍历事件是在什么时机进行更新呢?

#146楼 @jkasljz 自己可以设定遍历的先后顺序, 来对付tab风格的控件.

我在用它遍历微信和QQ邮箱 iOS版本 时,发现它的文本输入功能只对打开app时的第一个界面有效,像微信和QQ邮箱都是在第二层界面才有帐号登录功能,配置中的规则就无效,请问这个有解决方法吗?

#148楼 @riusksk times决定了规则被应用几次. 改成0表示没有限制. 你可以试试.

#149楼 @seveniruby 不行,因为appcrawler 会先返回上一层界面,再检测文本输入框,导致第二个界面之后的文本框都无法自动输入,可能是个bug,你试试

#149楼 @seveniruby 找到问题了,配置文件里面把idOrName为“关闭”和“取消”的项移到最后就可以了,否则每次操作其它就自动退出界面了。

有几个问题请教下:

  1. 我运行的时候在"elementActions" 中没有定义的元素也被点击到了,不知道是什么原因?
  2. 定义的一些text 输入值,有的正常输入了,有的没有输入
  3. 怎么自定义遍历的先后顺序呢? 谢谢

可以试试

#149楼 @seveniruby 请问一下,最后的思维导图,是有第三方项目支持的吗?

#152楼 @sundaxian first last机制来控制顺序 没在elementActions定义的按钮被点击, 估计是被自动遍历到了吧. 或者id和name相同

#154楼 @darren_dp 不需要, 直接生成思维导图

#156楼 @seveniruby 通过 遍历 apk 可以做到 布局解析不?

#155楼 @seveniruby 好的 我在看看,thx

android app遍历到h5页面的时候报错退出了,get page source error,请问该怎么处理这个问题,谢谢

@seveniruby 控件命名方式怎么定义?我看demo里没有这块的设置,也没有相关文档

@seveniruby 一般APP新版安装启动后都有新功能简介的窗口需要X次拖动或点击关闭,自动化安装APP后一直停留在APP启动界面,且不同APP结束启动动画方式各不相同,这个工具目前好像解决不了第一屏动画问题,请问有什么通用的方法解决这个问题么?

#161楼 @jusnic 已经解决了, 新版本正在朋友圈内测 .还没发出来.

@seveniruby 话说win7 64位下面报错有解么。。。。-__.-

#163楼 @huangke 新版本我打包了一个jar文件. 只要安装了java就可以了. 报错也是java的版本不对应而已. 解决了就可以了

刚刚在Mac上试用了下Android的,有几个需要注意的地方:

  • appcrawler需要修改下权限
    shell chmod 777 appcrawler
  • 配置文件xueqiu.json需要填写好"deviceName","appPackage","appActivity","app"
  • 直接用appcrawler会一直命令不存在,执行时需要在appcrawler-1.1-2目录下,使用 shell ./bin/appcrawler xxxx
  • 目前被测apk名字必须是xueqiu.apk

整体上看是非常不错的工具,期待开源学习。

@seveniruby 我64位的win7,应该用什么版本的java呢。。求入群—______.—

@seveniruby 折腾了下,感觉遍历规则比较难制定,能不能比较详细的说明怎么制定规则

#162楼 @seveniruby 你好,新版本大概什么时候发,能否加下QQ交流:2016-398-208

#51楼 @xubin98246 卧槽,20台。稳定吗?或者说,当其中有6~7台在被同时调试的时候,运作正常吗。

@seveniruby 能否分享源码,最近有个需求,既然这里有现成的也不用重复造轮子了,有了源码,遇到问题也方便改:-)

不错的工具,学习并收藏

好厉害哟

楼主好厉害啊,赞啊

有谁能告诉我,怎么获取当前的ActivityName呢?

支持Android?

你好,我测试了iOS app,发现好多情况都是有很多dom,但是基本没有截图,请问下截图的时机是什么时候呢?还有就是app1点击了按钮跳转到app2,之后程序就死掉了。是因为instrument只能针对一个app的原因么?

@seveniruby 有个小问题,测试时候发现如果是二维码/条码这样的标题,保存的dom可能就是xxx/xxx/xxx-二维码/条码_xxx-条码-条码.dom这样会导致文件失败,java.io.FileNotFoundException: xxx/xxx-二维码/条码_xxx-条码-条码.dom (No such file or directory).而结束遍历。

#176楼 @guaixiaomei 截图超过10s就超时不截图. 第二个是如果当前界面没变化. 也会跳过截图.

#177楼 @guaixiaomei 这个是bug. 新版本里面已经做了改进了. 近期会放出来.

@seveniruby
windwos下运行批处理会出现命令行超长的错误,需要修改下批处理文件:
set "APP_LIB_DIR=%APPCRAWLER_HOME%\lib*"
set "APP_CLASSPATH=%APP_LIB_DIR%"

这样就可以在windows下正常运行了,但问题是每次运行一段时间会报错:
start screenshot
[31m- App Crawler *** FAILED ***[0m
[31m java.io.IOException: 文件名、目录名或卷标语法不正确。[0m
[31m at java.io.WinNTFileSystem.canonicalize0(Native Method)[0m
[31m at java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:428)[0m
[31m at java.io.File.getCanonicalPath(File.java:618)[0m
[31m at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1079)[0m
[31m at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1038)[0m
[31m at Crawler.saveScreen(Crawler.scala:694)[0m
[31m at Crawler.doAppiumAction(Crawler.scala:720)[0m
[31m at Crawler.clickElement(Crawler.scala:454)[0m
[31m at Crawler.crawl(Crawler.scala:549)[0m
[31m at Crawler.crawl(Crawler.scala:558)[0m
[31m ...[0m

这是什么情况?

#180楼 @qd_wzg 新版本都已经发布了. 去用新版本吧

@seveniruby 没搜到啊……

#181楼 @seveniruby 相对1.1版本,1.1.2有些啥变化吗?

请问下黑名单,blacklist和blackurllist具体有什么区别么?我在iOS上配置了一些关键字,发现最终还是去点击了,并不是黑名单都生效,是有什么限定条件么?

思寒_seveniruby [该话题已被删除] 中提及了此贴 06月25日 15:56

厉害,开源就是要创新拓展,解决疑难杂症

#135楼 @seveniruby 我已经申请了加入QQ群,等待验证通过。

思寒,V五

在使用json配置文件时,除了androidCapability这个Key中的属性可以生效以外,其它的key都无法生效,比如在配置文件中配置maxTime,或者maxDepth遍历层级深度,都无法生效,这种问题,有人遇到过吗?

思寒_seveniruby 关闭了讨论 07月28日 17:38
狂师 [该话题已被删除] 中提及了此贴 08月05日 11:15
思寒_seveniruby AppCrawler 自动遍历工具 1.2.1 版本 中提及了此贴 01月06日 10:23

期待兼容Macaca

恒温 关闭了讨论 03月13日 21:36
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册