通过使用appium-desktop录制脚本,编写app自动化脚本的过程中,会使用到一些AW,下面就这些AW的使用方法做详细的介绍。通过实践可以看到这几个AW可以完成测试工作。

AWOpenGivePage

1、功能描述

路由打开给定的页面

2、字段描述

       字段名称                                 

       是否必须                           

       字段类型                                                         

描述

pageRouter     

String

需要打开页面的pg或者js地址。框架中目前配置了一些页面的PG,录脚本时会自动填充,如果没有配置过,脚本录制后需要手动修改下脚本。或者联系我在框架中添加(需要提供页面的activity和PG)

3、举例

  {
"className": "AWOpenGivePage",
"remark": "打开指定页面",
"pageRouter": "https://xxxxx/xxxx/xxx/xxxx.weex.js"
} {
"className": "AWOpenGivePage",
"remark": "打开指定页面",
"pageRouter": "en51cc://xxx/xxxx/xxxx"
}


AWAppiumDriver

1、功能描述

driver的初始化、关闭

2、字段描述

             字段名称                    

       是否必须                  

       字段类型               

描述

action

String

动作

open:初始化driver

close:关闭driver

url

String

请求appium-server地址;默认:http://127.0.0.1:4723/wd/hub

allRecord

Boolean 是否都是录制脚本,默认false;true时不再加载数据库中保存的控件元素(非录制脚本,控件元素是通过接口落地到数据库中,执行脚本时需要从数据库中读取出来)

appActivity

String 要启动app的首页activity,默认管家

appPackage

String 要启动app的包名,默认管家

3、举例

    {
"className": "AWAppiumDriver",
"url": "http://127.0.0.1:4723/wd/hub",
"action": "open",
"allRecord": "true",
"appActivity":"com.xxxx",
"appPackage":"com.xxxx"
}

AWAppiumRecordAction

1、功能描述

提供多种查找元素的方式,以及页面操作执行。该AW内容一般都是录制出来的,特殊点见字段描述

2、字段描述

          字段名称                                                                                                                                           

   是否必须                                                                                                        

                 字段类型                                                                                                                                  

           描述                            

elementInfoList

 

List<List<String>>

具体操作步骤:["美团外卖店主","click", "accessibility id","美团外卖店主"]

1、支持的操作click、sendKeys、tap、swipe、tapSendKey。

2、支持在上面的click/sendKeys操作前面加check,默认false。比如:checkclick:true、checkclick、checksendKeys:false。作用是在操作之前检查元素是否存在,true标示一次执行期间每次都检查,否则只检查一次。

3、1中支持的所有操作,除了tapSendKey,其它都是通过录制脚本录制。tapSendKey使用于有些页面输入框元素定位不到,只能通过定位坐标的方式进行输入。录制时可以先录制为tap操作,录制成功后(["坐标点击","tap", "","0.4361111111111111","0.2875"]),手动修改脚本,tap修改为tapSendKey,数组后面添加需要输入的内容(["坐标点击","tapSendKey", "","0.4361111111111111","0.2875","15267081011"])

4、每种操作的操作步骤都可以在数组的最后面添加等待时间,默认10秒钟。比如:["美团外卖店主","click", "accessibility id","美团外卖店主","15"]

5、元素定位方式,脚本录制中主要使用id、accessibility id、xpath、h5classname,其中xpath有时候录制出来的是全路径,为了提高执行效率可以手动修改为相对路径;当录制页面是webView页面时,定位输入框使用h5classname方式,目的是兼容不同型号、不同系统的手机对该页面解析可能不一致的问题。除了上面提到的三种方式,常用还有classnames方式

6、classnames使用方式,场景:需要定位的元素存在多个,除了xpath以外,其它一样。录制完成后(["点击相册","click", "xpath","//android.widget.TextView[@text='相册']"])修改xpath修改为classnames,后面路径修改为classname:instance格式(android.widget.TextView:11)

checkElementInfo

 

List<List<String>>

具体操作步骤:["是否有更新提示","click","xpath","//android.widget.TextView[@text='检查到测试包有更新,是否安装?']","5"],

1、检查该字段第一个元素是否存在,存在就执行该字段所有的操作步骤,否则不执行,继续执行elementInfoList中的操作步骤

2、功能与上个字段的check功能类似,两个可以相互切换。不同点是有多个步骤需要检查时使用check可以一个AW完成,使用checkElementInfo需要多个AW分开写。

3、举例

纯粹演示AW使用方法,内容步骤无意义

