测试开发 | AppCrawler 自动遍历测试实践(二):定制化配置

news2025/1/16 5:55:30

本文为霍格沃兹测试学院学院学员课程  AppCrawler 学习笔记,文末加群一起学习交流。

定制化配置

自动遍历测试技术以及工具该如何选择和快速入门?经过对比和需求,最终选择测试架构师思寒大佬的 AppCrawler 作为自动遍历测试的工具。以下就分享 AppCrawler 自动遍历测试的一些最佳实践经验。

模板文件生成

运行命令java -jar appcrawler-2.4.0-jar-with-dependencies.jar --demo, 会在当前目录下生成一个 demo.yml 文件,这个文件就是我们进行定制化的配置文件模板:

#执行命令生成demo.yaml模板配置文件$ java -jar appcrawler-2.4.0-jar-with-dependencies.jar --demo2019-12-01 21:33:35 INFO [AppCrawler$.86.main]----------------AppCrawler 2.4.0 [霍格沃兹测试开发学社特别纪念版]Appium 1.8.1 Java8 testedapp爬虫, 用于自动遍历测试. 支持Android和iOS, 支持真机和模拟器项目地址: https://github.com/seveniruby/AppCrawler
--------------------------------
2019-12-01 21:33:35 INFO [AppCrawler$.223.parseParams] use default appium address 47232019-12-01 21:33:35 INFO [AppCrawler$.230.parseParams] appium address = Some(http://127.0.0.1:4723/wd/hub)2019-12-01 21:33:35 INFO [AppCrawler$.242.parseParams] result directory = 201912012133352019-12-01 21:33:36 INFO [AppCrawler$.286.parseParams] you can read /Users/qinzhen/Documents/TestDev/AppCrawler/demo.yml for demo
#查看配置文件已生成$ lsappcrawler-2.4.0-jar-with-dependencies.jardemo.yml

  • 打开配置文件demo.yaml如下:

---pluginList: []saveScreen: truereportTitle: ""resultDir: "20191201213335"waitLoading: 500waitLaunch: 6000showCancel: truemaxTime: 10800maxDepth: 10capability:  noReset: "true"  fullReset: "false"  appium: "http://127.0.0.1:4723/wd/hub"testcase:  name: "Ceshiren AppCrawler"  steps:  - given: []    when: null    then: []    xpath: "/*"    action: "Thread.sleep(5000)"    actions: []    times: 0selectedList:- given: []  when: null  then: []  xpath: "//*[contains(name(), 'Button')]"  action: null  actions: []  times: 0- given: []  when: null  then: []  xpath: "//*[contains(name(), 'Text') and @clickable='true' and string-length(@text)<10]"  action: null  actions: []  times: 0- given: []  when: null  then: []  xpath: "//*[@clickable='true']/*[contains(name(), 'Text') and string-length(@text)<10]"  action: null  actions: []  times: 0- given: []  when: null  then: []  xpath: "//*[contains(name(), 'Image') and @clickable='true']"  action: null  actions: []  times: 0- given: []  when: null  then: []  xpath: "//*[@clickable='true']/*[contains(name(), 'Image')]"  action: null  actions: []  times: 0- given: []  when: null  then: []  xpath: "//*[contains(name(), 'Image') and @name!='']"  action: null  actions: []  times: 0- given: []  when: null  then: []  xpath: "//*[contains(name(), 'Text') and @name!='' and string-length(@label)<10]"  action: null  actions: []  times: 0firstList: []lastList:- given: []  when: null  then: []  xpath: "//*[@selected='true']/..//*"  action: null  actions: []  times: 0- given: []  when: null  then: []  xpath: "//*[@selected='true']/../..//*"  action: null  actions: []  times: 0backButton:- given: []  when: null  then: []  xpath: "Navigate up"  action: null  actions: []  times: 0triggerActions:- given: []  when: null  then: []  xpath: "share_comment_guide_btn"  action: null  actions: []  times: 0xpathAttributes:- "name"- "label"- "value"- "resource-id"- "content-desc"- "instance"- "text"sortByAttribute:- "depth"- "list"- "selected"findBy: "default"defineUrl: []baseUrl: []appWhiteList: []urlBlackList: []urlWhiteList: []blackList:- given: []  when: null  then: []  xpath: ".*[0-9]{2}.*"  action: null  actions: []  times: 0beforeRestart: []beforeElement:- given: []  when: null  then: []  xpath: "/*"  action: "Thread.sleep(500)"  actions: []  times: 0afterElement: []afterPage: []afterPageMax: 2tagLimitMax: 2tagLimit:- given: []  when: null  then: []  xpath: "确定"  action: null  actions: []  times: 1000- given: []  when: null  then: []  xpath: "取消"  action: null  actions: []  times: 1000- given: []  when: null  then: []  xpath: "share_comment_guide_btn_name"  action: null  actions: []  times: 1000assertGlobal: []

执行参数

同样,还是以雪球 App 为例,以实际操作运行来解释配置文件中各个参数的含义和用法

  • capability 设置: 与 appium 完全一致,但要注意这里默认有 noReset: "true" 和 appium: "http://127.0.0.1:4723/wd/hub"  属性,配置完成如下

capability:  noReset: "false"  fullReset: "false"  appium: "http://127.0.0.1:4723/wd/hub"  appPackage: com.xueqiu.androi  appActivity: .view.WelcomeActivityAlias  automationName: uiautomator2  autoGrantPermissions: true

这里再介绍两个很有趣也很有用的参数:


dontStopAppOnReset: true ;这个参数允许我们在某个页面继续执行遍历,比如我们希望App先进入到某个页面后再进行遍历,或者当一个session结束后继续下一个session的时候我们希望不要杀死App重新执行,而是继续上一次结束的页面开始执行

ignoreUnimportantViews这个参数设置为true的时候可以忽略不重要的view,加速pageSource的加载,加快测试速度

  • testcase: 用于启动APP后的基础测试用例

执行参数

完整形态

允许我们以 givenwhenthen 的形式指定操作,如果学习过 Java 的接口自动化框架 rest-assured 话可以很容易理解这三个参数表达的含义:

  • given : 所有的先决条件,给定一个条件,只有条件成立的时候才完成后面的操作(实际用的较少)

  • when : 先决条件成立后的行为,对什么事件做什么事情

  • then : 断言集合,事件结束后对结果断言

具体写法如下:

testcase:  name: "Ceshiren AppCrawler"  steps:   - when:     xpath: //*    action: driver.swipe(0.5, 0.8, 0.5, 0.2)   - when:     xpath: //*    action: driver.swipe(0.5, 0.2, 0.5, 0.8)     then:      - //*[contains(@text, '美股')]  

执行参数 

简写形态

另外实际使用中我们会经常使用简写形态

  • 直接使用 xpath 对应 when 里面的 xpath 

  • 直接使用 action 对应 when 里面的 action 具体写法如下:

- xpath: 自选  action: click  then:  - //*[contains(@text, '美股')]

注:定位模式除了可以使用 xpath 之外还可以使用正则和包含关系,只不过经常使用的是 xpath,也更为严谨;

  • 正则:使用^开头的就认定为正则,^确定$^.*输入密码

  • 包含:可以使用元素其中包含的内容进行定位; 密码输入

这里以雪球首页搜索框输入 alibaba 的简单场景举例,在搜索前还需要处理掉升级弹框,修改完成如下:

testcase:  name: "XueQiuTestDemo AppCrawler"  steps:  - { xpath: "//*[contains(@resource-id,'image_cancel')]", action: click }  - xpath: home_search    action: click  - xpath: search_input_text    action: alibaba

如上的 testcase 写法还要多说几句:

  • 也可以使用 {} 将需要执行的事件包裹起来,元素定位符和操作 action 时间用逗号隔开

  • {} 内若使用 xpath 表达式的话需要加双引号

  • xpath 中直接写 id 或 text 文本信息,就会默认使用包含去查找

  • 需要点击的事件要明确指明 click,某则会报错;虽然思寒说过默认的 action 就是 click ,但是经过实测发现在 2.4.0 版本上必须指明 action:click ; 很可能是思寒本地使用的内部版本经过了优化更新还未来得及开源到 GitHub上。

运行效果:

 

 

selectedList: 遍历范围设定
这里如果想设置让其点击所有可点击的TextViewImageView控件,修改完成如下:

selectedList:- xpath: //android.widget.ImageView[@clickable='true']- xpath: //*[@clickable='true' and contains(@class,"Text")]
  • firstList: 优先被点击

  • lastList:最后执行 设置其最后才执行"确定"按钮,修改完成如下:

lastList:- { xpath: text_yes, action: click }
  • backButton: 当所有元素都被点击后默认后退控件定位

  • blackList:黑名单

  • triggerAction: 特定条件出发执行动作的设置;设置遇到重置密码输入框时输入123456abc两次,修改完成如下:

triggerActions:- { xpath: android.widget.EditText, action: 123456abc, times: 2 }
  • tagLimitMax: 全局设置,同类型的最多点击的次数;这里设置为2次

tagLimitMax: 2

  • tagLimit: 自定义控件类型的点击次数,这里设置对于ListView类型的只点击一次; 修改完成如下 :

- { xpath: "//*[contains(@class, 'List')]//*", times: 1 }

  • maxDepth: 遍历的最大深度

  • assertGlobal:设置一个全局断言,例如可设置断言在当前App,如果包名不符合,就可能发生了崩溃,便会报错

    注:执行参数比配置文件优先级高

到这里,appcrawler的基本语法和参数含义大致介绍了一遍,后面就是如何结合实际进行使用了。下一篇将进行详细的介绍。

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

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

相关文章

LeetCode 112. 路径总和

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 112. 路径总和&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 112…

Cadence PCB仿真使用Allegro PCB SI按照指定的规则自动创建差分对方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI按照指定的规则自动创建差分的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可…

在使用示波器时,为什么有些波形感觉一直在晃?

我们可以从三个角度进行分析&#xff1a; 采样分析&#xff1a; 1、示波器采样信号的过程如上图&#xff1a;采样——处理——采样——处理。 2、处理时间也称死区时间&#xff0c;死区时间内示波器不监测输入信号。 3、提高波形刷新率&#xff0c;实质上是减少了死区时间&…

MyBatis-Plus数据安全保护(配置安全)

SpringBootMyBatis-Plus配置安全 1.该功能为了保护数据库配置及数据安全&#xff0c;在一定的程度上控制开发人员流动导致敏感信息泄露2.加密配置 mpw: 开头紧接加密内容&#xff08; 非数据库配置专用 YML 中其它配置也是可以使用的 &#xff09;3.随机密钥请负责人妥善保管&a…

设计模式_创建型模式 -《原型模式》

设计模式_创建型模式 -《原型模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 原型模式 (Prototype Pattern) &#xff1a;用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建…

Kafka的相关知识

一. Kafka基本介绍 Kafka是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统。具有&#xff1a;高吞吐量、低延迟、可扩展性、持久性、可靠性、容错性、高并发等特性。常见的…

RabbitMQ(五)常见面试题

目录1. 什么是 RabbitMQ&#xff1f;2.为什么要使用 RabbitMQ&#xff1f;3.使用 RabbitMQ 的场景4.如何确保消息正确地发送至 RabbitMQ&#xff1f;如何确保消息接收方消费了消息&#xff1f;5.如何避免消息重复投递或重复消费&#xff1f;6.消息基于什么传输&#xff1f;7.消…

基于java ssm springboot网上蛋糕商城项目设计和实现

基于java ssm springboot网上蛋糕商城项目设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

CAD中还能装ArcGIS?还能加载影像?定义坐标系?

时常我们需要CAD中插入影像 需要CAD数据转换GIS数据 需要CAD加载GIS数据 需要将CAD与GIS数据套库 却被坐标系搞蒙了 今天&#xff0c;我们就来解决以上的问题&#xff0c;介绍一款免费的ArcGIS插件——ArcGIS for AutoCAD。 这个模块插件可以直接访问在线地图。直接在CAD中…

Java实验——定义一个表示学生信息的类Student,要求如下:

一、题目要求 定义一个表示学生信息的类Student&#xff0c;要求如下&#xff1a; &#xff08;1&#xff09;类Student的成员变量&#xff1a; sNO 表示学号&#xff1b;sName表示姓名&#xff1b;sSex表示性别&#xff1b;sAge表示年龄&#xff1b;sJava&#xff1a;表示…

测试开发 | 如何模拟真实使用场景?mock 技术来帮你

mock 是一种通过代理修改请求与响应&#xff0c;从而辅助构造更多应用场景的工具。比如在工作中&#xff0c;可能需要 mock 第三方的回调给到测试人员测试的环境&#xff0c;从而更顺利的开展测试工作&#xff0c;也使得测试环境更接近真实的使用场景。Charles 修改请求与响应M…

Android自定义时间选择器

效果图 一、添加NumberPicker开源库 需要添加以下控件 仓库地址&#xff1a; https://github.com/ShawnLin013/NumberPicker implementation io.github.ShawnLin013:number-picker:2.4.13 二、 添加弹出框主题样式 在drawable文件夹下新建一个bg_bottom_dialog.xml&…

jenkins结合gitlable企业集成部署实战

简介 Jenkins是一个开源软件项目&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成 1.0 …

新的跨平台渲染引擎:Ab3d.DXEngine 5.2 Crack

用于 WPF 和 WinForms 的 DirectX 11 3D 渲染引擎 Ab3d.DXEngine 是一种超快的 3D 渲染引擎&#xff0c;可用于 .Net 桌面应用程序。采集 by Ω578867473 Ab3d.DXEngine采用超快的多线程渲染技术&#xff0c;可以充分利用显卡&#xff0c;提供与使用C时几乎相同的极致性能。 该…

javaEE 初阶 — 线程安全的集合类

文章目录1. 多线程环境使用 ArrayList多线程使用队列3. 多线程环境使用哈希表3.1 Hashtable3.2 ConcurrentHashMap4. 相关面试题1. 多线程环境使用 ArrayList java 标准库里的大部分集合类都是 “线程不安全” 的。 多个线程使用同一个集合类对象&#xff0c;很有可能会出问题。…

WebDAV之葫芦儿·派盘+Air Explorer

Air Explorer 支持WebDAV方式连接葫芦儿派盘。 电脑本地硬盘不够,网盘云存储已经成为存储的一种趋势。网盘限额,数据存在多个网盘内,操作麻烦还费事。 Airexplorer可以完美解决这个困扰。Air Explorer是一款非常不错的云存储账户管理软件,常见的在线云存储服务器都支持;还…

六道算法基础题详解

目录 1.力扣第217题&#xff1a;存在重复元素 2.力扣第53题&#xff1a;最大子数组和 3.力扣第1题&#xff1a;两数之和 4.力扣第88题&#xff1a;合并两个有序数组 5.牛客BM1题&#xff1a;反转链表 6.牛客BM2题&#xff1a;链表内指定区间反转 1.力扣第217题&#xff1…

6.1、应用层概述

1、基本概述 应用层是计算机网络体系结构的最顶层\color{red}最顶层最顶层&#xff0c;是设计和建立计算机网络的最终目的\color{red}设计和建立计算机网络的最终目的设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分。 早期基于文本的应用(电子邮件…

RNNoise:学习噪声抑制

目录 1. RNNoise简介 2. 噪声抑制 3. 深度学习和循环神经网络 4. 一种混合的方法 6. 关于数据集 7. 从python到C语言 8. 其他资源 RNNoise&#xff1a;学习噪声抑制 原文地址&#xff1a;RNNoise: Learning Noise Suppression (jmvalin.ca) 1. RNNoise简介 该例子展示…

共享购深度解析——新玩法解读

共享经济模式以合理配置网络资源、减少销售市场交易费用、推动私营经济强势来袭等优点颠覆性创新地严重影响传统商业模式&#xff0c;根据“自由者”的协同&#xff0c;共享经济模式给供需彼此更自由选择和由上而下的制度变革&#xff0c;提高了经济形势高效率&#xff0c;变成…