AppCrawler App 自动遍历工具初版

思寒_seveniruby · 2016年02月18日 · 最后由 达峰的夏天 回复于 2017年02月27日 · 9600 次阅读
本帖已被设为精华帖!

新版本已经发布. 请大家搜索 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 你也遇到了是吗?怎么救。。。??

匿名 #96 · 2016年02月29日

是否有 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 风格的控件.

匿名 #148 · 2016年03月31日

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

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

匿名 #150 · 2016年03月31日

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

匿名 #151 · 2016年03月31日

#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 里没有这块的设置,也没有相关文档

匿名 #161 · 2016年04月07日

@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 折腾了下,感觉遍历规则比较难制定,能不能比较详细的说明怎么制定规则

匿名 #168 · 2016年04月11日

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

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

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

匿名 #171 · 2016年04月13日

不错的工具,学习并收藏

好厉害哟

匿名 #173 · 2016年04月14日

楼主好厉害啊,赞啊

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

支持 Android?

匿名 #176 · 2016年05月18日

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

匿名 #177 · 2016年05月18日

@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 有些啥变化吗?

匿名 #184 · 2016年05月20日

请问下黑名单,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
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册