通过使用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. Heshen's Account Book HihoCoder - 1871 2018北京区域赛B题(字符串处理)

    Heshen was an official of the Qing dynasty. He made a fortune which could be comparable to a whole c ...

  2. SQL小操作

    用string.Format格式化参数 string sqlCmd = string.Format("select NO from [dbo].[SendAcerData] where BA ...

  3. dubbo网关

    https://blog.csdn.net/Paranoia_ZK/article/details/90743432 springcloud 和 dubbo 混用

  4. pushd&popd&dirs命令

    dirs 显示当前目录栈中的所有记录 -p  一个目录一行显示  -l  以完整格式显示  -c  删除目录栈中的所有记录  -v  每行一个目录来显示,每个目录前加上编号  +N  从左到右的第n个 ...

  5. 一篇文章了解RPC框架原理

    1.RPC框架的概念 RPC(Remote Procedure Call)–远程过程调用,通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术.使用RPC可以解耦系统,方便维护,同时 ...

  6. SpringBoot框架(5)-- @EableAutoConfiguration项目应用

    场景:在项目中想在当前maven项目中自动装配其他自定义的Maven项目,例如,创建数据库配置中心,被夺多个maven引用,希望简单配置,就实现springboot自动装配数据库配置类. 由此我们联想 ...

  7. print的位置差异

    第一种,for循环和print是同级的,只有当for循环结束了才会print d=[]for i in range(1, 101): d.append(i)print d[6::7] 第二种,也就是p ...

  8. Java多线程的创建方法

    Java 线程类也是一个 object 类,它的实例都继承自java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: ...

  9. #417 Div2 Problem B Sagheer, the Hausmeister (DFS && 枚举)

    题目链接:http://codeforces.com/contest/812/problem/B 题意 : 给出一个 n (1 ≤ n ≤ 15)层的教学楼, 每一层楼包含 m (1 ≤ m ≤ 10 ...

  10. Sparrow 开发板化身电脑音量调节器

    前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 之前的新浪不能用啦,这次部分图片用的sm.ms的图床,加载慢,请耐心,准备换图床. 1.开箱简介 来填坑了!这次是 Sparrow ...