下载appclawler

下载地址:https://pan.baidu.com/s/1dE0JDCH#list/path=%2F

查看帮助文档:

java -jar appcrawler-2.4.0-jar-with-dependencies.jar

Usage: appcrawler [options]-a, --app <value>        Android或者iOS的文件地址, 可以是网络地址, 赋值给appium的app选项-e, --encoding <value>   set encoding, such as UTF-8 GBK-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报告--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.yaml例子

java -jar appcrawler-2.4.0-jar-with-dependencies.jar --demo

---
pluginList: []
saveScreen: true
reportTitle: "雪球自动化遍历"
resultDir: "./test"
waitLoading: 500
waitLaunch: 6000
showCancel: true
maxTime: 10800
maxDepth: 10
capability:noReset: "true"fullReset: "false"appium: "http://127.0.0.1:4723/wd/hub"appPackage: com.xueqiu.androidappActivity: .view.WelcomeActivityAlias
testcase:name: "TesterHome AppCrawler"steps:- xpath: 行情action: click- xpath: 龙虎榜action: clickthen: - //*[contains(@text,'沪深上榜个股')]
selectedList:
- xpath: "//*[contains(name(), 'Text') and @clickable='true' and string-length(@text)<10]"
- xpath: "//*[@clickable='true']/*[contains(name(), 'Text') and string-length(@text)<10]"firstList: []
lastList:
- xpath: "//*[@selected='true']/..//*"
- xpath: "//*[@selected='true']/../..//*"backButton:
- given: []when: nullthen: []xpath: "Navigate up"action: nullactions: []times: 0
triggerActions:
- xpath: 净买入times: 10
- xpath: 总成交times: 10
- given: []when: nullthen: []xpath: "share_comment_guide_btn"action: nullactions: []times: 0
xpathAttributes:
- "name"
- "label"
- "value"
- "resource-id"
- "content-desc"
- "instance"
- "text"
sortByAttribute:
- "depth"
- "list"
- "selected"
findBy: "default"
defineUrl: []
baseUrl: []
appWhiteList: []
urlBlackList: []
urlWhiteList: []
blackList:
- given: []when: nullthen: []xpath: ".*[0-9]{2}.*"action: nullactions: []times: 0
beforeRestart: []
beforeElement:
- given: []when: nullthen: []xpath: "/*"action: "Thread.sleep(500)"actions: []times: 0
afterElement: []
afterPage: []
afterPageMax: 2
tagLimitMax: 2
tagLimit:
- given: []when: nullthen: []xpath: "确定"action: nullactions: []times: 1000
- given: []when: nullthen: []xpath: "取消"action: nullactions: []times: 1000
- given: []when: nullthen: []xpath: "share_comment_guide_btn_name"action: nullactions: []times: 1000
assertGlobal: []

启动已经安装过的app

java -jar appcrawler-2.4.0-jar-with-dependencies.jar --capability "appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias"

定位模式xpath

xpath://*[@resource-id=‘xxxx’]//*[contains(@text, ‘密码’)]
正则:^确定$^.*输入密码
包含:请输入密码

自动化遍历支持

    selectedList:需要被遍历的元素范围 firstList:优先被点击lastList:最后被点击tagLimitMax:同祖先(同类型)的元素最多点击多少backButton:当所有元素都被点击后默认后退控件定位 blackList:黑名单maxDepth: 6 遍历的最大深度

触发器

triggerActions:需要特定次数的触发动作通常用于处理弹框xpath: 指定具体按钮 action:动作 times:规则的使用次数

动作支持action

    “” 只是截图记录back 后退backApp 回退到当前的app 默认等价于back行为 可定制 monkey 随机事件xxx() 执行代码Thread.sleep(3000)driver.swipe(0.9, 0.5, 0.1, 0.5) clicklongTap非以上所有行为是输入 xx ddd

与传统WebDriver的不同点

