怎么通过name配置button_利器 | 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移动测试技术交流: https://testerhome.com联络作者: seveniruby@testerhome.com (思寒)致谢: 晓光 泉龙 杨榕 恒温 mikezhou yaming116 沐木--------------------------------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: "TesterHome 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后的基础测试用例
允许我们以 given、when、then 的形式指定操作,如果学习过 Java 的接口自动化框架 rest-assured 话可以很容易理解这三个参数表达的含义:
- given : 所有的先决条件,给定一个条件,只有条件成立的时候才完成后面的操作(实际用的较少)
- when : 先决条件成立后的行为,对什么事件做什么事情
- then : 断言集合,事件结束后对结果断言
具体写法如下:
testcase: name: "TesterHome 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: 遍历范围设定
这里如果想设置让其点击所有可点击的TextView和ImageView控件,修改完成如下:
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的基本语法和参数含义大致介绍了一遍,后面就是如何结合实际进行使用了。
(文章来源于霍格沃兹测试学院)
怎么通过name配置button_利器 | AppCrawler 自动遍历测试实践(二):定制化配置相关推荐
- 利器 | AppCrawler 自动遍历测试工具实践(一)
简介 1.1 概要 AppCrawler 是由霍格沃兹测试学院校长思寒开源的一个项目,通过名字我们大概也能猜出个方向,Crawler 是爬虫的意思,App 的爬虫,遍历 App : 官方 GitHub ...
- AppCrawler自动遍历测试
AppCrawler 是由 seveniruby开源的一个自动遍历测试工具,谷歌有一个叫App Crawler 的遍历工具.AppCrawler具有很大的灵活性,可以自由控制测试页面,控件类型,测试深 ...
- 自动化测试的理想境界:AppCrawler自动遍历工具
内容来源:2017 年 6 月 24 日,TesterHome联合创始人黄延胜在"Testwo第一届测试分享沙龙"进行<App crawler自动遍历工具>演讲分享.I ...
- 初探自动遍历测试工具-AppCrawler
1.简介 1.1 概要 AppCrawler是由TesterHome联合创始人黄延胜(思寒)大佬开源的一个项目,通过名字我们大概也能猜出个方向,Crawler是爬虫的意思,App的爬虫,遍历App:官 ...
- .NET Core开发实战(第14课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记...
14 | 自定义配置数据源:低成本实现定制化配置方案 这一节讲解如何定义自己的数据源,来扩展配置框架 扩展步骤 1.实现 IConfigurationSource 2.实现 IConfiguratio ...
- Android 9.0 进入recovery模式 自动恢复出厂设置的定制化
1.概述 在9.0 设备中,由于定制的设备没有音量+和音量-按键,所以通过手动选择recovery选择界面的模式时,就不能选择进入哪种模式,这时就需要进入recovery的时候,默认进入恢复出厂设置模 ...
- android循环遍历assert,AppCrawler自动遍历工具
前言 AppCrawler是一个基于自动遍历的app爬虫工具. 支持android和iOS, 支持真机和模拟器. 最大的特点是灵活性. 可通过配置来设定遍历的规则. AppCrawler地址 环境准备 ...
- 03-17 APP自动遍历测试技术
monkey 是一个在模拟器或者设备上运行的程序,用于生成用户事件的伪随机流 安装 Android SDK 自带 使用 基本配置选项 adb shell monkey 100 # 对所有包随机操作 1 ...
- 计算机基本配置检测单,怎么查看与测试PC电脑的硬件配置
看了硬件配置可能还不够,我们还要知道这个配置到底是什么性能,比如游戏性能,散热能力,电池续航等实际中的性能.下面是学习啦小编收集整理的怎么查看与测试PC电脑的硬件配置,希望对大家有帮助~~ 查看与测试 ...
最新文章
- 英伟达TensorRT 8-bit Inference推理
- 微信notify mysql_微信支付的notify.php中如何获取订单号(php版)
- arm linux gcc fpic,【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义
- iOS之应用偏好设置
- 【高校宿舍管理系统】第三章 Layui整合Axios
- 修改tomcat控制台title的方法
- Android UI学习之ListView(使用BaseAdapter)
- 易语言大漠插件模块制作设置字库及OcrEx识别字符串
- vue2 vue3 js es6 html css 知识点
- oracle interval加一秒,oracle 用interval时间计算_20170216
- 音标、音节、音素、音符
- mysql5.1.40.jrp_1.原生态JDBC编程中的问题总结
- 抖音前端团队国际化是怎么做的?
- 长安“战疫“网络安全赛Writeup
- 2011年7月15日
- git克隆代码库时使用指定的用户名密码
- 以微信小程序相册为例,看Serverless DevOps最佳实践
- geoserver 3_【第255期】排列3研究分析(254期中直选组选大底253期中精选底中7码组选中直选组选底251期中直选组选大底...
- 【ffmpeg】CasparCG Server 帧率、duration的处理
- 微雪知寒意 回首不是春
热门文章
- 袁绍困局与张朝阳的雄心——类微博的狐友能让搜狐重回主战场吗
- html怎么鼠标经过添加蒙版遮罩,js实现鼠标移动到图片产生遮罩效果
- c 传图片数据给matlab,c++ - 如何通过UDP将数据从C ++应用程序发送到Matlab并进行绘制 - 堆栈内存溢出...
- android 状态栏 背景色_技术一面:说说Android动态换肤实现原理
- linux发邮件安装什么意思,linux – 如何找出安装/发送电子邮件的邮件程序?
- 使用pip安装python库的几种方式,解决pip安装python库慢的问题
- Python3压缩和解压缩实现
- Python3 字符串与hex之间的相互转换
- Python基础教程:函数及其参数
- Python中sort与sorted函数