纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践
1、测试框架选择
hdc:类似 android 系统的 adb 命令,提供设备信息查询,包管理,调试相关的命令@ohos.UiTest:鸿蒙 sdk 的一部分,类似 android sdk 里的uiautomator,基于 Accessibility 服务,提供模拟 UI 操作的能力。但是需要用arkTS语言来写自动化 case,并且用例需要打包到被测 app 里面hypium:鸿蒙官方的自动化框架,功能比较完善,可以基于 python 编写自动化 case-
hmdriver2 一个鸿蒙自动化测试py库,安装方便,语法简洁
鸿蒙自动化测试的 文档中心
文档中心hmdriver2 文档:https://github.com/codematrixer/hmdriver2
查看了文档后,发现hypium是官方的自动化框架,但是安装环境比较复杂,并且他是一整套的测试框架,包括了用例套件的管理与执行等,算是比较重量级的。
hmdriver2是一个轻量级的库,流程等都不复杂,先体验一下这个
2、环境配置
- 配置鸿蒙
HDC环境(等价于 android 端的 adb)- 下载 Command Line Tools 并解压
hdc文件在command-line-tools/sdk/HarmonyOS-NEXT-DB2/openharmony/toolchains目录下- 配置环境变量,macOS 为例,在~/.bash_profile 或者 ~/.zshrc 文件中添加
export HM_SDK_HOME="/Users/develop/command-line-tools/sdk/HarmonyOS-NEXT-DB2" //请以sdk实际安装目录为准
export PATH=$PATH:$HM_SDK_HOME/hms/toolchains:$HM_SDK_HOME/openharmony/toolchains
export HDC_SERVER_PORT=7035
电脑插上手机,开启 USB 调试,确保执行hdc list targets 可以看到设备序列号

hdc常用命令 文档中心
2、安装hmdirver2 基础库
pip3 install -U hmdriver2
如果需要使用屏幕录屏 功能,则需要安装额外依赖opencv-python
pip3 install -U "hmdriver2[opencv-python]"
// 由于`opencv-python`比较大,因此没有写入到主依赖中,按需安装
3、代码编写
导入包后就可以连接设备,启动app,当前以安居客发布为例
from hmdriver2.driver import Driverd = Driver("FMR0223C13000076")
d.start_app("com.anjuke.home", "EntryAbility")
然后就可以进行元素定位和操作
元素定位支持
- 控件查找(联合查找,模糊查找,相对查找)
- 控件信息获取
- 控件点击,长按,拖拽,缩放
- 文本输入,清除
- 获取控件树
控件查找支持这些by属性
idkeytexttypedescriptionclickablelongClickablescrollableenabledfocusedselectedcheckedcheckableisBeforeisAfter
定位方式包括普通定位,模糊定位,相当定位
d(text="tab_recrod")d(id="drag")# 定位所有`type`为Button的元素,选中第0个
d(type="Button", index=0)# 定位`type`为Button且`text`为tab_recrod的元素
d(type="Button", text="tab_recrod")# 定位`text`为showToast的元素的前面一个元素
d(text="showToast", isAfter=True) # 定位`id`为drag的元素的后面一个元素
d(id="drag", isBefore=True)
元素操作与信息获取
d(text="tab_recrod").info# output:
{"id": "","key": "","type": "Button","text": "tab_recrod","description": "","isSelected": False,"isChecked": False,"isEnabled": True,"isFocused": False,"isCheckable": False,"isClickable": True,"isLongClickable": False,"isScrollable": False,"bounds": {"left": 539,"top": 1282,"right": 832,"bottom": 1412},"boundsCenter": {"x": 685,"y": 1347}
}d(text="tab_recrod").click()
d(type="Button", text="tab_recrod").click()d(text="tab_recrod").click_if_exists()d(text="tab_recrod").double_click()
d(text="tab_recrod").long_click()# 控件拖拽
componentB: ComponentData = d(type="ListItem", index=1).find_component()
d(type="ListItem").drag_to(componentB) # 将元素拖动到元素B上# 控件缩放
d(text="tab_recrod").pinch_in(scale=0.5)
d(text="tab_recrod").pinch_out(scale=2)
更多操作请看详细文档https://github.com/codematrixer/hmdriver2或hmdriver2 发布:开启鸿蒙 NEXT 自动化新时代 · 测试之家
另外元素查找可使用 uiviewer工具
安装 pip3 install -U uiviewer
启动 python3 -m uiviewer
打开页面,选择设备,点击connect,连接设备
可查看ui树,定位元素,复制xpath或者rect(元素在屏幕位置)
点击dump hierarchy刷新页面

