自动遍历测试利器:开源工具AppCrawler 配置全解析

news/2025/9/28 14:24:29/文章来源:https://www.cnblogs.com/hogwarts/p/19116590

Appcrawler是一个基于自动遍历的App爬虫工具,支持Android和IOS,支持真机和模拟器。最大的特点是灵活性高,可通过配置来设定遍历的规则。

配置文件格式
执行参数与配置文件
capability设置:与appium完全一致
testcase:用于启动app后的基础测试用例
selectedList:遍历范围设定
triggerActions:特定条件触发执行动作的设置
selectedList:需要被遍历的元素范围
firstList:优先被点击
lastList:最后被点击
tagLimitMax:同祖先(同类型)的元素最多点击多少次
backButton:当所有元素都被点击后默认后退控件定位
blackList:黑名单
maxDepth: 遍历的最大深度
配置的最小单元 测试用例模型
testcase的完整形态
given:所有的先决条件
when:先决条件成立后的行为
then:断言集合
testcase的简写形态
xpath:对应when里的xpath
action:对应when的action
执行参数比配置文件优先级别高
given 前提条件
when 执行动作
then 写断言
简写形态
xpath xpath支持xpath表达式、正则、包含
action 支持
xpath定义
xpath - //[@resource-id=‘xxxx’] - //[contains(@text, ‘密码’)]
正则 - ^确定$ - ^.*输入密码
包含 - 密码 - 输入 - 请
action定义
"" 只是截图记录
back 后退
backApp 回退到当前的app 默认等价于back行为 可定制
monkey 随机事件
click
longTap
xxx() 执行scala或者java代码 - Thread.sleep(3000) - driver.swipe(0.9, 0.5, 0.1, 0.5)
非以上所有行为是输入 xx ddd
完整配置文件

