当前位置: 首页 > news >正文

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 的接口&#xff0c;可以使用 Appium 的工具来进行 UI 自动化测试。但是使用起来有点麻烦&#xff0c;用的人不多&#xff0c;所以最终决定开发一个 AWTK 专用的 UI 自动化测试工具。相比 Appium&#xff0c;这个工具有下列特点&#xff1a; …...

Java后端开发——JDBC入门实验

JDBC&#xff08;Java Database Connectivity&#xff09;是Java编程语言中用于与数据库建立连接并进行数据库操作的API&#xff08;应用程序编程接口&#xff09;。JDBC允许开发人员连接到数据库&#xff0c;执行各种操作&#xff08;如插入、更新、删除和查询数据&#xff09…...

LCA

定义 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节点的最近公共祖先&#xff0c;就是这两个点的公共祖先里面&#xff0c;离根最远的那个。 性质 如果 不为 的祖先并且 不为 的祖先&#xff0c;那么 分别处于 的两棵不同子树中&#…...

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 年成立了一个称为绿色计划&#xff08;Green Project&#xff09;的项目&#xff0c;由 James Gosling&#xff08;高斯林&#xff09;博士领导&#xff0c;绿色计划的目的是开发一种能够在各种消费性电子产品&…...

【入门Flink】- 10基于时间的双流联合(join)

统计固定时间内两条流数据的匹配情况&#xff0c;需要自定义来实现——可以用窗口&#xff08;window&#xff09;来表示。为了更方便地实现基于时间的合流操作&#xff0c;Flink 的 DataStrema API 提供了内置的 join 算子。 窗口联结&#xff08;Window Join&#xff09; 一…...

【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类

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;System类⭐exit()⭐currentTimeMillis()&#x1f384;用…...

【Git】的分支和标签的讲解及实际应用场景

目录 讲解 环境讲述 分支标签的区别 分支 命令 场景应用 标签 命令 标签规范 讲解 环境讲述 当软件从开发到正式环境部署的过程中&#xff0c;不同环境的作用 开发环境&#xff1a;用于开发人员进行软件开发、测试和调试。在这个环境中&#xff0c;开发人员可以快速地…...

修改django开发环境runserver命令默认的端口

runserver默认8000端口 虽然python manage.py runserver 8080 可以指定端口&#xff0c;但不想每次runserver都添加8080这个参数 可以通过修改manage.py进行修改&#xff0c;只需要加三行&#xff1a; from django.core.management.commands.runserver import Command as Ru…...

kubeadm安装k8s高可用集群

目录 一、环境规划 二、注意事项&#xff1a; 三、环境准备&#xff1a; 1. 关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换&#xff1a; 2. 修改主机名 3. 所有节点修改hosts文件&#xff1a; 4. 所有节点时间同步&#xff1a; 5. 所有节点实现Linux的资…...

来看看电脑上有哪些不为人知的小众软件?

​ 电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。 1.桌面停靠栏工具——BitDock ​ BitDock是一款运行在Windows系统中的桌面停靠栏工具&#xff0c;功能实…...

一个进程最多可以创建多少个线程?

前言 话不多说&#xff0c;先来张脑图~ linux 虚拟内存知识回顾 虚拟内存空间长啥样 在 Linux 操作系统中&#xff0c;虚拟地址空间的内部又被分为内核空间和用户空间两部分&#xff0c;不同位数的系统&#xff0c;地址空间的范围也不同。比如最常见的 32 位和 64 位系统&am…...

ElasticSearch文档分析

ElasticSearch文档分析 包含下面的过程&#xff1a; 将一块文本分成适合于倒排索引的独立的 词条将这些词条统一化为标准格式以提高它们的“可搜索性”&#xff0c;或者 recall 分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里&#xff1a; 字符过滤器 首先&a…...

Xilinx FPGA平台DDR3设计详解(一):DDR SDRAM系统框架

DDR SDRAM&#xff08;双倍速率同步动态随机存储器&#xff09;是一种内存技术&#xff0c;它可以在时钟信号的上升沿和下降沿都传输数据&#xff0c;从而提高数据传输的速率。DDR SDRAM已经发展了多代&#xff0c;包括DDR、DDR2、DDR3、DDR4和DDR5&#xff0c;每一代都有不同的…...

Spring Data JPA方法名命名规则

最近巩固一下JPA&#xff0c;网上看到这些资料&#xff0c;这里记录巩固一下。 一、Spring Data Jpa方法定义的规则 简单条件查询 简单条件查询&#xff1a;查询某一个实体类或者集合。 按照Spring Data的规范的规定&#xff0c;查询方法以find | read | get开头&…...

【Leetcode Sheet】Weekly Practice 15

Leetcode Test 2586 统计范围内的元音字符串数(11.7) 给你一个下标从 0 开始的字符串数组 words 和两个整数&#xff1a;left 和 right 。 如果字符串以元音字母开头并以元音字母结尾&#xff0c;那么该字符串就是一个 元音字符串 &#xff0c;其中元音字母是 a、e、i、o、u…...

人力资源社会保障部办公厅关于推行专业技术人员职业资格电子证书的通知