小demo
from hmdriver2.driver import Driverd = Driver("FMR0223C13000076")
d.start_app("com.anjuke.home", "EntryAbility")
d(text="租房", index=0).click()
for i in range(5):d.swipe(0.5, 0.7, 0.5, 0.5, speed=2000)
d.go_home()
实际可以结合pytest等框架进行用例管理,报告输出等
鸿蒙自动化视频
相关文章:
纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践
1、测试框架选择 hdc:类似 android 系统的 adb 命令,提供设备信息查询,包管理,调试相关的命令ohos.UiTest:鸿蒙 sdk 的一部分,类似 android sdk 里的uiautomator,基于 Accessibility 服务&…...
C 语言标准库 - <errno.h>
目录 1.errno 变量 2.宏 1.errno 变量 errno.h 声明了一个 int 类型的 errno 变量,用来存储错误码(正整数)。 如果这个变量有非零值,表示已经执行的程序发生了错误。 #include <errno.h> #include <stdio.h> #in…...
Golang自带的测试库testing的使用
testing是golang自带的测试库。 testting规则: 在待测试功能所在文件的同级目录中创建一个以_test.go结尾的文件。 测试函数名必须是TestXxxx这个形式,而且Xxxx必须以大写字母开头,另外函数带有一个*testing.T类型的参数。 // 单元测试&am…...
29.电影院售票系统(基于springboot和vue的Java项目)
目录 1.系统的受众说明 2 论文背景 2.1 国内研究现状: 2.2 国外研究现状: 2.3 所用技术 3 系统需求分析 3.1 需求分析 3.2 可行性分析 3.2.1技术可行性分析 3.2.2市场可行性分析 3.2.3经济可…...
大学生就业平台微信小程序
随着计算机技术的成熟,互联网的建立,如今,PC平台上有许多关于大学生就业方面的程序,但由于使用时间和地点上的限制,用户在使用上存在着种种不方便,而开发一款大学生就业平台微信小程序,能够有效…...
Redis 缓存击穿
目录 缓存击穿 什么是缓存击穿? 有哪些解决办法? 缓存穿透和缓存击穿有什么区别? 缓存雪崩 什么是缓存雪崩? 有哪些解决办法? 缓存预热如何实现? 缓存雪崩和缓存击穿有什么区别? 如何保…...
初探鸿蒙:从概念到实践
一、鸿蒙开发的环境准备 开发工具:使用 DevEco Studio,支持 ArkTS 语法。 系统要求:确保计算机符合 DevEco Studio 的最低系统需求。安装步骤:下载 DevEco Studio,安装合适的 SDK 和模拟器 二、鸿蒙应用可以…...
PHP API的路由设计思路
PHP API的路由设计是构建高效、可维护API的关键环节。以下是一套完整的PHP API路由设计思路: 一、明确设计原则 使用统一资源标识符(URI):通过URI来标识资源,确保每个资源都有一个唯一的地址。使用HTTP方法ÿ…...
工程师 - 如何访问Github
Github无法访问,涉及到IP地址、Host文件、DNS等配置。 1,查找github地址 打开https://www.ipaddress.com/网站,这个网站首页是查询自己IP的。 在上方搜索栏输入github.com,查找github的地址。 https://www.ipaddress.com/websit…...
222. 完全二叉树的节点个数 迭代
222. 完全二叉树的节点个数 已解答 简单 相关标签 相关企业 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值࿰…...
中心极限定理的三种形式
独立同分布的中心极限定理: 设 X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1,X2,…,Xn是独立同分布的随机变量序列,且 E ( X i ) μ E(X_i) \mu E(Xi)μ, D ( X i ) σ 2 > 0 D(X_i) \sigma^2 > 0 D(Xi)σ2>0存在…...
React Native 全栈开发实战班 - 导航栈定制
在 React Native 应用中,导航栈管理是实现页面跳转和状态维护的核心机制。React Navigation 提供了强大的导航栈管理功能,允许开发者灵活地控制页面堆栈、传递参数、处理返回逻辑等。本章节将深入探讨导航栈的管理与定制,包括如何控制导航栈、…...
扬州BGP高防服务器可以给企业带来哪些好处?
扬州BGP服务器是目前江苏较为出名的高防机房,随着网络安全逐渐被企业所重视,扬州机房的也被大家进行选择,但是扬州BGP高防服务器除了可以帮助企业抵御网络攻击,还有着其他的帮助,下面就让我们来了解一下吧!…...
题目讲解15 合并两个排序的链表
原题链接: 合并两个排序的链表_牛客题霸_牛客网 思路分析: 第一步:写一个链表尾插数据的方法。 typedef struct ListNode ListNode;//申请结点 ListNode* BuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node->…...
leetcode92:反转链表||
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left < right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例 1: 输入:head [1,2,3,4,5], left 2, right 4 输出:[1,4,3,2…...
arkUI:遍历数据数组动态渲染(forEach)
arkUI:遍历数据数组动态渲染(forEach) 1 主要内容说明2 相关内容2.1 ForEach 的基本语法2.2 简单遍历数组2.2 多维数组遍历2.4 使用唯一键2.5 源码1的相关说明2.5.1 源码1 (遍历数据数组动态渲染)2.5.2 源码1运行效果 …...
js中import引入一个export值可以被修改。vue,react
import引入的数据实际就是数据本身。 如果导出的是一个对象,该对象引入后被更改了,则会影响其他文件引入此对象 解释示例: // resources.js const obj {} export {obj} 当在a.js中import引入一个空对象obj,并且新增一个属性ob…...
PDF24:多功能 PDF 工具使用指南
PDF24:多功能 PDF 工具使用指南 在日常工作和学习中,PDF 是一种常见且重要的文档格式。无论是查看、编辑、合并,还是转换 PDF 文件,能够快速高效地处理 PDF 文档对于提高工作效率至关重要。PDF24 是一款免费、功能全面的 PDF 工具…...
域名解析线路类型有哪几种
在网络世界中,域名解析是将域名转换为IP地址的关键环节,而域名解析线路类型的不同则为域名解析提供了多样化的策略,以满足不同用户和网络环境的需求。以下是几种常见的域名解析线路类型。 电信线路 电信线路解析主要是针对中国电信网络用户…...
Spring资源加载模块,原来XML就这,活该被注解踩在脚下 手写Spring第六篇了
这一篇让我想起来学习 Spring 的时,被 XML 支配的恐惧。明明是写Java,为啥要搞个XML呢?大佬们永远不知道,我认为最难的是 XML 头,但凡 Spring 用 JSON来做配置文件,Java 界都有可能再诞生一个扛把子。 <…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
