Package Exports
- matman
- matman/package
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (matman) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
matman
matman 端对端测试方案中的核心操作库,更多资料请参考: matman 官方文档 。
1. 安装
$ npm install matman --save2. API
2.1 createPageDriver(caseModuleFilePath, opts)
创建 PageDriver 对象。
caseModuleFilePath:String, 测试案例文件的绝对路径opts: 额外参数,传递给MatmanConfig和PageDriver使用
2.2 PageDriver 类
页面控制器。
2.2.1 constructor(matmanConfig, caseModuleFilePath, opts)
matmanConfig:MatmanConfig, 必填项caseModuleFilePath:String, 测试案例文件的绝对路径,必填项opts: 额外参数opts.doNotCloseBrowser:Boolean, 是否在执行完成之后不要关闭浏览器,默认为falseopts.useRecorder:Boolean, 是否使用记录器,若为true,则在结果中会返回网络请求和浏览器事件等额外信息,默认为falseopts.tag:String, 标记,在某些场景下使用,例如截图保存文件中追加该标记,用于做区分
2.2.2 useNightmare(nightmareConfig)
支持链式调用。
使用 nightmare.js 框架来做端对端测试。
nightmareConfig:Object, 可选项,传递给原生的 Nightmare constructor 的参数
2.2.3 useProxyServer(proxyServer)
支持链式调用。
走指定的代理服务,由代理服务配置请求加载本地项目,从而达到同源测试的目的;若不配置,则之前请求现网,亦可直接测试现网的服务。
proxyServer:String, 代理服务器,格式为my_proxy_server.example.com:8080,例如127.0.0.1:8899
2.2.3 useMockstar(mockstarQuery)
支持链式调用。
使用 mockstar 来做桩数据(假数据,mock 数据)。
mockstarQuery:MockStarQuery,mockstar 方案中用于指定桩数据的请求对象
2.2.4 changeMockstar(mockstarQuery)
支持链式调用。
切换 mockstar 的桩数据(假数据,mock 数据)。
mockstarQuery:MockStarQuery,mockstar 方案中用于指定桩数据的请求对象
2.2.5 setCookies(cookies)
支持链式调用。
注入 cookie。相关内容可以阅读 nightmare-handler exCookies 。
当 cookies 为 String ,即格式与 document.cookie 输出形式一直,例如 mykey1=myvalue1; mykey2=myvalue2 。
当 cookies 为 Object 时,可以支持多个 cookie 键值对,例如 {mykey1:'myvalue1', mykey2:'myvalue'} 。
2.2.6 setDeviceConfig(deviceConfig)
支持链式调用。
设置无头浏览器设备参数。相关内容可以阅读 nightmare-handler exDevice 。
当 deviceConfig 为 String ,即为指定用哪种预定义的设备名字,默认值为 mobile
当 deviceConfig 为 Object 时:
deviceConfig.name:String, 设备名字deviceConfig.UA:String, 是userAgentdeviceConfig.width:Number, 视窗宽度deviceConfig.height:Number, 视窗高度,注意这里不是指页面的高度,页面高度要小于这个值
2.2.7 setScreenshotConfig(screenshotConfig)
支持链式调用。
设置截屏参数。相关内容可以阅读 nightmare#screenshotpath-clip 。
当 screenshotConfig 为 Boolean ,且为 true 时,则将根据当前路径自动生成截图文件路径,推荐用该方式。
当 screenshotConfig 为 String ,即为截图保存的文件路径,绝对路径,例如 /root/xyz.png。
当 screenshotConfig 为 Object 时:
screenshotConfig.path:String, 截图保存的文件路径,绝对路径,例如/root/xyz.png,如果不填写,则将根据当前路径自动生成截图文件路径screenshotConfig.clip:String, 截图的区域,例如{ x: 0, y: 0, width: 0, height: 0 }screenshotConfig.tag:String, 标记,会追加到screenshotConfig.path中,用作自定义的区分
2.2.8 setCoverageConfig(coverageConfig)
支持链式调用。
设置覆盖率参数。
当 coverageConfig 为 Boolean ,且为 true 时,则将根据当前路径自动生成覆盖率文件路径,推荐用该方式。
当 coverageConfig 为 String ,即为覆盖率文件路径,绝对路径,例如 /root/xyz.json。
当 coverageConfig 为 Object 时:
coverageConfig.path:String, 覆盖率文件路径,绝对路径,例如/root/xyz.json,如果不填写,则将根据当前路径自动生成覆盖率文件路径coverageConfig.tag:String, 标记,会追加到coverageConfig.path中,用作自定义的区分
2.2.9 setMatmanResultConfig(matmanResultConfig)
支持链式调用。
设置 MatmanResult 执行结果参数。
当 matmanResultConfig 为 Boolean ,且为 true 时,则将根据当前路径自动生成 MatmanResult 执行结果文件路径,推荐用该方式。
当 matmanResultConfig 为 String ,即为 MatmanResult 执行结果路径,绝对路径,例如 /root/xyz.json。
当 matmanResultConfig 为 Object 时:
matmanResultConfig.path:String,MatmanResult执行结果文件路径,绝对路径,例如/root/xyz.json,如果不填写,则将根据当前路径自动生成MatmanResult执行结果matmanResultConfig.tag:String, 标记,会追加到matmanResultConfig.path中,用作自定义的区分
2.2.10 goto(pageUrl)
支持链式调用。
加载指定的页面地址。
pageUrl:String,页面的 url 地址
2.2.11 addAction(actionName, actionCall)
支持链式调用。
增加测试动作集。
actionName:String,动作名称,后续可通过它来获得最后的数据actionCall:Function,执行函数,入参中接受一个nightmare对象,可以直接操作使用 nightmare Interact with the Page 的方法
以下代码来自: demo_02 :
const matman = require('matman');
matman
// 创建 PageDriver,页面驱动控制器
.createPageDriver(__filename, opts)
// 无头浏览器使用 nightmare.js 框架提供,其底层用的是 Google 的 electron,基于 chromium 内核
.useNightmare({ show: opts.show })
// 其他操作,省略
// ....
// 加载页面地址
.goto('https://www.baidu.com')
// 第一步:开始操作之前
.addAction('init', function (nightmareRun) {
// nightmareRun 支持所有的原始 nightmare 语法和对其定制的扩展功能
return nightmareRun.wait(500);
})
// 第二步:搜索输入框输入: matman
.addAction('input_key_word', function (nightmareRun) {
// nightmareRun 支持所有的原始 nightmare 语法和对其定制的扩展功能
return nightmareRun.type('#kw', 'matman').wait(500);
})
// 第三步:点击搜索按钮,获得搜索结果
.addAction('click_to_search', function (nightmareRun) {
return nightmareRun.click('#su').wait('#content_left');
})
// 其他操作,省略
// ....
// 结束,获取结果
.end();2.2.12 wait(fn, ...args)
支持链式调用。
需要等待某些条件达成,才开始运行爬虫脚本,与 nightmare 的 wait 含义和用法一致。
- .wait(selector) : 等待某个元素出现,最常用 ,例如
.wait('#pay-button') - .wait(ms) : 等待多少
ms,例如.wait(5000) - .wait(fn[, arg1, arg2,...]) : 使用函数来判断条件
2.2.13 evaluate(fn, ...args)
支持链式调用。
执行爬虫脚本或者方法。
当 fn 为 String 时,即代表的是加载本地的爬虫脚本文件,支持绝对路径和相对路径,如果是相对路径,则其相对于当前文件而言,可以等效于 require 的语法。 特别注意的是,本地的爬虫脚本文件,是通过 matman build 命令构建产生的,因此该场景下一定要先提前构建出本地的爬虫脚本文件,否则会出错 。
当 fn 为 Function 时,则与 nightmare 的 evaluate 含义和用法一致,详见 nightmare .evaluate(fn[, arg1, arg2,...]) 。
2.2.14 executeCustomFn(customFn)
支持链式调用。
执行自定义的方法,适用于 debug 和自定义扩展等场景。
customFn:Function,入参中接受一个PageDriver对象
const matman = require('matman');
matman
// 其他操作,省略
// ....
// 执行自定义的方法
.executeCustomFn((pageDriver) => {
// 没有其他的意义,只是为了 debug
if (opts.show) {
console.log(pageDriver);
}
})
// 其他操作,省略
// ....2.2.15 end()
启动 PageDriver ,返回一个 Promise ,结果值为 MatmanResult 对象。
2.3 MatmanResult 类
2.3.1 constructor(result)
data:Array | Object,数据快照,如果使用addAction(actionName, actionCall)追加的测试动作,则该值为数组,可以通过get(actionName)获得指定动作的数据globalInfo:Object,网络请求和浏览器事件等全局信息
2.3.2 get(actionName)
通过测试动作名字获得数据。
当 actionName 为 String 时,则该名字来自 addAction(actionName, actionCall) 定义的名字。
当 actionName 为 Number 时,则其相对于数组索引,会从 matmanResult.data 这个数组中获取。
2.3.3 getQueue()
获得捕获到的请求队列。返回一个数组,数组元素为网络请求和浏览器事件等信息。
2.3.4 getNetwork(resourceType)
从结果队列中过滤出网络请求。
resourceType 详见 nightmare-handler RESOURCE_TYPE ,即:
const RESOURCE_TYPE = {
MAIN_FRAME: 'mainFrame',
SUB_FRAME: 'subFrame',
STYLESHEET: 'stylesheet',
SCRIPT: 'script',
IMAGE: 'image',
OBJECT: 'object',
XHR: 'xhr',
OTHER: 'other'
};2.3.5 isExistInNetwork(partialURL, query = {}, resourceType, status)
根据条件,从网络请求中匹配指定的请求。
partialURL:String,用于匹配的部分urlquery:Object,请求携带的 query 参数resourceType:String,资源类型status:Number,http 状态码
2.3.6 isExistPage(partialURL, query = {}, status)
根据条件,从网络请求中匹配指定的请求,等效于 isExistInNetwork(partialURL, query, 'mainFrame', status)。
使用场景:
- 测试跳转页面的场景,通过它可以判断是否加载了目标的页面
2.3.7 isExistXHR(partialURL, query = {}, status)
根据条件,从网络请求中匹配指定的请求,等效于 isExistInNetwork(partialURL, query, 'xhr', status)。
使用场景:
- 测试接口请求是否正确,可以利用
query来指定请求参数,确保不会发送一个错误的请求 - 利用
status可以验证接口是否可能500等 - 有些数据上报也是用
xhr的,可以测试数据上报的字段是否正确
2.3.8 isExistImage(partialURL, query = {}, status)
根据条件,从网络请求中匹配指定的请求,等效于 isExistInNetwork(partialURL, query, 'image', status)。
使用场景:
- 测试是否加载了某张图片
- 利用
status可以验证图片请求是否有可能404等
2.3.9 isExistStylesheet(partialURL, query = {}, status)
根据条件,从网络请求中匹配指定的请求,等效于 isExistInNetwork(partialURL, query, 'stylesheet', status)。
使用场景:
- 测试是否加载了
css文件 - 利用
status可以验证css文件是否有可能404等
2.3.10 isExistScript(partialURL, query = {}, status)
根据条件,从网络请求中匹配指定的请求,等效于 isExistInNetwork(partialURL, query, 'script', status)。
使用场景:
- 测试是否加载了
js文件 - 利用
status可以验证js文件是否有可能404等
2.3.11 isExistJSBridge(partialURL, query = {})
是否存在某个 jsbridge 的调用,支持使用 iframe 和 location.href 两种形式,具体可以查看 https://github.com/matmanjs/matman-demo/tree/master/DevOps/matman-app/case_modules/page-hybrid-app。
2.3.12 isExistConsole(partialURL, type, isFullMatch)
是否存在某一条 console 记录
partialText:String,待匹配的字符串type:String,类型,例如console.log,则type=logisFullMatch:Boolean,是否将partialText作为全匹配,默认值为false