WebDriver:根据id class xpath进行定位直接截图
AppCrawler:ReactWebDriver模式:先getPageSource获取所有的元素列表 根据配置好的宽泛的xpath直接选择元素 然后再生成匹配到的每个元素的唯一定位xpath表达式或者id定位表达式 然后调用appium定位并执行action截图时增加对选择控件的高亮区分

配置文件参考

https://github.com/seveniruby/AppCrawler/blob/2.3.1/src/main/scala/com/testerhome/appcrawler/CrawlerConf.scala

package com.testerhome.appcrawlerimport java.io.Fileimport com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import org.openqa.selenium.interactions.Actionsimport scala.collection.mutable
import scala.collection.mutable.ListBuffer
import scala.io.Source/*** Created by seveniruby on 16/1/6.*/
class CrawlerConf {/** 插件列表,暂时禁用,太高级了,很多人不会用 */var pluginList = List[String]()/** 是否截图 */var saveScreen = truevar reportTitle = ""/** 结果目录 */var resultDir = ""/**在执行action后等待多少毫秒进行刷新*/var waitLoading=500var waitLaunch=6000//var tagLimit=scala.collection.mutable.Map[String, Int]()var showCancel = true/** 最大运行时间 */var maxTime = 3600 * 3/** 默认的最大深度10, 结合baseUrl可很好的控制遍历的范围 */var maxDepth = 10/** sikuli的数据 *///var sikuliImages=""//todo: 通过数据驱动,支持多设备/** appium的capability通用配置 */var capability = Map[String, Any](//默认不清空数据,防止有人用于微信和qq"noReset" -> "true","fullReset" -> "false",)//测试用例var testcase = ReactTestCase(name = "TesterHome AppCrawler",steps = List[Step](Step(xpath = "/*", action = "Thread.sleep(5000)")))/** 默认遍历列表,xpath有用,action暂时没启用*/var selectedList = ListBuffer[Step](Step(xpath="//*[contains(name(), 'Button')]"),//android专属Step(xpath="//*[contains(name(), 'Text') and @clickable='true' and string-length(@text)<10]"),Step(xpath="//*[@clickable='true']/*[contains(name(), 'Text') and string-length(@text)<10]"),Step(xpath="//*[contains(name(), 'Image') and @clickable='true']"),Step(xpath="//*[@clickable='true']/*[contains(name(), 'Image')]"),//ios专属Step(xpath="//*[contains(name(), 'Image') and @name!='']"),Step(xpath="//*[contains(name(), 'Text') and @name!='' and string-length(@label)<10]"),)/** 优先遍历元素 */var firstList = ListBuffer[Step]()/** 最后遍历列表 */var lastList = ListBuffer[Step](Step(xpath="//*[@selected='true']/..//*"),Step(xpath="//*[@selected='true']/../..//*"))/** 后退按钮标记, 主要用于iOS, xpath */var backButton = ListBuffer[Step](Step(xpath="Navigate up"))//todo: 去掉triggerAction/** 引导规则. name, value, times三个元素组成 */var triggerActions = ListBuffer[Step](Step(xpath="share_comment_guide_btn"))//自动生成的xpath表达式里可以包含的匹配属var xpathAttributes = List("name", "label", "value", "resource-id", "content-desc", "instance", "text")/** 先按照深度depth排序,再按照list排序,最后按照selected排序。后排序是优先级别最高的 */var sortByAttribute = List("depth", "list", "selected")//可选 default|android|id|xpath,默认状态会自动判断是否使用android定位或者ios定位var findBy="default"/** 用来确定url的元素定位xpath 他的text会被取出当作url因素 */var defineUrl = List[String]()/** 设置一个起始url和maxDepth, 用来在遍历时候指定初始状态和遍历深度 */var baseUrl = List[String]()var appWhiteList = ListBuffer[String]()/** url黑名单.用于排除某些页面 */var urlBlackList = ListBuffer[String]()var urlWhiteList = ListBuffer[String]()/** 黑名单列表 matches风格, 默认排除内容是2个数字以上的控件. */var blackList = ListBuffer[Step](Step(xpath=".*[0-9]{2}.*"))//在重启session之前做的事情var beforeRestart=ListBuffer[String]()//在执行action之前和之后默认执行的动作,比如等待var beforeElement = ListBuffer[Step](Step(xpath="/*", action="Thread.sleep(500)"))var afterElement = ListBuffer[Step]()/**是否需要刷新或者滑动*/var afterPage = ListBuffer[Step]()//afterPage执行多少次后才不执行,比如连续滑动2次都没新元素即取消var afterPageMax=2//相似控件最多点击几次var tagLimitMax = 2//个别控件可例外var tagLimit = ListBuffer[Step](//特殊的按钮,可以一直被遍历Step(xpath = "确定", times = 1000),Step(xpath = "取消", times = 1000),Step(xpath = "share_comment_guide_btn_name", times=1000))//只需要写given与then即可var assertGlobal = List[Step]()def loadByJson4s(file: String): Option[this.type] = {if (new java.io.File(file).exists()) {println(s"load config from ${file}")println(Source.fromFile(file).mkString)Some(TData.fromYaml[this.type](Source.fromFile(file).mkString))} else {println(s"conf file ${file} no exist ")None}}def save(path: String): Unit = {/*//这个方法不能正确的存储utf8编码的文字implicit val formats = DefaultFormats+ FieldSerializer[this.type]()val file = new java.io.File(path)val bw = new BufferedWriter(new FileWriter(file))log.trace(writePretty(this))log.trace(write(this))bw.write(writePretty(this))bw.close()*/val file = new java.io.File(path)val mapper = new ObjectMapper()mapper.registerModule(DefaultScalaModule)mapper.writerWithDefaultPrettyPrinter().writeValue(file, this)println(mapper.writeValueAsString(this))}def toJson(): String = {val mapper = new ObjectMapper()mapper.registerModule(DefaultScalaModule)mapper.writerWithDefaultPrettyPrinter().writeValueAsString(this)}def toYaml(): String = {val mapper = new ObjectMapper(new YAMLFactory())mapper.registerModule(DefaultScalaModule)mapper.writerWithDefaultPrettyPrinter().writeValueAsString(this)}def loadYaml(fileName: File): CrawlerConf = {val mapper = new ObjectMapper(new YAMLFactory())mapper.registerModule(DefaultScalaModule)mapper.readValue(fileName, classOf[CrawlerConf])}def loadYaml(content: String): Unit = {val mapper = new ObjectMapper(new YAMLFactory())mapper.registerModule(DefaultScalaModule)mapper.readValue(content, classOf[CrawlerConf])}def load(file: String): CrawlerConf = {load(new File(file)).get}//如果没有显式配置参数,那么就会用默认值代替def load(file: File): Option[CrawlerConf] = {val content = Source.fromFile(file, "UTF-8").getLines().mkString("\n")file.getName match {case json if json.endsWith(".json") => {Some(TData.fromJson[CrawlerConf](content))}case yaml if yaml.endsWith(".yml") || yaml.endsWith(".yaml") => {Some(TData.fromYaml[CrawlerConf](content))}case path => {println(s"${path} not support")None}}}

转载于:https://www.cnblogs.com/an5456/p/11488736.html

自动化遍历-appcrawler相关推荐