&#xff08;人社厅发〔2021〕97号&#xff09; 各省、自治区、直辖市及新疆生产建设兵团人力资源社会保障厅&#xff08;局&#xff09;&#xff0c;中共海南省委人才发展局&#xff0c;国务院有关部门、直属机构人事部门&#xff0c;有关协会、学会&#xff1a; 为贯彻落实…...

什么是光电耦合器?如何选择型号及种类

光电耦合器(英文缩写为OC)亦称光电隔离器&#xff0c;简称光耦&#xff1b;以光为媒介传输电信号&#xff1b;它对输入、输出电信号有良好的隔离作用&#xff0c;是目前种类最多、用途最广的光电器件之一&#xff1b;所以&#xff0c;它在各种电路中得到广泛的应用。 光耦合器…...

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 …...

Z-Image-Turbo-rinaiqiao-huiyewunv 开发工具链:使用Cursor智能IDE加速模型集成代码编写

Z-Image-Turbo-rinaiqiao-huiyewunv 开发工具链&#xff1a;使用Cursor智能IDE加速模型集成代码编写 1. 引言 如果你正在尝试把Z-Image-Turbo这类图像生成模型集成到自己的项目里&#xff0c;可能遇到过这样的场景&#xff1a;对着API文档&#xff0c;一行行敲着重复的请求代…...

2001-2024年我国农作物分布栅格数据(小麦、玉米、水稻、甘蔗等)

1 数据介绍 中国农作物分布栅格数据集&#xff08;2001-2024&#xff09; 数据简介 本数据集由Yangyang Fu团队开发&#xff0c;提供2001-2024年中国28个省份30米分辨率的农作物分布栅格数据&#xff0c;涵盖单季稻、双季稻、冬小麦、玉米等主要作物类型及其轮作模式。 数…...

WorkBuddy技能系统详解:推荐6大实用Skill

文章目录一、给你的AI同事装上"专业技能包"二、Excel智能处理&#xff1a;表格操作的"一键魔法"三、PPT智能生成&#xff1a;从构思到成稿的"全自动流水线"四、浏览器自动化&#xff1a;让AI替你去"网上冲浪"五、智能文件整理&#xf…...

阿里Live Avatar数字人:从部署到生成视频的完整流程

阿里Live Avatar数字人&#xff1a;从部署到生成视频的完整流程 1. 引言&#xff1a;认识Live Avatar数字人 Live Avatar是阿里巴巴联合高校开源的一款先进数字人视频生成模型。这个强大的工具可以将静态图片、音频和文字描述转化为生动的数字人视频&#xff0c;实现逼真的口…...

深入排查:yaml-cpp 静态链接与动态链接混用引发的 undefined reference 陷阱

1. 当yaml-cpp遇上undefined reference&#xff1a;静态与动态链接的暗礁 第一次在CMake项目里集成yaml-cpp时&#xff0c;那个突如其来的"undefined reference to YAML::LoadFile"错误让我愣了半天。明明已经正确引用了头文件&#xff0c;target_link_libraries也配…...

CSS如何实现不同尺寸的卡片网格_利用Grid跨行跨列设置

Grid卡片跨行跨列需用grid-row: span 2等语法避免线号计算错误&#xff1b;auto-fit需容器有明确宽度&#xff1b;高度不一致时宜用嵌套布局或grid-auto-rows: auto&#xff1b;IE11不支持现代Grid跨行&#xff0c;应降级方案。Grid卡片跨行跨列时&#xff0c;grid-row和grid-c…...

Grafici-GFX:Arduino嵌入式数据可视化轻量库

1. Grafici-GFX 库概述&#xff1a;面向嵌入式显示终端的数据可视化引擎Grafici-GFX 是一个专为 Arduino 平台设计的轻量级数据可视化库&#xff0c;其核心定位并非通用图形渲染&#xff0c;而是在资源受限的微控制器上实现高效、可配置的数据曲线绘制与状态呈现。该库不直接操…...

GObject框架:C语言的面向对象编程实践

1. GObject框架概述GObject作为GLib库的核心组件&#xff0c;为C语言开发者提供了一套完整的面向对象编程范式。这个框架完美解决了C语言缺乏原生面向对象支持的痛点&#xff0c;让开发者能够在保持C语言高效性的同时&#xff0c;享受到面向对象编程的诸多优势。我在实际项目中…...

Linux驱动开发实战:内核日志与寄存器操作指南

1. 新手Linux驱动开发者的五大生存法则作为一名在Linux驱动领域摸爬滚打多年的老司机&#xff0c;我见过太多新人刚入职时的迷茫和踩坑。驱动开发不同于应用层编程&#xff0c;它直接与硬件打交道&#xff0c;一个不小心就可能让整个系统崩溃。今天我就分享五个最实用的忠告&am…...

【回眸】私教课要点总结

前言 流程 辅助引体向上 高位下拉 坐姿划船 一、辅助引体向上&#xff08;器械引体 / 弹力带引体&#xff09; ✅ 核心训练目标 ✅ 动作要点 ❌ 常见错误 &#x1f50e; 小提示 二、高位下拉&#xff08;Lat Pulldown&#xff09; ✅ 核心训练目标 ✅ 动作要点 ❌…...