AWTK UI 自动化测试工具发布
AWTK UI 自动化 提供了兼容 Appium 的接口,可以使用 Appium 的工具来进行 UI 自动化测试。但是使用起来有点麻烦,用的人不多,所以最终决定开发一个 AWTK 专用的 UI 自动化测试工具。相比 Appium,这个工具有下列特点:
- 不依赖额外的库。
- 无需安装额外的软件。
- 无需学习额外的编程语言和 API。
- 支持串口和网络两种方式连接 APP。
- 更加适合 AWTK 的测试方式。
主要用途:
- 自动化测试。
- 自动化演示。
- 压力测试。
- 查看系统状态(辅助调试)。
1. 启用 UI 自动化
- 包含头文件
#include "remote_ui/service/remote_ui_service.h"
- 启动服务
tk_service_start(main_loop_get_event_source_manager(main_loop()), REMOTE_UI_URL, remote_ui_service_create, NULL);
完整示例请参考 demo_ui_old_app.c
2. 编写测试配置
测试用 ini 文件格式编写。通常一个应用程序需要多组测试用例,每个测试用例放到一个配置文件中,并取一个有意义的文件名。
下面给出一个简单的例子,后面会详细介绍每个命令的含义。
[create]url=tcp://localhost:2233[move_widget]target=window_manager.topx=100y=200[get_prop]target=window_manager.topname=xvalue=100[get_prop]target=window_manager.topname=yvalue=200[resize_widget]target=window_manager.topw=200h=100[get_prop]target=window_manager.topname=wvalue=200[get_prop]target=window_manager.topname=hvalue=100[close_window]name=top
3. 运行测试
- 先启动被测试的应用程序。如
./bin/demouiold
- 再运行测试程序。如
./bin/ui_test tests/ui_test_data/demouiold/overlay.ini
如果存在多组测试用例,可以把它们放到一个批处理中。
4. 测试命令
4.0 常用参数
部分参数在很多命令中都会出现,这里统一说明。
4.0.1 target
通常用来指定被操作的控件。它的值可以是控件的名字,也可以是控件的路径。如果是控件的路径,可以使用 . 来分隔控件的名字。如 window_manager.top。
有几个特殊的名称:
- window_manager 代表窗口管理器。
- window 代表当前主窗口。比如 window.close 表示当前窗口上名为 close 的控件。路径默认为当前窗口,比如 close 也表示当前窗口上名为 close 的控件。
- global 代表全局对象。用来设置语言和主题之类的全局属性。
- [序数] 表示第几个子控件。如果序数为非负表示正向序数,为负数表示反向序数。
- 如果按名称查找失败,将名字作为控件类型进行查找。
示例:
- close_button 表示名为 close_button 的控件。
- window_manager.top 表示 window_manager 窗口中名为 top 的窗口。
- window_manager.top.close_button 表示 window_manager 窗口中,名为 top 的窗口中名为 close_button 的控件。
- window.[0] 表示当前窗口中第一个控件。
- window.[-1] 表示当前窗口中倒数第一个控件。
- window.slide_view,如果窗口中存在名为 slide_view 的控件,则表示该控件,否则表示窗口中第一个 slide_view 类型的控件。
4.1 create
-
功能:创建连接。
-
参数:
- url - 连接地址,如 tcp://localhost:2233。
-
示例:
[create]url=tcp://localhost:2233
url 参数可以为串口名,通过串口连接到开发板。如:serial:///dev/ttyUSB0
4.2 take_snapshot
-
功能:截屏。如果指定的文件不存在,则将截屏保存为指定的文件。如果存在,则与之进行比较,如果不一致,则提示测试失败。
-
参数:
- target - 目标。
- filename - 截屏文件名 (.png)。
-
示例:
[take_snapshot]filename=win1.png[take_snapshot]target=windowfilename=win2.png[take_snapshot]target=window_managerfilename=wm.png[take_snapshot]target=window_manager.topfilename=top.png
4.2 get_source
-
功能:获取控件源码。如果指定的文件不存在,则将源码保存为指定的文件。如果存在,则与之进行比较,如果不一致,则提示测试失败。
-
参数:
- target - 目标。
- filename - 源码文件名 (.xml)。
-
示例:
[get_source]filename=win1.xml[get_source]target=windowfilename=win2.xml[get_source]target=window_managerfilename=wm.xml[get_source]target=window_manager.topfilename=top.xml
4.3 open_window
功能:打开窗口。
参数:
- name - 窗口名。
- xml - xml 文件(可选,以@开头表示从文件读取),如果指定,表示从 XML 内容加载窗口,通常不需要。
- init - 初始化数据 (JSON 格式,可选,以@开头表示从文件读取)。
[open_window]name=basic[open_window]name=fooxml=@tests/ui_test_data/demouiold/data/foo.xmlinit=@tests/ui_test_data/demouiold/data/foo.json
xml 文件可以用 AWTK designer 生成,也可以手工编写。
初始化数据,第一级为控件名称(路径),第二级为控件的属性和值。如:
{"bar1": {"value":50}, "bar2": {"value":80}
}
在上面的例子中,bar1 和 bar2 是窗口中的两个进度条控件,这里分别设置它们的值为 50 和 80。
4.4 close_window
功能:关闭窗口。
参数:
- name - 窗口名。
[close_window]name=top
4.5 back
功能:关闭当前窗口,返回上一级窗口。
参数:无。
[back]
4.6 home
功能:关闭除主窗口外的窗口,返回主窗口。
参数:无。
[home]
4.7 exec_fscript
功能:执行脚本。
参数:
- fscript - 脚本内容(以@开头表示从文件读取)。
示例:
[exec_fscript]fscript=print("hello");
fscript 的用法请参考 FSCRIPT 参考文档
4.8 create_widget
功能:创建控件。
参数:
- target - 目标(父控件)。
- xml - xml 内容(以@开头表示从文件读取)。
示例:
[create_widget]target=windowxml=@tests/ui_test_data/demouiold/data/quit.xml
控件的 xml 比较简单,一般手写就可以了。如下面的例子在窗口的中间创建一个按钮:
<button name="quit" text="Quit" on:click="quit()" x="c" y="m" w="128" h="30"/>
4.9 destroy_widget
功能:销毁控件。
参数:
- target - 目标控件。
示例:
[destroy_widget]target=quit
4.10 move_widget
功能:移动控件。
参数:
- target - 目标控件。
- x - x 坐标。
- y - y 坐标。
示例:
[move_widget]target=window_manager.topx=100y=200
x 和 y 的值为相对于父控件的坐标。
4.11 resize_widget
功能:调整控件大小。
参数:
- target - 目标控件。
- w - 宽度。
- h - 高度。
示例:
[resize_widget]target=window_manager.topw=200h=100
4.12 set_prop
功能:设置对象(通常为控件)的属性。
参数:
- target - 目标控件(或 global 全局对象)。
- name - 属性名。
- value - 属性值。
示例:
设置是否显示 FPS
[set_prop]target=window_managername=show_fpsvalue=false
设置屏保时间 (ms)
[set_prop]target=window_managername=screen_saver_timevalue=1000000
设置语言
[set_prop]target=globalname=languagevalue=zh_CN
设置主题
[set_prop]target=globalname=themevalue=default
4.13 get_prop
功能:获取对象(通常为控件)的属性。
参数:
- target - 目标控件(或 global 全局对象)。
- name - 属性名。
- value - 属性值(预期的值,如果实际值与之不同,认为测试失败)。
示例:
获取控件的文本
[get_prop]target=buttonname=textvalue=按钮
获取当前的语言
[get_prop]target=globalname=languagevalue=zh_CN
4.14 click
功能:点击控件(只支持按钮等可以点击的控件)。
参数:
- target - 目标。
[click]target=start
4.15 key
功能:发送按键事件。
参数:
- target - 目标。
- key - 按键。
[key]target=open_editkey=RETURN
key 的取值请参考(去掉前缀 TK_KEY_) [按键定义] https://gitee.com/zlgopen/awtk/blob/master/docs/manual/key_code_t.md
4.16 send_event
功能:发送事件。
参数:
-
target - 目标。
-
type - 事件类型。
- key_down - 按键按下。
- key_up - 按键弹起。
- pointer_down - 指针按下。
- pointer_up - 指针弹起。
- pointer_move - 指针移动。
- click - 点击。
-
x - x 坐标 (pointer 事件)。
-
y - y 坐标 (pointer 事件)。
-
key - key (key 事件)。
[send_event]type=key_downkey=RIGHT[send_event]type=key_upkey=RIGHT[send_event]target=windowtype=pointer_downx = 100y = 300[send_event]target=windowtype=pointer_movex = 101y = 301[send_event]target=windowtype=pointer_upx = 100y = 300
4.17 sleep
功能:休眠。
参数:
- ms - 等待时间(毫秒)。
```ini
[sleep]time=1000
4.18 get_loaded_images_info
功能:获取已经加载的图片信息(辅助内存相关的调试)。
参数:
- filename - 保存文件名。
示例:
[get_loaded_images_info]filename=loaded_image_info.txt
4.19 get_loaded_assets_info
功能:获取已经加载的资源信息(辅助内存相关的调试)。
参数:
- filename - 保存文件名。
示例:
[get_loaded_assets_info]filename=loaded_assets_info.txt
- 参考示例
相关文章:
AWTK UI 自动化测试工具发布
AWTK UI 自动化 提供了兼容 Appium 的接口,可以使用 Appium 的工具来进行 UI 自动化测试。但是使用起来有点麻烦,用的人不多,所以最终决定开发一个 AWTK 专用的 UI 自动化测试工具。相比 Appium,这个工具有下列特点: …...
Java后端开发——JDBC入门实验
JDBC(Java Database Connectivity)是Java编程语言中用于与数据库建立连接并进行数据库操作的API(应用程序编程接口)。JDBC允许开发人员连接到数据库,执行各种操作(如插入、更新、删除和查询数据)…...
LCA
定义 最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。 性质 如果 不为 的祖先并且 不为 的祖先,那么 分别处于 的两棵不同子树中&#…...
ts学习02-数据类型
新建index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </h…...
javaSE的发展历史以及openjdk和oracleJdk
1 JavaSE 的发展历史 1.1 Java 语言的介绍 SUN 公司在 1991 年成立了一个称为绿色计划(Green Project)的项目,由 James Gosling(高斯林)博士领导,绿色计划的目的是开发一种能够在各种消费性电子产品&…...
【入门Flink】- 10基于时间的双流联合(join)
统计固定时间内两条流数据的匹配情况,需要自定义来实现——可以用窗口(window)来表示。为了更方便地实现基于时间的合流操作,Flink 的 DataStrema API 提供了内置的 join 算子。 窗口联结(Window Join) 一…...
【Python Opencv】图片与视频的操作
文章目录 前言一、opencv图片1.1 读取图像1.2 显示图像1.3 写入图像1.4 示例代码 二、Opencv视频2.1 从相机捕获视频获取摄像头一帧一帧读取显示图片VideoCapture 中的get和set函数示例代码 2.2 从文件播放视频示例代码 2.3 保存视频示例代码 总结 前言 在计算机视觉和图像处理…...
【从入门到起飞】JavaAPI—System,Runtime,Object,Objects类
🎊专栏【JavaSE】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 🎄欢迎并且感谢大家指出小吉的问题🥰 文章目录 🍔System类⭐exit()⭐currentTimeMillis()🎄用…...
【Git】的分支和标签的讲解及实际应用场景
目录 讲解 环境讲述 分支标签的区别 分支 命令 场景应用 标签 命令 标签规范 讲解 环境讲述 当软件从开发到正式环境部署的过程中,不同环境的作用 开发环境:用于开发人员进行软件开发、测试和调试。在这个环境中,开发人员可以快速地…...
修改django开发环境runserver命令默认的端口
runserver默认8000端口 虽然python manage.py runserver 8080 可以指定端口,但不想每次runserver都添加8080这个参数 可以通过修改manage.py进行修改,只需要加三行: from django.core.management.commands.runserver import Command as Ru…...
kubeadm安装k8s高可用集群
目录 一、环境规划 二、注意事项: 三、环境准备: 1. 关闭防火墙规则,关闭selinux,关闭swap交换: 2. 修改主机名 3. 所有节点修改hosts文件: 4. 所有节点时间同步: 5. 所有节点实现Linux的资…...
来看看电脑上有哪些不为人知的小众软件?
电脑上的各类软件有很多,除了那些常见的大众化软件,还有很多不为人知的小众软件,专注于实用功能,简洁干净、功能强悍。 1.桌面停靠栏工具——BitDock BitDock是一款运行在Windows系统中的桌面停靠栏工具,功能实…...
一个进程最多可以创建多少个线程?
前言 话不多说,先来张脑图~ linux 虚拟内存知识回顾 虚拟内存空间长啥样 在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统&am…...
ElasticSearch文档分析
ElasticSearch文档分析 包含下面的过程: 将一块文本分成适合于倒排索引的独立的 词条将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall 分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里: 字符过滤器 首先&a…...
Xilinx FPGA平台DDR3设计详解(一):DDR SDRAM系统框架
DDR SDRAM(双倍速率同步动态随机存储器)是一种内存技术,它可以在时钟信号的上升沿和下降沿都传输数据,从而提高数据传输的速率。DDR SDRAM已经发展了多代,包括DDR、DDR2、DDR3、DDR4和DDR5,每一代都有不同的…...
Spring Data JPA方法名命名规则
最近巩固一下JPA,网上看到这些资料,这里记录巩固一下。 一、Spring Data Jpa方法定义的规则 简单条件查询 简单条件查询:查询某一个实体类或者集合。 按照Spring Data的规范的规定,查询方法以find | read | get开头&…...
【Leetcode Sheet】Weekly Practice 15
Leetcode Test 2586 统计范围内的元音字符串数(11.7) 给你一个下标从 0 开始的字符串数组 words 和两个整数:left 和 right 。 如果字符串以元音字母开头并以元音字母结尾,那么该字符串就是一个 元音字符串 ,其中元音字母是 a、e、i、o、u…...
人力资源社会保障部办公厅关于推行专业技术人员职业资格电子证书的通知
(人社厅发〔2021〕97号) 各省、自治区、直辖市及新疆生产建设兵团人力资源社会保障厅(局),中共海南省委人才发展局,国务院有关部门、直属机构人事部门,有关协会、学会: 为贯彻落实…...
什么是光电耦合器?如何选择型号及种类
光电耦合器(英文缩写为OC)亦称光电隔离器,简称光耦;以光为媒介传输电信号;它对输入、输出电信号有良好的隔离作用,是目前种类最多、用途最广的光电器件之一;所以,它在各种电路中得到广泛的应用。 光耦合器…...
hive里因为列名用了关键字导致建表失败
代码 现象 ParseException line 6:4 cannot recognize input near percent String COMMENT in column name or primary key or foreign key 23/11/13 11:52:57 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 6:4 cannot recognize input near percent …...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...
