鸿蒙UI测试框架:UITest
一、功能UITest分为客户端和服务端端说明客户端由测试应用加载运行在应用进程。包含跨语言通信层、IPC模块对外导出API服务端以独立进程运行通过IPC与客户端通信。负责核心逻辑控件树构建、控件匹配查找、操作事件构造、多模事件注入等UITest支持两种方式方式说明ArkTS脚本开发提供简洁易用的API接口支持点击、双击、长按、滑动等操作命令行测试支持截图、获取控件树、录制界面操作、注入UI模拟事件二、使用ArkTS接口进行UI测试2.1 步骤编写被测页面代码如ClickToAfter.ets在ohosTest目录下编写测试代码导入测试依赖kit.TestKit、ohos/hypium2.2 核心流程初始化Driver → 拉起被测应用 → 等待应用空闲 → 查找控件 → 执行操作 → 断言验证2.3 示例import { describe, expect, it, Level } from ohos/hypium; import { abilityDelegatorRegistry, Driver, ON } from kit.TestKit; import { UIAbility, Want } from kit.AbilityKit; const delegator abilityDelegatorRegistry.getAbilityDelegator(); export default function abilityTest() { describe(ActsAbilityTest, () { it(testUiExample, Level.LEVEL3, async (done: Function) { const driver Driver.create(); const bundleName abilityDelegatorRegistry.getArguments().bundleName; // 拉起被测应用 await delegator.startAbility({ bundleName: bundleName, abilityName: EntryAbility }); // 等待应用拉起完成 await driver.waitForIdle(4000, 5000); // 确认当前应用顶部Ability const ability await delegator.getCurrentTopAbility(); expect(ability.context.abilityInfo.name).assertEqual(EntryAbility); // 查找Next控件并点击 const next await driver.findComponent(ON.text(Next)); await next.click(); await driver.waitForIdle(4000, 5000); // 断言验证 await driver.assertComponentExist(ON.text(after click)); await driver.pressBack(); done(); }); }); }三、控件查找与操作3.1 控件匹配器ONUITest支持依据多种属性构造匹配器进行控件查找匹配方式示例按文本ON.text(Next)按类型ON.type(Button)相对位置ON.text(123).within(ON.type(Scroll))按idON.id(button_id)3.2 示例// 查找Button并点击 let button await driver.findComponent(ON.type(Button)); await button.click(); // 查找Scroll中文本为123的控件 let on ON.text(123).within(ON.type(Scroll)); let items await driver.findComponents(on); // 查找Image并进行双指放大 let image await driver.findComponent(ON.type(Image)); await image.pinchOut(1.5);四、模拟触摸屏手指操作4.1 基础操作// 单击 await driver.click(100, 100); // 指定屏幕id单击API 20 await driver.clickAt({ x: 100, y: 100, displayId: 0 }); // 滑动 await driver.swipe(100, 100, 200, 200, 600); // 指定屏幕id滑动API 20 await driver.swipeBetween( { x: 100, y: 100, displayId: 0 }, { x: 1000, y: 1000, displayId: 0 }, 800 ); // 抛滑 await driver.fling({ x: 100, y: 100 }, { x: 200, y: 200 }, 5, 600); // 指定方向抛滑 await driver.fling(UiDirection.DOWN, 10000); // 拖拽 await driver.drag(100, 100, 200, 200, 600);4.2 多指操作// 2根手指每根手指基于2个坐标点滑动 let pointers PointerMatrix.create(2, 2); pointers.setPoint(0, 0, { x: 100, y: 100 }); pointers.setPoint(0, 1, { x: 200, y: 100 }); pointers.setPoint(1, 0, { x: 100, y: 200 }); pointers.setPoint(1, 1, { x: 200, y: 200 }); await driver.injectMultiPointerAction(pointers);五、页面加载等待// 等待指定控件出现超时1000ms let button await driver.waitForComponent(ON.text(StartAbility Success!), 1000); // 等待应用空闲 await driver.waitForIdle(4000, 5000);六、模拟文本输入// 基于控件的文本输入 let input await driver.findComponent(ON.type(TextInput)); await input.inputText(abc); // 指定复制粘贴方式输入API 20 await input.inputText(abc, { paste: true, addition: true }); // 基于坐标的文本输入 let center await input.getBoundsCenter(); await driver.inputText(center, abc); // 包含中文时自动使用复制粘贴方式 await driver.inputText(center, 你好, { paste: false, addition: true });输入方式参数说明paste是否以复制粘贴方式输入默认falseaddition是否以追加方式输入不清空原有内容默认false七、截图// 截取指定区域并保存 let savePath /data/storage/el2/base/cache/1.png; let res await driver.screenCapture(savePath, { left: 0, top: 0, right: 100, bottom: 100 }); // 截取指定屏幕id的全屏API 20 let disPlay display.getDefaultDisplaySync(); await driver.screenCap(savePath, disPlay.id);注意截图路径需为应用沙箱路径el2/user级加密区。八、UI事件监听// 监听Toast控件出现 let observer driver.createUIEventObserver(); observer.once(toastShow, (uiElementInfo) { let bundleName uiElementInfo.bundleName; let text uiElementInfo.text; let type uiElementInfo.type; });九、模拟键鼠/触摸板/手写笔操作9.1 键盘操作import { KeyCode } from kit.InputKit; // 按键输入 await driver.triggerKey(KeyCode.KEYCODE_BACK); // 组合键输入CtrlS await driver.triggerCombineKeys(KeyCode.KEYCODE_CTRL_LEFT, KeyCode.KEYCODE_S);9.2 鼠标操作import { MouseButton } from kit.TestKit; // 鼠标左键单击 await driver.mouseClick({ x: 100, y: 100 }, MouseButton.MOUSE_BUTTON_LEFT); // 鼠标移动 await driver.mouseMoveTo({ x: 100, y: 100 }); // 鼠标拖拽 await driver.mouseDrag({ x: 100, y: 100 }, { x: 200, y: 200 }, 600); // 鼠标滚轮滚动Ctrl滚轮 await driver.mouseScroll({ x: 100, y: 100 }, true, 30, KeyCode.KEYCODE_CTRL_LEFT);9.3 触摸板操作PC/2in1// 三指上滑返回桌面 await driver.touchPadMultiFingerSwipe(3, UiDirection.UP); // 三指下滑恢复窗口 await driver.touchPadMultiFingerSwipe(3, UiDirection.DOWN);9.4 手写笔操作// 手写笔单击 await driver.penClick({ x: 100, y: 100 }); // 手写笔双击 await driver.penDoubleClick({ x: 100, y: 100 }); // 手写笔长按0.5s await driver.penLongClick({ x: 100, y: 100 }, 0.5); // 手写笔滑动 await driver.penSwipe({ x: 100, y: 100 }, { x: 100, y: 500 }, 600, 0.5);十、窗口查找与操作// 查找活跃窗口 let window await driver.findWindow({ active: true }); // 窗口最小化 await window.minimize();十一、基于命令行进行UI测试前提根据hdc命令行工具指导完成环境准备确保设备已连接。命令列表命令说明uitest screenCap截图uitest dumpLayout获取控件树uitest uiRecord record录制界面操作uitest uiRecord read读取录制数据uitest uiInput注入UI模拟操作uitest --version获取版本信息uitest start-daemon拉起UITest测试进程常用命令示例截图# 默认路径 hdc shell uitest screenCap # 指定路径 hdc shell uitest screenCap -p /data/local/tmp/1.png获取控件树hdc shell uitest dumpLayout -p /data/local/tmp/1.json录制界面操作# 开始录制CtrlC结束 hdc shell uitest uiRecord record # 读取录制数据 hdc shell uitest uiRecord read # 仅记录坐标不匹配控件 hdc shell uitest uiRecord record -W false注入模拟操作# 单击 hdc shell uitest uiInput click 100 100 # 快滑 hdc shell uitest uiInput fling 10 10 200 200 500 # 慢滑 hdc shell uitest uiInput swipe 10 10 200 200 500 # 指定方向滑动0左/1右/2上/3下 hdc shell uitest uiInput dircFling 0 500 # 输入文本 hdc shell uitest uiInput inputText 100 100 hello # 按键事件 hdc shell uitest uiInput keyEvent Home hdc shell uitest uiInput keyEvent Back # 组合键CtrlV hdc shell uitest uiInput keyEvent 2072 2038

相关新闻

英雄联盟智能助手:League Akari终极使用指南,轻松提升游戏体验

英雄联盟智能助手:League Akari终极使用指南,轻松提升游戏体验

英雄联盟智能助手:League Akari终极使用指南,轻松提升游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英…

2026/8/8 12:43:43 阅读更多 →
软件闪退诊断与解决方案全指南

软件闪退诊断与解决方案全指南

1. 软件闪退问题概述 作为一名从业十年的软件工程师,我处理过上千次软件闪退案例。闪退(Crash)是指应用程序在运行过程中突然终止的现象,通常表现为窗口直接关闭或程序无响应后退出。这种现象在Windows、macOS、Android、iOS等平台…

2026/8/8 12:43:43 阅读更多 →
Minecraft画质革命:BetterRenderDragon渲染龙增强工具深度解析

Minecraft画质革命:BetterRenderDragon渲染龙增强工具深度解析

Minecraft画质革命:BetterRenderDragon渲染龙增强工具深度解析 【免费下载链接】BetterRenderDragon 更好的渲染龙 项目地址: https://gitcode.com/gh_mirrors/be/BetterRenderDragon BetterRenderDragon是一款专为Minecraft基岩版设计的革命性渲染增强工具&…

2026/8/8 12:43:43 阅读更多 →

最新新闻

Python自动化视频剪辑:基于MoviePy的二次创作素材批量处理方案

Python自动化视频剪辑:基于MoviePy的二次创作素材批量处理方案

最近在整理项目素材时,经常遇到需要批量处理视频、音频和图片素材的场景,比如为游戏角色制作手书、MAD或简单的剧情动画。手动剪辑不仅效率低下,而且难以保证风格统一。本文将分享一套基于Python的自动化素材处理与合成方案,它特别…

2026/8/8 13:41:13 阅读更多 →
STM32状态机编程:从概念到实战,告别if-else混乱

STM32状态机编程:从概念到实战,告别if-else混乱

1. 从“流水账”到“优雅逻辑”:为什么我们需要状态机 如果你写过一些嵌入式程序,尤其是基于STM32这类MCU的程序,你很可能经历过这样的场景:一个按键,短按切换模式,长按关机;一个传感器&#xf…

2026/8/8 13:41:13 阅读更多 →
SSTQ:融合子采样与随机化的隐私保护向量量化技术解析

SSTQ:融合子采样与随机化的隐私保护向量量化技术解析

在机器学习模型部署和隐私保护的实际应用中,如何高效地压缩高维向量数据,同时严格保护数据隐私,是一个持续存在的挑战。传统的向量量化方法往往在压缩率、重建精度和隐私性之间难以取得平衡。本文将深入解析一种前沿技术——SSTQ(…

2026/8/8 13:41:13 阅读更多 →
终极指南:如何用Markmap快速将Markdown转换为交互式思维导图

终极指南:如何用Markmap快速将Markdown转换为交互式思维导图

终极指南:如何用Markmap快速将Markdown转换为交互式思维导图 【免费下载链接】markmap Build mindmaps with plain text 项目地址: https://gitcode.com/gh_mirrors/ma/markmap 你是否厌倦了在复杂的图形界面中手动绘制思维导图?想要一种更简单、…

2026/8/8 13:41:13 阅读更多 →
OpenStamp开源大模型文本水印:原理、部署与实战指南

OpenStamp开源大模型文本水印:原理、部署与实战指南

1. 先搞清楚 OpenStamp 到底解决了什么实际问题如果你正在本地部署或使用开源大语言模型,比如 LLaMA、Qwen、ChatGLM 这些,最头疼的问题之一可能就是:如何确认一段生成的文本,到底是不是来自我的模型?尤其是在内容审核…

2026/8/8 13:41:12 阅读更多 →
3小时搭建你的专属AI写作伙伴:KoboldAI本地部署完全指南

3小时搭建你的专属AI写作伙伴:KoboldAI本地部署完全指南

3小时搭建你的专属AI写作伙伴:KoboldAI本地部署完全指南 【免费下载链接】KoboldAI-Client For GGUF support, see KoboldCPP: https://github.com/LostRuins/koboldcpp 项目地址: https://gitcode.com/gh_mirrors/ko/KoboldAI-Client 你是否厌倦了云端AI服务…

2026/8/8 13:40:12 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →