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

以下内容有过时

下载地址

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

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

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

为什么做这个工具

设计目标

安装依赖

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 的自动遍历示例.

输出结果

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

设计理念

定义 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


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