博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Macaca UI Recoder
阅读量:6808 次
发布时间:2019-06-26

本文共 3274 字,大约阅读时间需要 10 分钟。

Macaca 提供多端录制回放工具 UIRecorder,录制回放工具无疑是最受用户欢迎的工具。录制是生产用例最低成本的方式,测试用例在这个过程中已经变成了“中间产物”。

跨多端设计

UIRecorder 支持 PC 和移动端,能够支持所有平台是因为 UIRecorder 在操作层和 Webdriver 服务端做了良好的解耦设计。UIRecorder 在 PC 端重度依赖 Chrome Extension 的事件拦截,移动端直接则与 Macaca Server 通信。

运行原理

  1. 启动 Macaca Server,提供 Webdriver 服务
  2. UIRecorder 在启动时会启动 ChromeDriver 服务
  3. 并加载内置的 Chrome 扩展程序

事件处理

用户端事件相对复杂的是 drag 手势,当操作左侧截图图片时,会执行如下的事件处理。

screenshot.addEventListener('click', function(event) {
var upX = event.offsetX, upY = event.offsetY; var clickDuration = new Date().getTime() - downTime; if (Math.abs(downX - upX) < 20 && Math.abs(downY - upY) < 20) {
var cmdData = getNodeInfo(Math.floor(upX * scaleX), Math.floor(upY * scaleY)); if (isSelectorMode) {
if (cmdData.path) {
showExpectDailog(cmdData.path); } } else {
var pressTime = new Date().getTime() - downTime; cmdData.duration = (pressTime / 1000).toFixed(2); saveCommand(clickDuration> 500 ? 'press' : 'click', cmdData); } downTime = 0; }});screenshot.addEventListener('mousedown', function(event) {
downX = event.offsetX; downY = event.offsetY; downTime = new Date().getTime(); event.stopPropagation(); event.preventDefault();});screenshot.addEventListener('mouseup', function(event) {
var upX = event.offsetX, upY = event.offsetY; if (downX >=0 && downY >= 0 && upX >= 0 && upY >= 0 && (Math.abs(downX - upX) >= 20 || Math.abs(downY - upY) >= 20)) {
var dragTime = new Date().getTime() - downTime; saveCommand('drag', {
fromX: Math.floor(downX * scaleX), fromY: Math.floor(downY * scaleY), toX: Math.floor(upX * scaleX), toY: Math.floor(upY * scaleY), duration: (dragTime / 1000).toFixed(2) }); downTime = 0; } event.stopPropagation(); event.preventDefault();});document.addEventListener('mouseup', function(event) {
if (downTime !== 0) {
var upX = event.clientX < screenshot.offsetLeft ? 0 : screenshot.width -1; var upY = event.clientY; var dragTime = new Date().getTime() - downTime; saveCommand('drag', {
fromX: Math.floor(downX * scaleX), fromY: Math.floor(downY * scaleY), toX: Math.floor(upX * scaleX), toY: Math.floor(upY * scaleY), duration: (dragTime / 1000).toFixed(2) }); downTime = 0; }});screenshot.addEventListener('mousemove', function(event) {
var bestNodeInfo = {
node: null, boundSize: 0 }; var x = Math.floor(event.offsetX * scaleX); var y = Math.floor(event.offsetY * scaleY); getBestNode(appTree, x, y, bestNodeInfo); var node = bestNodeInfo.node; if (node) {
var offsetLeft = screenshot.offsetLeft; var offsetTop = screenshot.offsetTop; var left = node.startX / scaleX; var top = node.startY / scaleY; var width = node.endX / scaleX - left; var height = node.endY / scaleY - top; showLine(left + offsetLeft, top + offsetTop, width, height); } else {
hideLine(); }});document.addEventListener('keypress', function(event) {
if(!isLoading && !isShowDialog){
showTextDailog(event.key); event.stopPropagation(); event.preventDefault(); }});

录制是双刃剑

录制工具可以量产用例,将测试用例的生产成本降到最低,但从实质上看产生的测试用例可维护性也降低了,同时无法模块化,二次维护成本却提高了,只能重新录制。对于功能固化,不需要频繁维护的场景可以适当使用录制。


转载地址:http://ifhwl.baihongyu.com/

你可能感兴趣的文章
3种时间复杂度实现不同类型的无序数组去重
查看>>
python
查看>>
C 入门 第五节 多维数组 字符串数组
查看>>
word 2007为不同页插入不同页眉页脚
查看>>
利用python进行数据加载和存储
查看>>
C++ 对Ctrl+Z的解释
查看>>
Django ORM 操作
查看>>
软件测试 -- 单元测试,集成测试,系统测试的侧重点
查看>>
制作首页的显示列表
查看>>
期末作品检查
查看>>
POJ2063 Investment(完全背包)
查看>>
【C++】 ArcFace Demo2.0版
查看>>
产生随机数
查看>>
托管代码 非托管代码
查看>>
「陶哲軒實分析」 習題 3.5.1
查看>>
第一次总结(1)
查看>>
5种IO模型
查看>>
选择排序之python实现
查看>>
mysql 分库分表 ~ ShardingSphere生态圈
查看>>
BFS+模拟 ZOJ 3865 Superbot
查看>>