app稳定性、遍历工具——appcrawler(二)——使用篇

前文介绍: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.其他

扫描二维码关注公众号,回复: 9277522 查看本文章

参考文档:

https://seveniruby.gitbooks.io/appcrawler/content/

https://testerhome.com/topics/10574

https://github.com/seveniruby/AppCrawler/tree/master/doc

https://testerhome.com/topics/8343

发布了61 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38204134/article/details/100891893