{
"className": "AWAppiumRecordAction",
"remark": "用户登录",
"checkElementInfo":[
["是否有更新提示","click","xpath","//android.widget.TextView[@text='检查到测试包有更新,是否安装?']","5"],
["点击下次更新","click","xpath","//android.widget.CheckBox[@text='不再提醒']","1"]
],
"elementInfoList":
["点击不再提示","checkclick:true","xpath","//android.widget.TextView[@text='下次再说']","1"],
["账号密码登录","click", "id","com.zhangdan.app:id/TextView_Go_UserName"],
["重试","checkclick", "accessibility id","重试"]
["11位手机号码","sendKeys", "id", "com.zhangdan.app:id/EditText_Passwd","${passwd}"],
["11位手机号码","sendKeys", "h5classname", "android.widget.EditText:1","${passwd}"]
["如果有密码键盘的情况,需要滑屏","swipe", "","0.47685185185185186","0.3758278145695364","0.48055555555555557","0.2052980132450331","5"],
["坐标点击","tapSendKey", "","0.3537037037037037","0.3859375","111111"]
["坐标点击","tap", "","0.4861111111111111","0.5083333333333333"]
["招行","click""classnames", "android.widget.TextView:11"]
]
}

AWRecordAssert

1、功能描述

结果校验,支持校验元素是否存在、元素各个属性的值以及控件颜色等

2、字段描述

          字段名称                                                                

  是否必须                                      

             字段类型                                                                   

描述

checkElementInfo

List<List<String>>

需要检验的各元素["手动输入花呗账单","accessibility id", "3","手动输入花呗账单"]

1、元素定位方式除了AWAppiumRecordAction提到,还支持toast、toastLike方式。

2、每个校验项数组后面支持增加等待时间,默认10秒。

3、数组中第三个元素标示校验项,3标示检验元素存在。还支持元素其它属性值校验,替换掉3即可,比如:text、checkable、clickable等。需要注意除了3以外,填写其它校验项时需要在数组后面添加一个期望的值

4、支持颜色校验["手动输入花呗账单","accessibility id", "color","手动输入花呗账单","#FFFFF"],由于期望的颜色是十六进制颜色码,所以使用时,期望值可以先随便填写一个,运行脚本后查看日志打印的实际的十六进制颜色码是多少。再修改脚本。

checkExit

Boolean

检验元素是否存在,默认true,检验元素存在,否则检验元素不存在

3、举例

     {
"className":"AWRecordAssert",
"checkElementInfo":[
["", "id","3","com.ali.user.mobile.security.ui:id/viewContainers"]
["所有待还 (元)","id", "text","com.zhangdan.app:id/tv_line1","所有待还 (元)"],
["招行 网银37 1001","classnames", "text","android.widget.TextView:18","6666"]
["淘宝店主", "accessibility id","3","淘宝店主"]
["toast校验","toastLike", "3","请输入有效密码"]
["手动输入花呗账单","accessibility id", "color","手动输入花呗账单","#FFFFF"]
]
}

AWKeyBoardAction

1、功能描述

纯粹键盘操作,不依赖元素。

2、字段描述

字段名称

  是否必须  

    字段类型    

描述

actionName

String

操作名称

默认back,返回到上一级。

hideKeyboard 隐藏键盘

switchToNative 切换到native

3、举例

{
"className":"AWKeyBoardAction"
}
{
"className":"AWKeyBoardAction",
"actionName":"hideKeyboard"
}

AWSleep

1、功能描述

线程等待时间

2、字段描述

3、举例

{
"className": "AWSleep",
"seconds": "1"
}

AWHttpClient

1 功能描述

发送HTTP请求到服务端,并按照一定规则校验服务端返回的响应消息。

2 字段描述

字段名称   是否必须          字段类型            描述

request

HttpClientRequest

Http request相关信息,具体请参见下表2.1
reponseExpected
HttpClientResponse

Http reponseExpected 相关信息,具体请参见下表2.2

config
MapComparedConfig
MapComparedConfig相关信息,具体请参见1.1.1
retryTime int 请求重试次数(不包含原请求),默认为0,如值为3,则表示最多请求4次
retrySecond int 重试的间隔时间,单位为秒,默认立即重试
retryStateCodeList List<Integer> 匹配的响应状态码集合,如[500, 501]表示如果响应状态码为500或501时则进行重试,不设置时根据reponseExpected的stateCode与实际响应状态码比对,不一致则进行重试

重试策略说明:

1.若响应返回为null则直接进行重试
2.如果未设置retryStateCodeList或retryStateCodeList为空集合,则判断reponseExpected.getStateCode()是否与实际的状态码是否一致,不一致则进行请求重试
3.如果retryStateCodeList不为空集合,则判断retryStateCodeList集合是否包含实际状态码,若包含则进行重试

2.1 HttpClientRequest

字段名称 是否必须        字段类型             描述

type

String

请求类型,1:GET 2:POST 3:PUT 4:DELETE 5:PATCH
url String

request链接地址,如:"url":"http://xxxxx/xxxx/api/v1/xxxx"

或者"url":"${global.data.gjj.addr}${global.gjj.url.newaccounts}",

