SoloPi 架构解析 | 录制回放的原理与实战

本文涉及的产品
mPaaS订阅基础套餐,标准版 3个月
简介: 通过本文我们将开启《SoloPi 架构解析》连载,围绕 SoloPi 在“录制回放”、“性能测试”、“一机多控”等方面的实践展开,从而深度分析在相应能力的构建与优化过程中,SoloPi 沉淀了怎样的设计思路与实战经验。

SoloPi 架构解析介绍

SoloPi,源自于支付宝开源,面向移动端实现的一套无线化、非侵入、免 Root 的 Android 专项工具,能够脱离 PC 环境,在移动端实现自动化的功能、性能及兼容性测试,降低广大测试开发者的测试成本,提升测试效率。
通过本文我们将开启《SoloPi 架构解析》连载,围绕 SoloPi 在“录制回放”、“性能测试”、“一机多控”等方面的实践展开,从而深度分析在相应能力的构建与优化过程中,SoloPi 沉淀了怎样的设计思路与实战经验。

  • 本文作者:
    茅舍,来自支付宝,SoloPi 核心作者之一
  • 本文概览:
    SoloPi 录制回放 - 录制操作

SoloPi 录制回放 - 用户操作监控与控件获取
SoloPi 录制回放 - 更多控件介绍&功能分类
SoloPi 录制回放 - 用例回放

录制回放是什么?

关于录制回放,大家如果对具体功能还不是非常清晰,可以先阅览下面这个视频:

视频完整呈现了 SoloPi 录制回放的全过程,覆盖“用例录制”、“用例编辑”以及“用例回放”。因此,通过 SoloPi,开发者有能力在完全不插线的情况下,实现自动化用例的录制,并基于多种设备完成回放动作。
那么,SoloPi 是如何做到基于移动端进行自动化用例的录制和回放?毕竟自动化框架的核心在于“控件获取”和“事件驱动”,这两点往往依赖 PC 完成驱动;而在手机端,由于系统的权限管控,往往很难实现类似的功能,因此我们很少见到类似的移动端自动化测试工具。
接下来,我们将通过录制回放通用模式下的一个具体事例,来为大家展开分析 SoloPi 录制回放的具体原理。

SoloPi 录制回放深度解析

首先进入录制回放首页,点击右上角可以切换需要测试的应用。
这里我们以 Snapseed 作为待测应用(SnapSeed 是一个图像处理工具)。

solopi - 录制回放 1.png

点击开始执行,SoloPi 会自动跳转到对应应用,并显示一个悬浮窗。点击悬浮窗绿色三角,即可开始用例录制。

录制操作

用例录制状态下,当你点击屏幕任意一个位置,SoloPi 会监控到具体的点击位置,并将这个位置的控件进行高亮。

solopi - 录制回放 2.png

如图所示,黄点表示用户点击的坐标,红框表示 SoloPi 获取的待操作控件。SoloPi 通过获取到用户点击时的坐标,以及当前页面的控件结构,来实现这种功能。

用户操作监控与控件获取

关于用于操作监控与控件获取,熟悉 Android 系统的开发者可能首先会想到 AccessibilityService。
AccessibilityService 能够获取用户的操作事件并关联对应的控件,确实可以实现大部分功能。但 AccessibilityService 也有不足的地方,比如面向 HTML5 场景,辅助功能获取控件会出现延迟从而导致获取的控件结构不够精确;另外,对于部分自定义控件,辅助功能只能获取到对应的控件,但缺乏具体的坐标信息,从而导致控件操作不符合预期。
为了应对以上不足,SoloPi 采取了“结合 Android 系统 getevnet 功能”策略,通过直接解析系统原生事件,获取到用户的操作行为。

关于 getevent 的具体内容,可以看一下 Google 提供的相关文档:
https://source.android.com/devices/input/getevent

简单来说,通过 getevent,SoloPi 可以获取到用户操作屏幕的具体坐标,以及手指落下、抬起的具体时间。

solopi - 录制回放 3.png

不过,getevent 命令的使用需要 SHELL 权限,这限制了普通 Android 应用获取相关数据的能力。SoloPi 通过Android 系统的无线调试功能实现了一套纯端的 SHELL 执行能力,能够在 Android 系统上执行 adb 相关命令,这块儿的具体介绍可以参考《SoloPi:支付宝开源的 Android 专项测试工具》。

