GithubHelp home page GithubHelp logo

appcrawler's Introduction

AppCrawler

基于appium框架的一个自动遍历工具和app爬虫工具, 支持Android和iOS, 支持真机和模拟器

为什么做这个工具

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

设计目标

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

设计**

  • 自动遍历
  • 类似ReactNative的虚拟dom机制
  • Diff对比

安装依赖

mac下安装appium

brew install node
npm install -g appium

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

启动appium

启动appium

appium --session-override

启动appcrawler.

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

快速遍历

appcrawler --help
appcrawler -a xueqiu.apk

输出结果

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

  • 每个步骤的截图
  • 所有遍历过的控件组成的思维导图
  • 一些点击和元素log
  • 各种插件输出数据.比如har格式的接口数据等

设计理念

定义url

每个app的界面都会抽象一个唯一的id标记, 这样可以类比为普通的接口测试中的url.
点击等动作抽象为触发一个接口请求. 界面内每个控件的布局抽象为接口的返回.
这样普通的app测试就可以和接口测试一样具备可参考性了.
android的url默认为当前的activity名字.
iOS没有activity概念, 默认使用UIANavigationBar的label属性作为界面唯一标记.
也可以自己指定某些特征作为url, 比如title或者某些关键控件的文本

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

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

设定引导规则

遇到什么控件触发什么操作, 用来做引导输入, 是一种触发机制.
rule方法有三个参数. 元素的id或者name属性.第二个参数为输入. "click"会执行点击操作. 其他都会被当成文本输入.
第三个参数为这个规则被应用多少次. 默认是无限. 比如登录时的输入,可以设置为1次. 大部分情况默认即可.

  "elementActions":[
    {
      "action":"click",
      "xpath":"已有帐号?立即登录",
      "times":0
    },
    {
      "action":"click",
      "xpath":"登录",
      "times":0
    },
    {
      "action":"156005347XX",
      "xpath":"account",
      "times":0
    },
    {
      "action":"xxxxxxxx",
      "xpath":"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"
  ],

How To Develop

  • 安装scala
  • 安装sbt
  • 执行sbt stage打包

备注

此工具是由雪球测试团队开发. 用于快速的回归基本功能.
开源的目的是希望这种自动遍历的独特设计思路可以加速自动遍历技术的应用, 并借助开源力量让这个工具发展的更快, 从而让原创团队也能收益.
因为平时工作较忙, 暂不接受任何工具方面的咨询. 如有疑问请去testerhome测试技术社区交流.

appcrawler's People

Contributors

doctorq avatar

Watchers

James Cloos avatar YadongZhu avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.