新版本已经发布请关注 https://testerhome.com/topics/node83. 暂时结贴.

关于 AppCrawler 的先前介绍

相关文章: https://testerhome.com/search?q=appCrawler
腾讯安全部门也有使用 https://security.tencent.com/index.php/blog/msg/105
开源仓库地址: https://github.com/seveniruby/AppCrawler 最新版本在 1.7.0 分支

获取方式

百度网盘: https://pan.baidu.com/s/1bpmR3eJ
在线帮助文档: https://seveniruby.gitbooks.io/appcrawler/content/
AppCrawler 交流专区: https://testerhome.com/topics/node83 论坛帖我会有问必答
问答 QQ 群:177933995 能获取最新的内测版本参与交流,

自动遍历的价值

1.7.0 版本改进

增加点击前后的截图

action 字段支持 scala 编程语句

配置文件已经转向 YAML 格式. 并提供了注释
beforeElementAction afterElementAction triggerActions 中的 action 都可以执行 scala 语句. 方便自定义.

---
triggerActions:
- action: "click"
  xpath: "//*[@resource-id='com.xueqiu.android:id/button_login']"
  times: 1
- action: "1560053xxxx"
  xpath: "//*[@resource-id='com.xueqiu.android:id/login_account']"
  times: 1
- action: "click"
  xpath: "//*[@resource-id='com.xueqiu.android:id/login_account']"
  times: 1
- action: "xxxxxx"
  xpath: "//*[@resource-id='com.xueqiu.android:id/login_password']"
  times: 1
#特定控件多遍历几次
tagLimit:
- xpath: //*[../*[@selected='true']]
  count: 12
- xpath: //*[../../*/*[@selected='true']]
  count: 12
startupActions:
- swipe("left")
- swipe("left")
- swipe("down")
- println(driver)
beforeElementAction:
- Thread.sleep(3000)
- println(driver.getPageSource())
afterElementAction:
- println(driver)
- println(driver.getPageSource)
- Thread.sleep(3000)

对比报告

一个简陋粗糙的 diff 报告. 这个只是初版. 具体什么范围需要对比需要工具使用者自己判断和控制
下个版本也会重点扩展这个功能. 增加字段的黑白名单和自定义规则控制.
如何遍历 app 并定义每个控件的命名是一门艺术. 请先看文档.

appcrawler --diff --master /Volumes/RamDisk/xueqiu_2/ --candidate /Volumes/RamDisk/xueqiu_6/ --report /tmp/diff/

动态插件和普通插件, 把插件文件放到工具的 plugins 目录下可以自动加载.

import com.xueqiu.qa.appcrawler._

//继承Plugin类
class DynamicPlugin extends Plugin{
  //重载start方法, 启动时执行
  override def start(): Unit ={
    log.info("hello from seveniruby")
  }
  //在每个element的动作执行前进行针对性的处理. 比如跳过
  override def beforeElementAction(element: UrlElement): Unit ={
    log.info("you can add some logic in here")
    log.info(element)
  }
  //当进入新页面会回调此接口
  override def afterUrlRefresh(url:String): Unit ={
    log.info(s"url=${getCrawler().currentUrl}")
  }
}

技术内幕

截图加红框是如何实现的

使用了 java 的 ImageIO 库, 可以对已有的图片进行标记. appcrawler 在点击前会先识别元素的位置, 并加上一个红框用于提示.

为什么用很慢的 xpath 来定位控件

希望是为每个控件赋予一个唯一的标记, 这样后续就可以进行定位分析和各种 diff 了. 对于大部分没有 id 和 name 的控件. 只有 xpath 能完整表示一个控件
appcrawler 用一种虚拟 dom 来代表实体 dom, 具体的类是 UrlElement

界面对比技术是怎么实现的

每个控件点击前后的截图和 dom 结构需要先拿到. PageSource 是一种 xml 结构. (WDA 里面是 json 结构).
需要先把 xml 和 json 等结构 flatten. 也就是扁平化. 然后对比简单的 kv 关系即可. 思路借鉴与 Twitter 的 Diffy.

版本计划

跳过了中间的 1.6.0 版本. 直接对外发布刚开发完成的 1.7.0 版本

# 1.8.0 [计划]
对子菜单的支持, 智能判断是否有子菜单
支持断点续传机制
支持自动重启appium机制, 用于防止iOS遍历内存占用太大问题
分离插件到独立项目

# 1.7.0
android跳到其他app后自动后退[完成]
截图复用优化提速 [完成]
报告增加点击前后的截图 [完成]
独立的report子命令 [完成]
配置支持动态指令 [完成]
配置不兼容 [重要]
支持自定义报告title [完成]

# 1.6.0 [内测]
增加动态插件 [完成]
支持beforeElementAction的afterElementAction配置 [完成]
修复app的http连接支持 [完成]
支持url白名单 [完成]
支持defineUrl的xpath属性提取 [完成]
未遍历控件用测试用例的cancel状态表示 [完成]
两次back之间的时间间隔设定为不低于4s防止粘连 [完成]

开源计划

商业与开发者计划

为了更好的推进这个工具的发展. 这个产品的发展方向借鉴 burpsuite. 但是更开放, 框架主体开源. 靠好用的插件来为企业做商业化服务.

如果你有志于成为插件的开发者或者公司想快速的实现 app 的自动遍历. 可以联系我的微信 seveniruby

硬广

我和 stuq 业余合作了一个小的平民价格 (大约初级工程师两天的工资) 的培训体系, 讲解移动测试技术的. 主要面向希望在技术方向上有所提升的同学. 欢迎有需求的同学报名.
介绍地址在 https://testerhome.com/topics/5867 收入也会捐给社区 5% 快过年了, 攒点路费回家.


↙↙↙阅读原文可查看相关链接,并与作者交流