query
Map<String, String>
query map,URL问号后面的键值对
path
Map<String, String>
path map,URL中path部分的键值对
headers
Map<String, String>
请求头
requestBody
Object
post/put请求的body,可以直接复制 swagger的请求

2.2  HttpClientResponse

字段名称 是否必须        字段类型    描述
stateCode
String 响应的状态码,如 "stateCode":"200"
responseBody
Object 响应的body,可以直接复制swagger返回的消息
headers
Map<String, String>
响应头

3 举例

{
"remark": "调用address接口",
"className": "AWHttpClient",
"config": {
"primaryKeys": [
"orderNo"
],
"keyNameAndPrimarykeys": {
"items": [
"itemUrl"
]
}
},
"request": {
"type": 1,
"url": "${global.data.ecommerce.addr}/xxxx/api/v1/xxxx/{ecommerce_id}/xxxx/xxxx",
"path": {
"ecommerce_id": "${global.taobao.ecommerceid}"
},
"headers": {
"content-type": "application/json",
"userId": "${global.auth.userid}",
"Authorization": "${global.auth.token}"
}
},
"reponseExpected": {
"stateCode": "200",
"responseBody": [
{
"dealDate": "2017-04-17T13:16:36.000+08",
"orderNo": "3234925410420512",
"amount": 78.35,
"address": "中华人民共和国",
"consignee": "张三",
"phoneNumber": "1816",
"items": [
{
"itemUrl": "//trade.taobao.com/trade/detail/tradeSnap.htm?tradeID=3234925410430512",
"itemName": "十二生肖传说精装图画书海豚绘本花园适合3岁以上亲子阅读正版童书",
"price": 17.4,
"quantity": 1
}
]
}
]
}

AWTemplateActuator

1、AW变为模版

正常编写完AW,在测试用例中作为一个步骤,格式如下:

举例:

{
"className": "AWAppiumRecordAction",
"remark": "",
"mobile":"15210001001",
"password":"qazxsw"
}

1.1、增加下面两个参数

"awIsTemplate":true,

"templateName":"youname"

1.2、参数化

把变量参数化,比如上面的例子中,需要把mobile和password的值参数化

上面测试步骤变成的模版如下:

{
"className": "AWAppiumRecordAction",
"remark": "",
"awIsTemplate":true,
"mobile":"${mobile}",
"password":"${password}"
"templateName":"loginTemplate"
}

原有AW只要是继承了ActionWord类都支持该功能。

2、模版引用

使用框架中的 AWTemplateActuator引用模版。该AW唯一参数citationTemplates是一个对象的list。对象属性包括

templateName–引用的模版名称

templateParamValue–模版中参数值

assertTemplateName–校验结果的模版名称

举例:

比如引用上面的模版的使用方法如下:

{
"className": "AWTemplateActuator",
"citationTemplates": [
{
"templateName": "loginTemplate",
"templateParamValue": {
"mobile": "15267",
"password": "2222"
},
"assertTemplateName": "loginSuccess"----这是把校验结果作为一个模版
}
]
}

当然如果你参数值是固定的,可以不用参数,模版引用中只需要不传递templateParamValue参数即可。

2.1、扩展

对于输入我们一般会做很多非法性校验,使用模版执行器只需要配置参数值即可,比如上面的例子:

{
"className": "AWTemplateActuator",
"citationTemplates": [
{
"templateName": "loginTemplate",
"templateParamValue": {
"mobile": "15267",--手机号位数不够"password": "2222"
},
"assertTemplateName": "loginSuccess"----这是把校验结果作为一个模版
},
{
"templateName": "loginTemplate",
"templateParamValue": {
"mobile": "152671111111111",---手机号过长"password": "x@#@"
},
"assertTemplateName": "loginSuccess"----这是把校验结果作为一个模版
}
]
}

3、模版路径

3.1、模版和非模版混合使用

一个用例文件中可以包含AW模版和非AW模版两种类型,但是对于模版记得使用AWTemplateActuator执行模版

3.2、模版路径方法

为了模版的重复使用,可以把模版放到一个文件夹里面,用例文件只负责使用AWTemplateActuator调用模版

3.2.1、新建模版文件夹

新建文件夹,把所有模版都放到该文件夹里面

3.2.2、增加配置

application.propertites中增加template.path:./xx/xx/xxx/xxx。

其它不变。

(四) appium-desktop 脚本录制常用AW使用介绍的更多相关文章

  1. 6、通过Appium Desktop 实现录制功能

    1.老规矩,我们进入下面这个界面 图中红色标记1为 “top by coordinates”  按钮, 这是一种通过坐标定位元素的方式. 图中红色标记2为 “Start Recording”  按钮, ...

  2. LR脚本中常用函数使用介绍

    1.变量和参数的设置 //将IP地址和端口放入到参数中lr_save_string("192.168.1.133:8081","ip"); //计算变量数组的元 ...

  3. Appium Desktop 元素定位和脚本录制功能

    Appium Desktop除了可以做Server之外还可以进行元素定位和脚本录制功能,点击放大镜按钮,进入页面设置.开始配置Desired Capabilities. 配置Desired Capab ...

  4. LoarRunner脚本录制-Port Mapping

    使用LR录制脚本时经常会因为内外网访问限制,或浏览器兼容等问题,导致无法正常录制脚本. 这里简单介绍一下使用LR端口映射的方式进行脚本录制,与之前介绍的<Jmeter脚本录制--HTTP代理服务 ...

  5. loadrunner11的移动端性能测试之脚本录制

    以前使用LR11录制过一个app的登录操作,这里记录一下 测试准备 硬件要求 1,  负载测试机一台(内存8G以上,cpu 1.5GHZ以上,存储空间20G以上)或两台以上(控制机和多个负载机). 2 ...

  6. Jmeter脚本录制方法(一)——分别使用Badboy录制和Jmeter自带的代理服务器录制

    Jmeter录制方式分三种,分别是:使用Badboy录制.Jmeter自带的代理服务器录制和手工录制,今天先介绍前两种录制方法. Badboy录制 Badboy是用C++开发的动态应用测试工具, 其拥 ...

  7. Jmeter脚本录制方法(二)——手工编写脚本(jmeter与fiddler结合使用)

    jmeter脚本录制方法可以分三种,前几天写的一篇文章中,已介绍了前两种,今天来说下第三种,手工编写脚本,建议使用这一种方法,虽然写的过程有点繁琐,但调试脚本比前两者方式都要便捷. 首先来看下三种方式 ...

  8. jmeter脚本录制与性能指标分析

    一.浏览器代理设置(猎豹) 1.打开猎豹浏览器,进行如下图操作 2.点击局域网设置 3.输入如下信息,注意端口不要重复 4.输入网址www.baidu.com,不能正常访问就是正确的 5.查看添加的端 ...

  9. Jmeter4.X - 使用本身自带的脚本录制功能录制脚本

    1.前言 记录对Jmeter评估研究的过程,本文记录使用apache网站提供的原Jmeter使用自带功能进行脚本录制. 本文可用于面向B/S WEB应用测试的工程师熟悉Jmeter使用.章节安排按照脚 ...

随机推荐

  1. [TJOI2013]松鼠聚会(枚举)

    [TJOI2013]松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x, ...

  2. SpringCloud组件架构图

    总结一下spring cloud 的结构: 1.请求统一通过API网关(Zuul)来访问内部服务. 2.网关接收到请求后,从注册中心(Eureka)获取可用服务 3.由Ribbon进行均衡负载后,分发 ...

  3. LNMP 多版本PHP同时运行

    首先需要装好两个版本以上的PHP(例如:php5.6和php7两个版本).这里假设你已安装完成.1.配置并启动php默认版本: (设置 nginx 的 vhost 域名配置文件监听端口就好) 1).打 ...

  4. 关于 html button 点击刷新页面的问题

    如果不想点击button 刷新页面的话,需要加个属性   type="button" 如下: <button class="layui-btn" type ...

  5. 集合综合练习<三>

    package com.JiHeTotal; import java.util.Comparator; import java.util.Map; import java.util.Map.Entry ...

  6. Ionic4 & Cordova 打包Android,含签名

    IOS打包必须在Mac环境,以下讲述安卓打包并签名的过程,若是不签名,那么APP不能在手机上安装. 1.添加对应的android框架 ionic cordova prepare android 1)修 ...

  7. 搭建 MySQL 5.7.19 主从复制,以及复制实现细节分析

    主从复制可以使MySQL数据库主服务器的主数据库,复制到一个或多个MySQL从服务器从数据库,默认情况下,复制异步; 根据配置,可以复制数据库中的所有数据库,选定的数据库或甚至选定的表. Mysql ...

  8. electron-vue打包引用的图标不显示问题

    在electron-vue中使用了字体图标,但是打包成.exe文件后图标不显示,路劲问题 把字体图标放到static目录下就可以了,静态图片也一样 我原来放在其它地方不行 改到static目录就可以了

  9. 把数据存储到 XML 文件

    通常,我们在数据库中存储数据.不过,如果希望数据的可移植性更强,我们可以把数据存储 XML 文件中. 创建并保存 XML 文件 如果数据要被传送到非 Windows 平台上的应用程序,那么把数据保存在 ...

  10. BZOJ 1901 洛谷 P2617 ZOJ 2112 Dynamic Rankings

    以下时空限制来自zoj Time limit 10000 ms Memory limit 32768 kB OS Linux Source Online Contest of Christopher' ...