  1. 分享一个安卓app自动化遍历工具--Appetizer

    原文:https://blog.csdn.net/xgh1951/article/details/87159355 今天在群里面无意中有小伙伴介绍了这么一款安卓app自动化测试的神器,Appetize ...

  2. AppCrawler自动化遍历使用详解(版本2.1.0 )

    AppCrawle是自动遍历的app爬虫工具,最大的特点是灵活性,实现:对整个APP的所有可点击元素进行遍历点击. 优点: 1.支持android和iOS, 支持真机和模拟器 2.可通过配置来设定遍历 ...

  3. app遍历——appCrawler的使用

    1.appCrawler环境配置 1.1 apkinfo获取安装包的报名和mainActivity https://github.com/codeskyblue/apkinfo/releases 使用 ...

  4. APP全流程框架总结

    一.产品设计 产品设计七层自检模型 <用户心理学> 冯·雷斯托夫效应(Von Restorff effect)(也称为隔离效应)预测当存在多个相似对象时,不同于其他对象的是最容易被记住的! ...

  5. AppCrawler自动遍历测试

    AppCrawler 是由 seveniruby开源的一个自动遍历测试工具,谷歌有一个叫App Crawler 的遍历工具.AppCrawler具有很大的灵活性,可以自由控制测试页面,控件类型,测试深 ...