通过 getevent 命令,SoloPi 获取到了用户点击的具体坐标。结合 AccessibilityService 的控件结构树,我们便可以查找到用户实际想要操作的控件了。
或许有人会问,我们既然能够获取用户的操作,以及屏幕上的控件信息,为什么录制时要卡一道,选择对应的操作,直接让用户进行操作不好吗?确实,直接操作的体验会更加顺滑,但 SoloPi 通过选择功能的界面,既可以给用户一个二次确认的机会,防止进行误操作,又能够提供更多的功能。此外,录制模式与回放模式走的是同一套执行机制,可以更好的保证用例回放的成功率。

更多控件介绍&功能分类

  • 关于更多控件

通过辅助功能,可以获取到比较完整的 Native 控件结构,但对于最近较为火热的 HTML5、小程序的控件结构,就显得较为力不从心了。
针对 HTML5、小程序,SoloPi 通过 ChromeDevtoolProtocal 与 Chrome 内核通信从而获取到页面结构。这种方式同样基于 SoloPi 的 SHELL 能力,与可调试的 Chrome 内核完成通信,实现了 PC 上的 Chrome Driver 功能。通过注入 JS 获取到 HTML5 页面的完整控件结构信息。同时,SoloPi 能够将 Native 结构的控件信息与 HTML5 结构的控件信息进行统一,从而构建出一个既包含 Native 结构,也包含 HTML5 结构的页面结构树,让用户摆脱来回切换控件结构的困扰。

图片.gif

此外,在一些通过图像引擎渲染的场景,不管是 Native 模式,还是小程序、HTML5 模式,以上解决思路都无法正常执行。因此,SoloPi 提供了图像查找模式,根据图像的特征来进行查找,补足在游戏、AR 方面的自动化能力。

SoloPi 主要通过AbstractProviderAbstractNodeProcessor这两个类来获取控件信息:通过AbstractProvider 获取控件的原始数据,并生成原始树结构,而 AbstractNodeProcessor 则着眼于处理单个控件节点信息,实现控件树的完善与结构扩展。有兴趣的读者也可以尝试实现这两个类,定义自己的控件结构。

  • 关于功能分类

选择控件后,SoloPi 会弹出具体的操作选择页面,包含点击操作输入操作滑动操作逻辑操作扩展操作五大类。以“点击操作”为例,SoloPi 提供了五种功能,前两种功能(点击及长按)不用赘述,第三种为发现则点击,意味着如果发现了特定控件,则进行点击,主要用于处理弹窗和部分非必然出现的场景,快速点击用于处理一些容易消失的控件,比如播放器的控制器。此外,重复点击意味着针对某一个特定位置完成重复性的点击动作。

solopi - 录制回放 4.png

当开发者选择完相应操作后,SoloPi 便启动自动执行。面对部分耗时较长的操作,SoloPi 的图标将变成红色,待图标变回黄色时,意味着操作已执行完毕。以上,我们便完成了一步操作的录制。
而对于部分非控件类型的操作,如滑动屏幕,返回,Sleep 等不针对特定控件的操作,需要点击屏幕右侧的 SoloPi 图标(如下图所示),从而唤起全局操作框(注意,全局操作模式下屏幕不会显示红框)。在全局操作框下,开发者选择对应的操作完成执行动作,而操作类型主要分为“常用操作”、“应用操作”、“滑动操作”、“设备操作”、“扩展功能”与“流程管控”六大类。

solopi - 录制回放 5.png

用例回放

录制完成后,就可以在最近录制查看全部用例中看到完成好的录制用例。点击用例,会跳转到测试的应用,并显示悬浮窗,点击绿色三角即可开始回放。
回放时,SoloPi 会先高亮查找到的控件,然后再执行操作。

solopi - 录屏.gif

整套 SoloPi 的录制回放,基于同一套逻辑,包括控件结构构建、控件定位、事件驱动三个部分。两者的区别主要在于控件定位:

  • 在录制过程中,SoloPi 会基于用户的点击行为进行定位;
  • 在用例回放时,SoloPi 会根据录制时记录的控件信息,通过 SoloPi 的控件查找算法进行定位。

solopi - 录制回放 6.png

