AppCrawler运用总结
一.环境
1.环境准备:安装安卓SDK + 真机 + appcrawler-2.1.3.jar
在放 appcrawler-2.1.0.jar 的文件夹下执行以下命令:
1.生成yml的demo:java -jar appcrawler-2.1.3.jar –demo
2.更改并运行yml配置文件:java -jar appcrawler-2.1.3.jar -c example. yml
3.Java -jar appcrawler-2.1.0.jar -a jingdata.apk -c config.yml --output wyy/
二.参数说明
1、java -jar appcrawler-2.1.0.jar –capability appPackage=xxxxxx,appActivity=xxxxxx
2、命名启动appium:appium –session-override
3、配置文件使用:true和false是开启和关闭的意思
logLevel:日志级别
saveScreen:是否截图
reportTitle:报告名字
screenshotTimeout:屏幕超时时间
currentDriver:当前设备(Android/iOS)
resultDir:结果文件夹名,给定后,将不动态命名
tagLimitMax:ios的元素tag控制
tagLimit:给tag
maxTime:最大运行时间
showCancel:应该是控制是否展示注释
capability:用于配置appium
androidCapability:Android专属配置,最后会和capability合并
iosCapability:iOS专属配置
urlWhiteList/blackList:白名单/黑名单
xpathAttributes:用来设定可以用那些种类型去定位控件
defineUrl:用来确定url的元素定位xpath 他的text会被取出当作url因素(没理解)
baseUrl:设置一个起始url和maxDepth, 用来在遍历时候指定初始状态和遍历深度
maxDepth:默认的最大深度10, 结合baseUrl可很好的控制遍历的范围
appWhiteList:app白名单,如果跳转到其他app,需要设定规则,是否允许停留在次app中
headFirst:是否是前向遍历或者后向遍历
enterWebView:是否遍历WebView控件
urlBlackList:url黑名单.用于排除某些页面
urlWhiteList:url白名单, 第一次进入了白名单的范围, 就始终在白名单中. 不然就算不在白名单中也得遍历.
上层是白名单, 当前不是白名单才需要返回
defaultBackAction:默认的返回动作(没看到例子,貌似不特指的话,是click)
backButton:给一些返回控件,用于返回动作使用
firstList:优先遍历元素
selectedList:默认遍历列表,如果不是指定的类型,而是确定控件,会分别点击控件
lastList:最后遍历的元素
blackList:排除某些控件
triggerActions:制定规则(action、xpath、times)
autoCrawl:自动抓取,看源码指定true后运行crawl(conf.maxDepth)命令
(crawl——清空堆栈 开始重新计数)应该是appcrawler的主要方法
asserts:断言,用于是否失败的判断
testcase:测试用例,看appcrawler日志,每次都是首先运行用例才会往下执行
beforeElementAction:貌似没什么人用,字面意思在元素动作之前
afterElementAction:与beforeElementAction的待遇差不多
afterUrlFinished:也是很冷门的待遇
monkeyEvents:monkey的点击数
monkeyRunTimeSeconds:monkey运行时间
given是条件 或输入 when是触发条件和动作 then是断言
4、一次ctrl+c生成报告,两次ctrl+c是强行退出
5、终端输入Scala进入Scala解释器,输入:q或:quit退出解释器
6、遍历的深度应该怎么设置好,总是跳到其它页面,就回不到当前页面继续遍历了,看文档 通过黑白名单
7、设置一个起始url和maxDepth, 用来在遍历时候指定初始状态和遍历深度
- WebDriver
1. 根据id class xpath进行定位 AppCrawler
1. 先getPageSoruce获取所有的元素列表
2. 根据xpath直接选择元素
3. 截图时增加对选择控件的高亮区分
4. 宽松策略的自动化机制Page Source解读
Android
1. tag class
2. resource-id
3. content-desc
4. text
iOS
1. tag
2. name
3. label
4. valuexpath的定位
绝对定位 /xxx/ddd/dddd
相对定位 //android.widget.Button
查找
1. //*
2. //*[contains(@resource-id,’login’)]
3. //*[@text=’登录’]
4. //*[contains(@resource-id,’login’) and contains(@text,’登录’)]
5. //[contains(@text,’看点’)]/ancestor:://*[contains(name(),’EditText’)]
6. //*[@clickable=”true”]//android.widget.TextView[string-length(@text)>0 and string-length(@text)<20]- 多种方式匹配
xpath
1. //*[@resource-id=’xxxx’]
2. //*[contains(@text,’密码’)]
正则
1. ^确定¥
2.^.输入密码
包含
1. 密码
2. 输入
3. 请
自动遍历过程
信息的获取
把当前app的界面dump为xml结构
获取待遍历元素
遍历范围selectedList
过滤黑名单 小控制 不可见控件 blackList
重新控件顺利firstList lastList
跳过已点击 + 跳过限制点击的控件tagLimit
跟进匹配的规则执行action
循环上面的步骤
问题记录
- 设置登录账号、密码
triggerActions:
- action: "click"
xpath: "//*[@resource-id='com.xxx.myfinance:id/login_tv']"
times: 1
- action: "153xxxxxxxx"
xpath: "//*[@resource-id='com.xxx.myfinance:id/phone_edit']"
times: 1
- action: "123456"
xpath: "//*[@resource-id='com.xxx.myfinance:id/pwd_edit']"
times: 1
- action: "click"
xpath: "//*[@resource-id='com.xxx.myfinance:id/btn_submit']"
times: 1
2. 编辑EditText
方式一:
triggerActions:
- action: "10000"
xpath: "//*[@class='android.widget.EditText']"
times: 1
备注:times只能写1,否则EditText控件一直在那复制剪切
不适用需要多次输入的EditText
方式二:
testcase:
name: "sui guan jia"
steps:
- when:
xpath: //*[@resource-id='com.feidee.myfinance:id/cash_amount']
action: ${random.int[100,1000]}
times: 0
then: []
备注:可点击的EditText获取不到
clickedIndex=-1 action=Ready
xpath=//*[@resource-id=\"com.feidee.myfinance:id/action_bar_root\" and @index=\"0\"]/*[@resource-id=\"android:id/content\" and @index=\"0\"]/*[@index=\"0\"]/*[@resource-id=\"com.feidee.myfinance:id/common_toolbar\" and @index=\"0\"]
!!! CANCELED !!!
3 appcrawler经常会出现一些错误:
2018-05-12 10:53:27 ERROR [Crawler.crawl.203] crawl not finish, return with exception
2018-05-12 10:53:27 ERROR [Crawler.crawl.204] Unable to launch the app: Error: Trying to start logcat capture but it’s already started! (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
不太清楚,为什么会报错…… 总的感觉是getPageSoruce未获去到元素
所以瞎改了
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')]
- //*[@clickable='true']//*[contains(name(), 'Layout')]
- //*[@class='android.view.ViewGroup']
- //*[@class='android.widget.EditText']
4 testcase 与 triggerActions
自己试了一下,发现是先查找testcase,再查找triggerActions
但是还是感觉逻辑关系有点混乱,或者没有办法支持复杂的逻辑关系,让自己的case更有逻辑顺序。
综合考虑:2 和 4纠结了好久,试了个遍,可能是appcrawler自己的缺陷,所以放弃了这个工具。
又看到了新的工具AIMonkey: https://testerhome.com/topics/11719
后面准备研究下
AppCrawler运用总结的更多相关文章
- 测试工具之appcrawler的使用
appcrawler 标签(空格分隔): appcrawler appcrawler 简介 一个基于自动遍历的app爬虫工具. 支持android和iOS, 支持真机和模拟器. 最大的特点是灵活性. ...
- AppCrawler自动化遍历使用详解(版本2.1.0 )
AppCrawle是自动遍历的app爬虫工具,最大的特点是灵活性,实现:对整个APP的所有可点击元素进行遍历点击. 优点: 1.支持android和iOS, 支持真机和模拟器 2.可通过配置来设定 ...
- app遍历——appCrawler的使用
1.appCrawler环境配置 1.1 apkinfo获取安装包的报名和mainActivity https://github.com/codeskyblue/apkinfo/releases 使用 ...
- appcrawler遍历工具常用方法
Usage: appcrawler [options] -a, --app <value> Android或者iOS的文件地址, 可以是网络地址, 赋值给appium的app选项 -c, ...
- APPcrawler基础原理解析及使用
一.背景 一年前,我们一直在用monkey进行Android 的稳定性测试 ,主要目的就是为了测试app 是否会产生Crash,是否会有ANR,页面错误等问题,在monkey测试过程中,实现了脱离Ca ...
- AppCrawler自动化遍历使用详解(版本2.1.0 )(转)
AppCrawle是自动遍历的app爬虫工具,最大的特点是灵活性,实现:对整个APP的所有可点击元素进行遍历点击. 优点: 1.支持android和iOS, 支持真机和模拟器 2.可通过配置来设定 ...
- Google AppCrawler初探
AppCrawler是什么 你可以把它想成类似monkey一样的工具,调起你的应用程序并执行各种动作(点击,输入,滑动等)来通过这种方式 来查看各种情况下应用程序的状态 官方文档链接:AppCrawl ...
- Appcrawler 参数实战经验
https://testerhome.com/topics/10574 https://yq.aliyun.com/articles/277985 https://github.com/sevenir ...
- AppCrawler安装使用
百度网盘: https://pan.baidu.com/s/1bpmR3eJ mac下安装appium 真机或者模拟器均可. 确保adb devices可以看到就行 启动appium 启动appium ...
随机推荐
- 《团队作业第三、四周》五阿哥小组Scrum 冲刺阶段---Day3
<团队作业第三.四周>五阿哥小组Scrum 冲刺阶段---Day3 一.项目燃尽图 二.项目进展 20182310周烔今日进展: 主要任务一览:界面布局的设计 20182330魏冰妍今日进 ...
- DNS隧道
自己使用的dns隧道通过两种方法,一种是通过dnscat2工具,另一种通过cs上的beacon来进行通信. 第一种方法:dnscat2: 参考文章:https://xz.aliyun.com/t/22 ...
- python - django 执行数据库迁移后数据库并未更新 和 InternalError: (1054, u"Unknown column 'xxx' in 'field list'")问题
一.发生情况:当你修改数据库结构后进行 python manage.py makemigrations 和 python manage.py migrate 后发现控制台会给你返回一个下面的结果,但是 ...
- Python 3.6 抓取微博m站数据
Python 3.6 抓取微博m站数据 2019.05.01 更新内容 containerid 可以通过 "107603" + user_id 组装得到,无需请求个人信息获取: 优 ...
- k8s 基础概念
摘录自k8s中文社区https://www.kubernetes.org.cn/course kubernetes 源自希腊文,意为舵手,k与s之间是8个字母,所以也叫k8s, docker就像一个个 ...
- JavaScript高级程序编程(一)
第一章 JavaScript简史 20170510 JavaScript 组成部分: 核心(ECMAScript) 文档对象模型(DOM)浏览器对象模型(BOM) Netscape Navigat ...
- rust学习
Rust (github) 1. install (https://rustup.rs/) 2. play on line curl https://sh.rustup.rs -sSf | sh e ...
- 【cf补题记录】A. Hotelier
思考之后再看题解,是与别人灵魂之间的沟通与碰撞 A. Hotelier 题意 给出长度为n的字符串,字符串由'L'.'R'以及数字0~9组成.旅馆有10间房子,L代表客人从左边入住,R代表客人从右边入 ...
- #C++初学记录(树和二叉树)
二叉树的编号 例题 6-6 小球下落问题 有一棵二叉树,最大深度为D,且所有叶子深度都相同.所有节点从上到下,从左到右编号为1,2,3,4,....,2^D-1.在节点1处放置小球,他会往下落.每个节 ...
- Spring Boot-IntelliJ IDEA搭建SpringBoot
点击create new project 点击next 这里基本都已经自动生成了,简单介绍下: Name:项目名称 Type:我们是Maven构建的,那么选择第一个Maven Project Pack ...