Macaca UI Recoder

简介:

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();
  }
});

录制是双刃剑

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


相关文章
|
Web App开发 移动开发 macaca
基于Macaca的混合H5应用UI自动化入门
## 基于Macaca的混合H5应用UI自动化入门 混合H5应用UI自动化是移动应用自动化中无法绕过的一节,作为H5应用,自动化的方式与Native略有不同,主要体现在元素的定位以及操作,以及上下文的切换等,本文针对H5的自动化入门分享一些基础知识。 ## H5应用如何查找元素 在Native的UI自动化中,我们通过app-inspector查找UI元素,但是这并不适用于H5应用(在ap
1697 0
|
移动开发 JavaScript macaca
基于Macaca的混合H5应用UI自动化进阶
# 基于Macaca的混合H5应用UI自动化进阶 混合H5应用UI自动化是移动应用自动化中无法绕过的一节,针对混合H5应用的UI自动化入门之前已经写过一篇文章:[https://testerhome.com/topics/9651](https://testerhome.com/topics/9651) ,入门的同学可移步学习。本文主要针对H5应用UI自动化高级使用进行一些分享。 ## 如何定
2145 0
|
12月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
386 15
|
12月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
406 11
|
8月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
547 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
11月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
357 56
|
11月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
522 55
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
980 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
12月前
|
存储 开发框架 API
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发二
本文详细介绍了基于声明式UI开发的健康饮食应用的设计与实现过程。内容涵盖从基础环境搭建到复杂功能实现的全流程,包括创建简单视图、构建布局(如Stack、Flex)、数据模型设计、列表与网格布局构建,以及页面跳转和数据传递等核心功能。 本文通过实际案例深入浅出地解析了声明式UI开发的关键技术和最佳实践,为开发者提供了宝贵的参考。
423 14

热门文章

最新文章