一个基于自动遍历的app爬虫工具. 支持android和iOS, 支持真机和模拟器. 最大的特色是灵活性. 可经过配置来设定遍历的规则.html
这里顺便提一下的是谷歌也发布了一款自动遍历的工具,名字几乎同样,叫作App Crawler(差了一个空格),设计的思想也一致,可是这款工具目前还在开发完善中,思寒大佬的工具比谷歌的早了两年时间,厉害啊!
google app crawler连接: developer.android.com/training/te…前端
吹完思寒以后,再来看看AppCrawler的做用和价值:java
这个时候咱们须要一种手段,能够达到两方面的目的:android
而自动遍历就能够知足咱们对上述的业务的需求;接着再来看咱们对自动遍历测试的一些需求,既然要用自动遍历,那么具体要等到什么样的效果?ios
自动遍历的需求:git
结果分析:github
首先来看业界用的较早也是常常听过的一款工具——Monkey
web
这是Android官方提供的一个工具,在Android的官网咱们能够看到对这款工具的解释以下: shell
谷歌早期在设计Android的时候,Android须要响应滑动、输入、音量、电话等事件,早期activity设计不完善的时候,谷歌但愿测试activity的性能,把全部的数据批量化的输出给activity,看activity一秒钟能够处理多少数据。因此早期monkey是用来作Android的一个压力测试的工具json
因为monkey
在测试过程当中的“随机”性,恰巧能够被用来作自动遍历测试,可是monkey
的缺点行业很明显,就是不知足咱们的两个自动遍历需求:可控性
和可定制
Maxim也是一款自动遍历工具,由咱们国内的一名叫作zhangzhao的工程师开发,官方给出的定义是:
An efficient Android Monkey Tester, available for emulators and real devices 基于遍历规则的高性能Android Monkey,适用于真机/模拟器的APP UI压力测试
官方GitHub地址:github.com/zhangzhao44…
testerhome地址:testerhome.com/topics/1171…
咱们来看看这款工具的优缺点:
这款工具没有开源,可是能够直接使用,在GitHub上下载后根据官方说明操做便可,这里不作重点说明,后期有空时候专门研究,独立成篇,或者直接参考做者在testerhome
上的帖子; 重点来看一下工具的特色和选择性
再来看今天的主角-
AppCrawler
,看看它为什么知足咱们的测试需求,它的优缺点有在哪里
先来看它与其余框架的关系结构
AppCrawler
是基于appium
开发的,因此支持Android
和IOS
AppCrawler
是基于appium
开发具有了跨平台的优势,可是也由于这层封装形成了运行速度相对较慢yaml
文件中使用appium
的相关技术知识进行配置,这就对使用者有了必定的技术要求下载
由于较大,官方也给出了打包后的百度网盘下载地址 最新版本下载地址: pan.baidu.com/s/1dE0JDCH 这里以目前最新的2.4.0为例
git checkout 2.3.1
mvn assembly:single
命令进行编译便可 安装 AppCrawler
自己是个jar包,不须要安装,须要安装的是运行时所依赖的环境: * Java版本:Java八、Java10(未测试过,做者说支持) * appium:appium 1.8以上 由于AppCrawler是基于appium
开发的,因此appium
的环境是必不可少的 appium的安装方式可参考另一篇博客:
Windows(Win10)、Mac下安装appium
查看帮助文档 直接使用命令java -jar appcrawler-2.4.0-jar-with-dependencies.jar
,能够看到以下帮助文档
信息 相关参数含义和部分注解以下:
$ java -jar appcrawler-2.4.0-jar-with-dependencies.jar
----------------
AppCrawler 2.4.0 [霍格沃兹测试学院特别记念版]
Appium 1.8.1 Java8 tested
app爬虫, 用于自动遍历测试. 支持Android和iOS, 支持真机和模拟器
项目地址: https://github.com/seveniruby/AppCrawler
移动测试技术交流: https://testerhome.com
联络做者: seveniruby@testerhome.com (思寒)
致谢: 晓光 泉龙 杨榕 恒温 mikezhou yaming116 沐木
--------------------------------
Usage: appcrawler [options]
-a, --app <value> Android或者iOS的文件地址, 能够是网络地址, 赋值给appium的app选项 #安装App,实际中使用较少
-e, --encoding <value> set encoding, such as UTF-8 GBK #在Windows下可能会产生乱码,对其编码格式进行设置
-c, --conf <value> 配置文件地址 #复杂且重要,是AppCrawler定制的核心
-p, --platform <value> 平台类型android或者ios, 默认会根据app后缀名自动判断
-t, --maxTime <value> 最大运行时间. 单位为秒. 超过此值会退出. 默认最长运行3个小时
-u, --appium <value> appium的url地址 #运行依赖于appium,不加此参数就使用默认的appium地址端口
-o, --output <value> 遍历结果的保存目录. 里面会存放遍历生成的截图, 思惟导图和日志
--capability k1=v1,k2=v2... # 和appium的capability设置一致
appium capability选项, 这个参数会覆盖-c指定的配置模板参数, 用于在模板配置之上的参数微调
-r, --report <value> 输出html和xml报告
--template <value> 输出代码模板
--master <value> master的diff.yml文件地址
--candidate <value> candidate环境的diff.yml文件
--diff 执行diff对比
-vv, --verbose 是否展现更多debug信息
--demo 生成demo配置文件学习使用方法
--help
示例
appcrawler -a xueqiu.apk
appcrawler -a xueqiu.apk --capability noReset=true
appcrawler -c conf/xueqiu.json -p android -o result/
appcrawler -c xueqiu.json --capability udid=[你的udid] -a Snowball.app
appcrawler -c xueqiu.json -a Snowball.app -u 4730
appcrawler -c xueqiu.json -a Snowball.app -u http://127.0.0.1:4730/wd/hub
#生成demo例子
appcrawler --demo
#启动已经安装过的app
appcrawler --capability "appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias"
#从已经结束的结果中从新生成报告
appcrawler --report result/
#新老版本对比
appcrawler --candidate result/ --master pre/ --report ./
复制代码
这里顺便说一下的是当前版本的diff功能还不完善,也相对较复杂,目前先不作深刻研究
quick start
1) 启动appium
$ appium
[Appium] Welcome to Appium v1.14.1
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
复制代码
2)启动模拟器或真机,保证adb devices
可有找到你的设备
$ adb devices
List of devices attached
FKFBB19120151100 device
复制代码
3) 根据参考文档中的命令,启动遍历一个已经安装过的APP(以示例中的雪球App为例): java -jar appcrawler-2.4.0-jar-with-dependencies.jar --capability "appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias"
这个命令执行后会以默认的方式去执行用例,而后遍历
遍历原则 它的遍历原则是,找页面的里层次最深的元素,也就是处于中心位置元素会被优先遍历
部分遍历效果展现
测试结果 若是没有使用-o
参数指定log输出的路径,appcrawler
就会在当前目录下生成以时间为命名的文件夹,里面保存了全部的数据,文件、截图、log
$ ls
20191129154742
appcrawler-2.4.0-jar-with-dependencies.jar
复制代码
打开文件夹会发现以下,每一步都会进行截图(这也是速度变慢的缘由之一吧)以及对于的dom
文件,这里会看到有几个steps
文件,这个只是随意点了某个操做来告知用户正在操做,真正的执行步骤是从这以后开始
测试报告 在测试log中有一个index.html文件,打开它会看到刚才运行的测试报告,appcrawler会把每一次点击当作一个测试用例,没一个页面当作是一个测试套件;将界面和界面内的控件点击模拟成了测试套件和测试用例的关系
测试log 在生成的文件夹中有appcrawler.log,里面记录了详细的执行步骤的log信息(加上-vv
参数运行的话会获得更多更多的log信息)
2019-11-29 15:48:10 INFO [Crawler.996.doElementAction] current element = MainActivity.tag=ImageView.depth=24
2019-11-29 15:48:10 INFO [Crawler.997.doElementAction] current index = 2
2019-11-29 15:48:10 INFO [Crawler.998.doElementAction] current action = click
2019-11-29 15:48:10 INFO [Crawler.999.doElementAction] current xpath = //*[@resource-id="com.xueqiu.android:id/decor_content_parent"]//*[@resource-id="android:id/content"]//*[@resource-
id="com.xueqiu.android:id/mainContent"]//*[@resource-id="com.xueqiu.android:id/main_content"]//*[@resource-
id="com.xueqiu.android:id/pager"]//*[@resource-id="com.xueqiu.android:id/layout_refresh"]//*[@resource-
id="com.xueqiu.android:id/list"]//*[@resource-id="com.xueqiu.android:id/today_topic_container"]//*[@resource-
id="com.xueqiu.android:id/time_line_topic_item_case2"]//*[@resource-
id="com.xueqiu.android:id/today_topic_container"]//*[@resource-
id="com.xueqiu.android:id/time_line_topic_footer"]//*[@resource-id="com.xueqiu.android:id/feedback"]
2019-11-29 15:48:10 INFO [Crawler.1000.doElementAction] current url = MainActivity
2019-11-29 15:48:10 INFO [Crawler.1001.doElementAction] current tag path =
hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.view.ViewGroup/androidx.viewpager.widget.ViewPager/android.widget.RelativeLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.ImageView
2019-11-29 15:48:10 INFO [Crawler.1002.doElementAction] current file name = MainActivity.tag=ImageView.depth=24
2019-11-29 15:48:10 INFO [Crawler.1071.doElementAction] need input click
2019-11-29 15:48:10 INFO [AppiumClient.53.findElementByURI] find by uri element= MainActivity.tag=ImageView.depth=24
2019-11-29 15:48:10 INFO [AppiumClient.245.findElementsByURI] findElementByAndroidUIAutomator new UiSelector().className("android.widget.ImageView")
2019-11-29 15:48:10 INFO [AppiumClient.60.findElementByURI] find by xpath success
2019-11-29 15:48:10 INFO [Crawler.1080.doElementAction] mark 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png to 20191129154742/2_MainActivity.tag=ImageView.depth=24.click.png
2019-11-29 15:48:10 INFO [AppiumClient.141.mark] read from 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png
2019-11-29 15:48:11 INFO [AppiumClient.154.mark] write png 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png
2019-11-29 15:48:11 INFO [AppiumClient.161.mark] ImageIO.write newImageName 20191129154742/2_MainActivity.tag=ImageView.depth=24.click.png
2019-11-29 15:48:11 INFO [Crawler.1095.$anonfun$doElementAction$5] click element
复制代码
index
等于几就表示第几回事件,action
表示当前的操做,xpath
就表示当前操做的元素的xpath
表达式
总说appcrawler慢,其余工具相对较快,缘由为什么,先来看他们的架构组成
- appcrawler
- appium、atx
- appium on Uiautomator2 server、atx on Uiautomator二、maxim、adb shell uiautomator、改进版本Uiautomator2 server
- Uiautomator2
- AccessibilityService
复制代码
底层有个叫AccessibleServices
东西,它能够获取Android全部界面的控件,uiautomator
获取元素进行操做的时候就是靠AccessibleServices
去获取控件,而后去触发必定的行为,uiautomator
就是将其进行了包装;
基于uiautomator
,appium开发了一个uiautomator server
,ATX开发了一个uiautomator2
,maxim就处于这一层 appium走的是HTTP协议,ATX走的是JSON-RPC协议,appcrawler处于最上层 因此appcrawler因为多了两层封装,再加上运行过程当中加入了截图(能够在配置中取消,可是取消后不利于结果的查看),运行起来天然就慢了。
改进指望: 后期指望appcrawler团队能够将其根据需求指定底层操做,绕过不少没必要要的流程来增长效率,这样功能很是完善的同时也能保证效率
到这里只是完成了appcrawler的一个基本认识,既然提到了它的定制化的特色,就须要经过配置文件来完成了,下一篇将进行详细的介绍,可参考博客:
以AppCrawler的配置文件完成定制化的自动遍历测试(基础)-01