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
1503 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自动化高级使用进行一些分享。 ## 如何定
1861 0
|
1月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
2月前
|
开发框架 JavaScript 前端开发
鸿蒙NEXT开发声明式UI是咋回事?
【10月更文挑战第15天】鸿蒙NEXT的声明式UI基于ArkTS,提供高效简洁的开发体验。ArkTS扩展了TypeScript,支持声明式UI描述、自定义组件及状态管理。ArkUI框架则提供了丰富的组件、布局计算和动画能力。开发者仅需关注数据变化,UI将自动更新,简化了开发流程。此外,其前后端分层设计与编译时优化确保了高性能运行,利于生态发展。通过组件创建、状态管理和渲染控制等方式,开发者能快速构建高质量的鸿蒙应用。
144 3
|
3天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
22天前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
1月前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
117 8
|
7月前
|
Android开发 缓存 双11
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
|
2月前
|
JavaScript API 开发者
掌握ArkTS,打造HarmonyOS应用新视界:从“Hello World”到状态管理,揭秘鸿蒙UI开发的高效秘诀
【10月更文挑战第19天】ArkTS(ArkUI TypeScript)是华为鸿蒙系统中用于开发用户界面的声明式编程语言,结合了TypeScript和HarmonyOS的UI框架。本文介绍ArkTS的基本语法,包括组件结构、模板和脚本部分,并通过“Hello World”和计数器示例展示其使用方法。
86 1
|
2月前
|
缓存 测试技术 C#
使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题
【10月更文挑战第20天】本文介绍了使用 Radzen Blazor 组件库开发基于 ABP 框架的炫酷 UI 主题的步骤。从准备工作、引入组件库、设计主题、集成到 ABP 框架,再到优化和调试,详细讲解了每个环节的关键点和注意事项。通过这些步骤,你可以打造出高性能、高颜值的应用程序界面。