  6. 移动APP漏洞自动化检测平台建设

    前言:本文是<移动APP客户端安全笔记>系列原创文章中的第一篇,主要讲的是企业移动APP自动化漏洞检测平台建设,移动APP漏洞检测发展史与前沿技术,APP漏洞检测工具与平台,以及笔者的一些 ...

  7. android 回归测试,自动遍历回归测试工具

    一.Monkey 随机点击200个事件:adb shell monkey -p com.xxxxx.android  200 每秒10个随机事件:adb shell monkey -p com.xue ...

  8. 干货|app自动化测试之Appium 原理 与 JsonWP 协议分析

    想要使用 Appium 进行测试,那么就一定要先了解Appium的原理.Appium 不仅能够实现移动端的 JSONWP,并且延伸到了 Selenium 的 JSONWP,它能够控制不同移动设备的行为 ...

  9. APPCrawler基础教程

    一.背景 一年前,我们一直在用monkey进行Android 的稳定性测试 ,主要目的就是为了测试app 是否会产生Crash,是否会有ANR,页面错误等问题,在monkey测试过程中,实现了脱离Ca ...

  10. Testin云测试以AI自动化技术打造业内领先的兼容测试服务平台

    当前,软件性能要求越来越高,软件自身功能越来越复杂,相应的兼容测试也变得更加重要.而Testin云测试融合了AI技术的全平台兼容测试服务,则重塑了人们对兼容测试的认知. 传统的兼容测试工作,因为整体的 ...

最新文章

  1. 一份很不错的敏捷产品接口文档模板
  2. HTML语言基础.下
  3. dedecms标签使用
  4. EventBridge消息路由|高效构建消息路由能力
  5. Android loading进度条使用简单总结
  6. Android 即时通讯开发
  7. 漫画贴:16岁和36岁打球的区别,你是否怀念球场上那个年少的你?
  8. 防关联超级浏览器(超级防关联浏览器)的应用场景和技术原理
  9. 超简单集成华为HMS Scankit 扫码SDK实现扫一扫二维码
  10. Phyllotaxis算法应用
  11. HHDBCS及HHDESK的资源加密功能
  12. GTD任务清单及项目管理器2Do for Mac
  13. 关于实现手机定位,通过服务器,再发送给查询者,或指定人
  14. 2021-01-12 DataGrip2020.3 离线安装驱动
  15. MySQL如何同时删除主外键关联的两张表中的数据
  16. 名企笔试:网易游戏2017招聘笔试题(赶去公司)
  17. 微信公众号开发,清除微信内置浏览器缓存
  18. 【安卓-自定义布局】安卓App开发思路 一步一个脚印(十二)实现自定义左右滚动的信息块-仿蘑菇街
  19. ppt复现CVPR顶会流程图
  20. 用python做图片搜索引擎并保存到本地

热门文章

  1. C++如何生成随机数
  2. oracle隐含参数 开库,Oracle数据库隐含参数介绍
  3. java中怎样上传zip_java服务器如何对zip文件分包上传?
  4. python重装显示already installed_tensorflow安装出现Requirement already satisfied问题,这个是网络问题吗?...
  5. 电脑功耗监测_VOCS在线监测系统
  6. 【kmp专题】牛客网子串(进制转化+kmp/string.find())
  7. 已知树的前序遍历和中序遍历,求后序遍历的方法(转)
  8. 在线工具:找到神器,助你轻松应对各种职场难题
  9. 翻译:道路机动车辆驾驶自动化系统相关术语的分类和定义 J3016_202104
  10. 虚拟机一直安装程序正在启动服务器失败,安装使用Vmware出现的问题及解决方法...