前文介绍:https://blog.csdn.net/qq_38204134/article/details/100767616
1.搭建环境
我的appium版本是1.11.0,使用appcrawler版本为2.4.0。最后遍历了2s就结束了。所以不推荐用这个,这文档就简单讲下使用说明吧。
1.jdk8以上
2.安装并启动appium
3.下载appcrawler,查看帮助文档命令:java -jar appcrawler.jar
4.运行测试命令:java -jar appcrawler.jar -a ceshibao.apk -o 报告/
其中, -o <value> | --output <value> 为遍历结果的保存目录. 里面会存放遍历生成的截图, 思维导图和日志
启动参数介绍:
java -jar appcrawler.jar
app爬虫, 用于自动遍历测试. 支持Android和iOS, 支持真机和模拟器
帮助文档: http://seveniruby.gitbooks.io/appcrawler
移动测试技术交流: https://testerhome.com
感谢: 晓光 泉龙 杨榕 恒温 mikezhou yaming116
Usage: java -jar appcrawler.jar [options]
-a, --app <value> Android或者iOS的文件地址, 可以是网络地址, 赋值给appium的app选项
-c, --conf <value> 配置文件地址
-p, --platform <value> 平台类型android或者ios, 默认会根据app后缀名自动判断
-t, --maxTime <value> 最大运行时间. 单位为秒. 超过此值会退出. 默认最长运行3个小时
-u, --appium <value> appium的url地址
-o, --output <value> 遍历结果的保存目录. 里面会存放遍历生成的截图, 思维导图和日志
--capability k1=v1,k2=v2...
appium capability选项, 这个参数会覆盖-c指定的配置模板参数, 用于在模板配置之上的参数微调
-r, --report <value> 输出html和xml报告
-vv, --verbose 是否展示更多debug信息
--help
示例
java -jar appcrawler.jar -a xueqiu.apk
java -jar appcrawler.jar -a xueqiu.apk --capability noReset=true
java -jar appcrawler.jar -c conf/xueqiu.json -p android -o result/
java -jar appcrawler.jar -c xueqiu.json --capability udid=[你的udid] -a Snowball.app
java -jar appcrawler.jar -c xueqiu.json -a Snowball.app -u 4730
java -jar appcrawler.jar -c xueqiu.json -a Snowball.app -u http://127.0.0.1:4730/wd/hub
#启动已经安装过的app
java -jar appcrawler.jar --capability appPackage=com.xueqiu.android,appActivity=.welcomeActivity
#从已经结束的结果中重新生成报告
java -jar appcrawler.jar --report result/
#新老版本对比
java -jar appcrawler.jar --candidate result/ --master pre/ --report ./
#自动生成Page Object代码模板文件
java -jar appcrawler.jar --template PageObjectDemo.ssp --output result/
#根据wda的inspector生成测试用例代码
java -jar appcrawler.jar --template PageObjectDemo.ssp -u http://localhost:8100
5.然后就可以出去喝茶了. 回来之后你就可以在报告目录下看结果了. 目前的速度是Android一小时一千张. iOS一小时三百张截图的样子.
可以先默认不带 .yml 任何配置文件 让appcrawler 自己全部遍历,可以设置遍历时间参数maxTime: 来控制遍历最大时间,这样可基本遍历到所有界面和界面内。如果需要进行业务流定制遍历规则,如定制登录操作,请看第二点2.特性命令。
2.特性命令
- 创建yaml/json文件,该文件为配置文件
- yaml文件填写:
1.用于划过开屏的各种操作. 遍历开始前会先运行这个命令序列. 目前默认就会尝试滑动 你可以用这个配置作微调:
startupActions:
- swipe("left")
- swipe("left")
- swipe("down")
- println(driver)
2.see——唯一的元素定位api.
比如有个Button, 名字是"登录", 它的id是account, 定位它可以通过如下多种方式的任何一种
see("登录")
see("登")
see("录")
see("account")
see("acc")
see("//UIAButton[@id="account"]")
see("screen_name")("text")
see("screen_name").nodes.head("text")
see("action_bar_title")("text") 文本
see("action_bar_title")("tag") 类型
see("action_bar_title")("selected") 是否选中
如果当前界面中存在了有歧义的空间, 比如其他一个名字为"登录"的输入框. 那么上述定位方法中定位中两个控件的定位方法会失败, 你需要自己调整即可.
3.全局断言, 用来判断app有没有崩溃, 或者点击后有没有特殊的需要注意的控件
asserts:
- given:
- //*
when: []
then:
- //*[@package="com.gotokeep.keep"]
- given:
- //*[@text="发送朋友圈"]
when: []
then:
- //*[@package="com.tencent.mm"]
比如设定了断言所有的预期结果里面, 包名都必须是keep, 那么遇到拍照或者发朋友圈, qq登录的地方, 就会提示错误.
4.触发配置
triggerActions表示遇到什么样的元素需要执行多少次的什么动作. 所以他有三个主要的配置.
xpath字段也支持严格正则表达式. 比如某个按钮的文本是功能搬到这里啦的提示控件可以通过.*这里.*来匹配到.
action如果是click就是点击. 如果是非click 就认为是输入内容. action支持如下动作:click、back、swipe("left");times表示规则被应用几次后删除, 如果是0表示永久生效.
示例
triggerActions:
- action: "click"
xpath: "//*[@resource-id='com.xueqiu.android:id/button_login']"
times: 1
- action: 123
xpath: //*[contains(name(), "EditText")]
times: 10
- action: click
xpath: 我知道了
times: 0
5.示例:
---
#插件列表
#pluginList:
#- "com.testerhome.appcrawler.plugin.FlowDiff"
#- "com.testerhome.appcrawler.plugin.ProxyPlugin"
#- "com.testerhome.appcrawler.plugin.TagLimitPlugin"
#- "com.testerhome.appcrawler.plugin.ReportPlugin"
reportTitle: AppCrawler-acp4.7
currentDriver: "android"
# 结果目录
resultDir: ""
# 最大运行时间
maxTime: 10800
logLevel: "TRACE"
#结果报告是否展示没有遍历被取消的控件
showCancel: true
#特定元素的tag布局层级完全一样时的遍历最大值
tagLimitMax: 4
tagLimit:
- xpath: //*[../*[@selected='true']]
count: 12
#是否截图
saveScreen: true
screenshotTimeout: 20
# appium的capability通用配置
capability:
newCommandTimeout: 120
launchTimeout: 120000
platformVersion: ""
platformName: ""Android""
# Appium是否需要自动安装和启动应用。默认值true
autoLaunch: "true"
# 直接转换到 WebView 上下文。 默认值 false
autoWebview: "false"
# 不要在会话前重置应用状态。默认值false。
noReset: "false"
androidInstallTimeout: 180000
# android专属配置 最后会和capability合并
androidCapability:
deviceName: "192.168.58.101:5555"
appPackage: "com.sinacp.ggaicai"
appActivity: "com.aicai.pluginhost.activity.MainActivity"
app: "/home/cmd/appcrawler/acp4.7p.apk"
# 你想使用的自动化测试引擎 可以是 uiautomator2 macaca 等 默认appium
automationName: appium/uiautomator2/macaca
appium: "http://127.0.0.1:4730/wd/hub"
macaca: "http://127.0.0.1:3456/wd/hub"
fullReset: false
noReset: true
reuse: 3
#以下为重置手机输入法为appium输入法
unicodeKeyboard: true
resetKeyboard: true
iosCapability:
deviceName: "iPhone 6 Plus"
bundleId: "com.sinacp.ggaicai"
screenshotWaitTimeout: "10"
platformVersion: "9.3"
autoAcceptAlerts: "true"
app: "/home/cmd/appcrawler/acp4.7p.apk"
appium: "http://127.0.0.1:4730/wd/hub"
#appWhiteList:
#- android
#- com.shafa.market
# 用来确定url的元素定位xpath 他的text会被取出当作url因素
#defineUrl:
- //*[@selected='true' and contains(name(), 'TextView')]/@text
# 设置一个起始url和maxDepth, 用来在遍历时候指定初始状态和遍历深度
#baseUrl:
- ".*MainActivity"
- ".*SNBHomeView.*"
# 默认的最大深度10, 结合baseUrl可很好的控制遍历的范围
maxDepth: 10
# 是否是前向遍历或者后向遍历
headFirst: true
# 是否遍历WebView控件
enterWebView: true
# url黑名单.用于排除某些页面
#urlBlackList:
- .*OutdoorSummaryMap.*
- .*PersonalPage.*
- .*Training.*
- .*FriendRank.*
- .*\\.base\\.Container.*
- ".*球友.*"
- ".*png.*"
- ".*Talk.*"
- ".*Chat.*"
- ".*Safari.*"
- "WriteStatus.*"
- "Browser.*"
- "MyselfUser"
- ".*MyselfUser.*"
- ".*股市直播.*"
#urlWhiteList:
#- ".*Main.*"
# 后退按钮标记, 主要用于iOS, xpath
#backButton:
- //*[contains(@resource-id, "left_button")]
#defaultBackAction:
#- import sys.process._;
#- Thread.sleep(5000)
#- val name=Seq("adb", "shell", "dumpsys window windows | grep mCurrentFocus").!!.split(" ")(4).split("/")(0)
#- println(s"kill package ${name}")
#- Seq("adb", "shell", s"am force-stop ${name}").!!
#firstList:
#- //*[contains(@resource-id, "layout_picker_view_container"]
# 优先遍历元素特征列表
firstList:
#- "//*[contains(@resource-id,'com.acp.main:id/tvBottomTab4')]//android.widget.TextView"
- "//*[contains(@resource-id,'com.acp.main:id/tvBottomTab3')]//android.widget.TextView"
#- //*[contains(@resource-id, "layout_picker_view_container"]
# 默认遍历元素特征列表 需要注意的是firstList和lastList指定的元素必须包含在selectedList中
#selectedList:
#android非空标签
- //*[@clickable='true']
- //*[@clickable='true']//*[contains(name(), 'Text') and string-length(@text)>0 and string-length(@text)<10 ]
#通用的button和image
- //*[@clickable='true']//*[contains(name(), 'Button')]
- //*[@clickable='true']//*[contains(name(), 'Image')]
#todo:如果多个规则都包含相同控件, 如何排序
# 最后遍历元素特征列表,处于选中状态的同级控件最后点击
#lastList:
- //*[../*[@selected='true']]
- //*[../../*/*[@selected='true']]
- //*[../../*/*[@selected='true'] and contains(@resource-id, 'tab_')]
- //*[contains(name(), "HorizontalScrollView")]
- //*[@resource-id='com.gotokeep.keep:id/layout_bottom']
# 黑名单列表 matches风格, 默认排除内容是2个数字以上的控件
blackList:
- ".*\\.[0-9].*"
- ".*[0-9][0-9].*"
- //*[contains(@resource-id, "wrapper_in_custom_title_bar")]//*[contains(@resource-id, "right_button")]
- //*[contains(@resource-id, "share")]
- //*[contains(@text, "开始第")]
- //*[contains(@resource-id, "lock")]
- //*[contains(@text, "举报")]
- "//*[contains(@resource-id,'com.acp.main:id/tvBottomTab4')]//android.widget.TextView"
- //*[@resource-id='com.acp.main:id/module_tj1_name']
- //*[@resource-id='com.acp.main:id/module_tj1_description']
# 引导规则. name, value, times三个元素组成
triggerActions:
- action: "yourname"
xpath: "//*[@resource-id='com.sinacp.ggaicai:id/etUserName']"
times: 1
- action: "yourpasswd"
xpath: "//*[@resource-id='com.sinacp.ggaicai:id/etPwd']"
times: 1
- xpath: //*[contains(@resource-id, "layout_picker_view_container")]//*[@text="确定"]
- xpath: //*[contains(@resource-id, "content-wrapper_dialog")]//*[@text="不发了"]
- xpath: //*[@text="拒绝"]
- xpath: //*[@text="结束训练"]
- 启动命令:java -jar appcrawler.jar -c peizhi.json/peizhi.yaml -a ceshibao.apk
3.报告展示
遍历完成后在目录(pc): /报告/ 你将会看到一共有这么四类文件:
1 dom文档对象树文件
2 图片文件
3 树形的思维导图
4 appcrawler.log 日志文件
4.其他
参考文档:
https://seveniruby.gitbooks.io/appcrawler/content/
https://testerhome.com/topics/10574