鸿蒙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/11/5 15:46:50 阅读更多 →
软件闪退诊断与解决方案全指南

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

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

2026/10/27 23:48:45 阅读更多 →
Minecraft画质革命:BetterRenderDragon渲染龙增强工具深度解析

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

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

2026/11/2 5:50:52 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/5 12:28:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/5 1:08:50 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/5 12:28:01 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/5 12:28:02 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/5 0:54:28 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/4 19:19:54 阅读更多 →

日新闻

周新闻

月新闻