---
maxTimeDescription: "最大运行时间"
maxTime: 10800
maxDepthDescription: "默认的最大深度10, 结合baseUrl可很好的控制遍历的范围"
maxDepth: 10
capabilityDescription: "appium的capability通用配置,其中automationName代表自动化的驱动引擎,除了支持appium的\所有引擎外,额外增加了adb和selenium的支持"
capability:appActivity: ".ApiDemos"appium: "http://127.0.0.1:4723/wd/hub"noReset: "true"appPackage: "io.appium.android.apis"fullReset: "false"
testcaseDescription: "测试用例设置,用于遍历开始之前的一些前置操作,比如自动登录"
testcase:name: "AppCrawler TestCase"steps:- given: []when: nullthen: []xpath: "/*/*"action: "Thread.sleep(1000)"actions: []times: -1
triggerActionsDescription: "在遍历过程中需要随时处理的一些操作,比如弹框、登录等"
triggerActions:- given: []when: nullthen: []xpath: "permission_allow_button"action: ""actions: []times: 3- given: []when: nullthen: []xpath: "允许"action: ""actions: []times: 3
selectedListDescription: "默认遍历列表,只有出现在这个列表里的控件范围才会被遍历"
selectedList:- given: []when: nullthen: []xpath: "//*[contains(name(), 'Button')]"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[contains(name(), 'Text') and @clickable='true' and string-length(@text)<10]"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[@clickable='true']//*[contains(name(), 'Text') and string-length(@text)<10]"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[contains(name(), 'Image') and @clickable='true']"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[@clickable='true']/*[contains(name(), 'Image')]"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[contains(name(), 'Image') and @name!='']"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[contains(name(), 'Text') and @name!='' and string-length(@label)<10]"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//a"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[contains(@class, 'Text') and @clickable='true' and string-length(@text)<10]"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[@clickable='true']//*[contains(@class, 'Text') and string-length(@text)<10]"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[contains(@class, 'Image') and @clickable='true']"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[@clickable='true']/*[contains(@class, 'Image')]"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[@clickable='true' and contains(@class, 'Button')]"action: ""actions: []times: -1
blackListDescription: "黑名单列表 matches风格, 默认排除内容包含2个数字的控件"
blackList:- given: []when: nullthen: []xpath: ".*[0-9]{2}.*"action: ""actions: []times: -1
firstListDescription: "优先遍历列表,同时出现在selectedList与firstList中的控件会被优先遍历"
firstList: []
lastListDescription: "最后遍历列表,同时出现在selectedList与lastList中的控件会被最后遍历"
lastList:- given: []when: nullthen: []xpath: "//*[@selected='true']/..//*"action: ""actions: []times: -1- given: []when: nullthen: []xpath: "//*[@selected='true']/../..//*"action: ""actions: []times: -1
backButtonDescription: "后退按钮列表,默认在所有控件遍历完成后,才会最后点击后退按钮。目前具备了自动判断返回按钮的能力,默认不需要配置"
backButton:- given: []when: nullthen: []xpath: "Navigate up"action: ""actions: []times: -1
xpathAttributesDescription: "在生成一个控件的唯一定位符中应该包含的关键属性"
xpathAttributes:- "name()"- "name"- "label"- "value"- "resource-id"- "content-desc"- "text"- "id"- "name"- "innerText"- "tag"- "class"
sortByAttributeDescription: "陆续根据属性进行遍历排序微调,depth表示从dom中最深层的控件开始遍历,list表示dom中列表优先,\selected表示菜单最后遍历,这是默认规则,一般不需要改变"
sortByAttribute:- "depth"- "list"- "selected"
findByDescription: "默认生成控件唯一定位符的表达式风格,可选项 default|android|id|xpath,默认会自动判断是否使用android定\位或者ios定位"
findBy: "xpath"
baseUrlDescription: "设置一个起始点,从这个起始点开始计算深度,比如默认从登录后的界面开始计算"
baseUrl: []
appWhiteListDescription: "app白名单,允许在这些app里进行遍历"
appWhiteList: []
urlBlackListDescription: "url黑名单,用于排除某些页面的遍历"
urlBlackList: []
urlWhiteListDescription: "url白名单,仅在这些界面内遍历"
urlWhiteList: []
beforeStartWaitDescription: "启动一个app默认等待的时间"
beforeStartWait: 6000
beforeRestart: []
beforeElementDescription: "在遍历每个控件之前默认执行的动作"
beforeElement: []
afterElementDescription: "在遍历每个控件之后默认执行的动作"
afterElement: []
afterElementWaitDescription: "在遍历每个控件之后默认等待的时间,用于等待新页面加载"
afterElementWait: 500
afterAllDescription: "在遍历完当前页面内的所有控件后,是否需要刷新或者滑动"
afterAll: []
afterAllMaxDescription: "afterAll的最大重试次数,比如连续滑动2次都没新元素即取消"
afterAllMax: 2
tagLimitMaxDescription: "相似控件最多点击几次"
tagLimitMax: 2
tagLimitDescription: "设置部分相似控件的最大遍历次数"
tagLimit:- given: []when: nullthen: []xpath: "确定"action: ""actions: []times: 1000- given: []when: nullthen: []xpath: "取消"action: ""actions: []times: 1000- given: []when: nullthen: []xpath: "share_comment_guide_btn_name"action: ""actions: []times: 1000
assertGlobalDescription: "全局断言"
assertGlobal: []
suiteNameDescription: "报告中的测试套件名字可以由列表内的控件内容替换,增强报告中关键界面的辨识度"
suiteName:- "//*[@selected='true']//android.widget.TextView/@text"
screenshotDescription: "是否截图"
screenshot: true
reportTitleDescription: "报告的title"
reportTitle: "AppCrawler"
resultDirDescription: "结果目录,如果为空会自动创建对应时间戳_报名的结果目录"
resultDir: ""
showCancelDescription: "是否展示跳过的控件记录"
showCancel: true
pluginListDescription: "插件列表,暂时禁用,太高级了,很多人不会用"
Description: "。在selectedList firstList lastList等很多配置中,需要填充的是测试步骤Step类型。Step类型由given(\满足条件)when(条件满足的行为)then(断言)三部分组成。Step可以简化为xpath(定位表达式,支持xpath 正则 包含关系)与action(点击\\ 输入等行为)。"
pluginList: []

金牌赞助商(Gold Sponsor)

77a63d3c-742c-4a60-819a-9b86f8c2c8b2

霍格沃兹测试开发学社 是 测吧(北京)科技有限公司 旗下业界领先的测试开发技术高端教育品牌。 学院课程均由名企一线测试大牛设计,提供实战驱动的系列课程。涵盖移动app自动化测试、接口自动化测试、性能测试、持续集成/持续交付/DevOps 、测试左移、测试右移、测试管理等课程。

测吧(北京)科技有限公司 是一家服务于测试领域的高科技公司,为企业提供全方位的自动化测试技术支持、测试平台开发定制、测试效能提升等咨询与科研合作服务。 先后服务于华为、工信部、信通院等知名企业与机构。

编译

mvn clean package

技术交流
由霍格沃兹测试开发学社维护,技术交流与issue提交请移步 https://ceshiren.com/c/opensource/appcrawler/ 交流

欢迎入群交流

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

得帆云ETL全新版本升级驱动数据高效流转

在数字化浪潮持续深化的背景下,数据已成为企业核心战略资产,高效的数据处理与集成能力,更是企业在数据驱动时代构筑竞争优势的关键支撑。 得帆云基于对技术创新的持续深耕及客户业务需求的深度洞察,正式推出ETL系统…

集成微信的企业网站管理系统凌河建设网站

一、Hadoop 1.x 和 2.x 的区别 二、HDFS架构 1&#xff09;NameNode&#xff08;nn&#xff09;&#xff1a;存储文件的元数据&#xff0c;如文件名&#xff0c;文件目录结构&#xff0c;文件属性&#xff08;生成时间、副本数、文件权限&#xff09;&#xff0c;以及每个文件…

挖同行墙脚!有稳定供应商的客户怎么下手构建?

挖同行墙脚!有稳定供应商的客户怎么下手构建?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

兰州网站优化服务企业建立网站

闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。 闭包的形式主要有三种&#xff1a; 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封…

开源技术崛起:中国如何构建数字经济时代的创新基础设施

开源技术崛起:中国如何构建数字经济时代的创新基础设施 在数字经济成为全球竞争新赛道的今天,开源技术已从单纯的软件开发模式跃升为国家战略级创新基础设施。中国开发者群体规模突破900万大关,本土代码托管平台通过…

250928

目录JT-JY5T2S1-1JT-JY5T2S1-2FT-(JY&VOAs) JT-JY5T2S1-1Good morning, North College Library, How can i help you? I was wondering if it will possible to join the library? Are you a student in North C…

解析网站dnshtml5做网站心得体会

232.用栈实现队列 232. 用栈实现队列 简单 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列…

北京做网站比较好的公司兼容ie8的网站模板

文章目录 1 SQLite1.1 世界上最流行的数据库1.1 SQLite简介1.2 插入语句1.3 查询数据1.4 更新数据1.5 删除数据2 DuckDB2.1 DuckDB简介2.2 DuckDB与Python结合使用2.2.1 创建表2.2.2 分析语句2.2.3 导出为parquet文件2.3 Windows中使用DuckDB3 参考附录1 SQLite Python的一个特…

地图商业授权共享 - no

地图商业授权共享 百度、高德、腾讯三大地图商业授权起步都是:5万元/年。 小企业难顶。 有需要的老铁,可以付费共享,好商量。加WX:E2E188

DevOps平台选型指南:数字化转型中的技术决策关键

DevOps平台选型指南:数字化转型中的技术决策关键 在数字化转型浪潮席卷全球的当下,DevOps平台已经从单纯的技术工具演变为企业技术架构的战略性组成部分。随着云计算、微服务架构和持续交付理念的普及,企业面临着如…

window 安全模式卸载任何软件

win+R 命令行 输入msconfig 打开系统配置 切换到引导页签,勾选安全引导后选择重启,重启后即为安全模式 安全模式下找到软件所在的文件目录,暴力删除即可,一次删除不干净,多重启几次删除就好了I have a dream : San…

定制笔记本电脑工厂排名:从基础代工到联合设计全面分析 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

题解:qoj1261 Inv

题意:给出 \(n,k\),求满足 \(p(p(i)) = i\) 且逆序对数等于 \(k\) 的排列数量对 \(2\) 取模。 做法: 对 \(2\) 取模,很神秘的东西,考虑找找性质。 注意到 \(p,p^{-1}\) 逆序对数一样,且满足条件的 \(p\) 满足 \(…

sv 去除字符串行尾空格函数

字符串去除行尾空格 函数 // 去除字符串末尾的换行符和空格符 function string remove_trailing_whitespace(string str);int len = str.len();int last_valid_index = -1;// 空字符串直接返回if (len == 0) return &q…

这么做3d展示网站展示网站欣赏

昨晚帮师姐整理测试&#xff0c;没有时间写日志&#xff0c;今天一大早补上。 十一长假之后的第一个工作日&#xff0c;老师回来了。详细汇报了整个假期的学习之后&#xff0c;老师整理了以后我的学习任务。本来觉得没多少事情&#xff0c;可是细数了一下&#xff0c;竟然光论文…

可以直接进入的网站正能量大豆网怎么用apache做网站

深度学习推理速度优化指南 简介一、显卡频率设置二、查看当前显卡频率三、调整显卡频率范围注意事项总结 简介 本文旨在探讨深度学习推理过程中 CUDA 或 TensorRT 推理速度变慢的问题&#xff0c;并提供实用的解决策略。我们将从显卡频率设置、模型权重优化等方面出发&#xf…

做网站挣钱吗现在wordpress qq登陆评论

Chapter Ⅰ 介绍Ansible ansible ansible是一款开源自动化平台 ansible围绕一种无代理架构构建&#xff0c;在控制节点上安装ansible&#xff0c;且客户端不需要任何特殊的代理软件&#xff1b;ansible使用SSH等标准协议连接受管主机&#xff0c;并在受管主机上运行代码或命令来…

LeetCode 386 字典序排数 Swift 题解:模拟字典翻页的遍历技巧 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

题解:AT_abc214_g [ABC214G] Three Permutations

题意:很简单了,不再赘述。 做法: 直接做很困难,考虑容斥,钦定若干个 \(i=x_i\) 或者 \(i=y_i\),然后如果钦定了 \(k\) 个,那么贡献是 \((n-k)!(-1)^k\)。 但是有个问题,我们不能无脑钦定,这些钦定条件间会有一…

通过velocity将增量发版的代码及文件生成生成一个linux shell文件(解放运维)

pom.xm <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId></dependency> resource/shell/release_cp.sh.vm发版失败回…