与以往自动化框架通过指定文字、ID 进行查找不同,SoloPi 的控件查找算法会综合控件的各类信息,包括文字、描述、resourceId、Xpath、图像信息,对控件进行打分,并通过录制时的位置信息进行辅助定位,确定目标控件,从而实现较为精确地回放查找。

数据输出

SoloPi 的用例是以 JSON 操作序列的形式保存,每一步操作都被分为操作控件与操作方法两部分,操作控件部分包含了原始控件的各类信息,包括文字、图像、resourceId、Xpath、坐标等信息,而操作方法则包含具体的操作类型、方法参数这些信息。
除了在 SoloPi 应用间传递, SoloPi 用例也支持转化为 Appium 、 Macaca 的用例格式,可以在各种运行环境进行回放。

{
  "operationId": "dt24chb7ar",
  "operationIndex": 0,
  "operationMethod": { // 操作方法
    "actionEnum": "CLICK", // 操作方法
    "encrypt": false, // 是否加密
    "operationParam": {
      "localClickPos": "0.7982456,0.5479452"  // 相对于控件的位置
    }
  },
  "operationNode": {  // 操作节点
    "assistantNodes": [  // 辅助定位节点
      {
        "className": "android.widget.ImageView",
        "parentHeight": 1,
        "resourceId": "tv.danmaku.bili:id/tab_icon"
      },
      {
        "className": "android.widget.TextView",
        "parentHeight": 1,
        "resourceId": "tv.danmaku.bili:id/tab_text",
        "text": "会员购"
      }
    ],
    "className": "android.widget.LinearLayout",
    "depth": 12,
    "extra": {
      "captureImage": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEB......",  // 截图
      "originSize": "720,1480",  // 截图尺寸
      "screenSize": "1440,2960"  // 原始屏幕大小
    },
    "id": "-4294967206",
    "nodeBound": {  // 控件坐标
      "bottom": 2878,
      "empty": false,
      "left": 1203,
      "right": 1317,
      "top": 2732
    },
    "nodeType": "AccessibilityNodeTree",
    "packageName": "tv.danmaku.bili",
    "xpath": "/android.widget.FrameLayout/android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v4.widget.DrawerLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.widget.LinearLayout[1]/android.widget.FrameLayout[4]/android.widget.LinearLayout" 
  }
}

小结

通过本文,我们针对 SoloPi 在 Android 端录制回放的全流程及具体实现原理展开解析,后续我们将围绕“一机多控”、“性能测试”、“用例的高级玩法”展开分享。

希望大家能够尝试体验 SoloPi,在过程中遇到任何疑惑,或者痛点,请积极反馈建议。期待和大家能够持续共建 SoloPi,拓展并完善更多能力。
也可以通过钉钉扫码以下二维码,进入“SoloPi 钉钉交流群”,期待你的加入。

联系我们.png

目录
相关文章
|
9天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
48 13
|
10天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
19天前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
149 36
微服务架构解析:跨越传统架构的技术革命
|
5天前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
150 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
3天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
38 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
7天前
|
弹性计算 Java 数据库
Web应用上云经典架构实战
本课程详细介绍了Web应用上云的经典架构实战,涵盖前期准备、配置ALB、创建服务器组和监听、验证ECS公网能力、环境配置(JDK、Maven、Node、Git)、下载并运行若依框架、操作第二台ECS以及验证高可用性。通过具体步骤和命令,帮助学员快速掌握云上部署的全流程。
|
17天前
|
数据采集 DataWorks 搜索推荐
阿里云DataWorks深度评测:实战视角下的全方位解析
在数字化转型的大潮中,高效的数据处理与分析成为企业竞争的关键。本文深入评测阿里云DataWorks,从用户画像分析最佳实践、产品体验、与竞品对比及Data Studio公测体验等多角度,全面解析其功能优势与优化空间,为企业提供宝贵参考。
94 13
|
14天前
|
数据采集 存储 JavaScript
网页爬虫技术全解析:从基础到实战
在信息爆炸的时代,网页爬虫作为数据采集的重要工具,已成为数据科学家、研究人员和开发者不可或缺的技术。本文全面解析网页爬虫的基础概念、工作原理、技术栈与工具,以及实战案例,探讨其合法性与道德问题,分享爬虫设计与实现的详细步骤,介绍优化与维护的方法,应对反爬虫机制、动态内容加载等挑战,旨在帮助读者深入理解并合理运用网页爬虫技术。
|
20天前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2

推荐镜像

更多