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

聊聊FlaUI:让Windows UI自动化测试优雅起飞!

你还在为手动点点点测试Windows应用而感到膝盖疼?更愁于自动化测试工具价格贵得让钱包瑟瑟发抖?今天,我要给你安利一款“野路子有余,正经事儿也能干”的.NET UI自动化神器——FlaUI!别眨眼,看完你能少加三个夜班!


一、现代测试人的新困境

提到Windows UI自动化,你绝对不会陌生以下“名词”:

  • TestComplete:人狠话不多,价格劝退大多数;

  • Ranorex:功能炸裂,绝对旗舰,但同样价格不菲;

  • CodedUI:微软亲儿子,但听说它快退休了?

  • TestStack.White:开源选手,耍得溜但“年纪有点大”;

  • 自己写Win32脚本?你可太狠了!

这些工具大多是基于微软UI Automation库的,说白了,底层还是MS家的活。不过你敢信,大厂的自动化测试也才刚过“能用”的线——兼容性像吃了 随机药水,一会好一会炸,真让人抓狂。

FlaUI横空出世,立志“新瓶装旧酒”,要用现代的新姿势搞定这些陈年老问题!


二、FlaUI到底是什么?(技术仔细看,它不一般)

通俗点说,FlaUI就是Windows应用自动化测试的专业“代打选手”。

  • ✔ 它是基于.NET的开源库(C#粉丝速来集合!)

  • ✔ 支持Win32、WinForms、WPF、甚至Windows Store Apps

  • ✔ 底层用的是微软UI Automation的原生库,自己当了个“桥梁”

  • ✔ API现代、代码优雅,二次开发易如反掌

  • ✔ 支持UIA2UIA3 两套自动化引擎,Flexibility up up up!

你能想到的Windows客户端测试场景,它都能搞。界面操作仿真、控件定位、事件监听、批量模拟,一套龙!

什么是UI Automation?UIA2、UIA3有啥区别?

别走神,这段很重要!

  • MSAA: 祖师爷级别,如今饱经风霜,出场率低(还有人用吗?)。

  • UIA2(Managed):.NET托管库,兼容性好,但不支持WPF新特色、不搭理Windows商店App(气人)。

  • UIA3(COM):微软最新的UIA方案,对WPF和Store App友好,但和部分WinForms控件还需要磨合。

FlaUI牛逼就牛逼在:让你自己选需要的那套UIA引擎,还能无缝切换! 这可是前辈们都搞不定的事(TestStack.White就因为代码太旧,各种尬 bug)。


三、你凭什么要用FlaUI?盘点一波优势

1. API现代易用,撸代码不费劲

  • 一扫TestStack.White那种“爷爷级”API的时代风味

  • 链式写法、lambda搜索、类型化强,Ctrl+C就是爽(老司机更有赶脚)

2. 支持市面上几乎所有主流Windows桌面技术

  • 老旧的Win32、新潮的WPF、最头大的Window Store Apps,通吃!

  • 遇啥都能测,没在怕的

3. 可选UIA2、UIA3内核,兼容问题自己灵活解决

  • WinForms偏古董,选UIA2更稳

  • WPF、Store App,直接用UIA3起飞

4. 完全开源,社区活跃,更新快

  • Github星星多,Pull Request响应快

  • 遇阻有人问,提BUG也能得到响应

  • 寄希望于厂商官方那是梦,开源才是未来

5. 大厂白嫖背书,ReSharper、AppVeyor都送License

  • 这社区认可动静,绝对不是小打小闹


四、装逼时间——FlaUI代码体验:小白也能“玩”自动化!

1. 两步安装,官方Nuget包安排

有点基础都知道,只需一句:

Install-Package FlaUI.UIA3

想用UIA2,换个包名就行。你也聪明,自己查查Nuget。

2. 你的第一个FlaUI用例:打开记事本,霸气操作!

using FlaUI.Core;
using FlaUI.UIA3;var app = Application.Launch("notepad.exe");
using (var automation = new UIA3Automation())
{var window = app.GetMainWindow(automation);Console.WriteLine("窗口标题:" + window.Title);// 在“编辑区”输入文本var edit = window.FindFirstDescendant(cf => cf.ByControlType(FlaUI.Core.Definitions.ControlType.Edit))?.AsTextBox();edit?.Enter("FlaUI自动化准时下班,妈妈再也不用担心我的头发!");// 点击菜单栏 “文件” -> “退出”var fileMenu = window.FindFirstDescendant(cf => cf.ByText("文件"))?.AsMenuItem();fileMenu?.Invoke();// 根据需要关闭应用
}

不但能操作,还能定位子控件~功能伸缩自如!

3. 控件交互?各类Locators让你想点哪点哪

FlaUI的lambda表达式定位,丝滑且强大:

var button1 = window.FindFirstDescendant(cf => cf.ByText("1"))?.AsButton();
button1?.Invoke();

只要你界面里的控件有UI Automation可识别的“属性”,都能随便找!

批量操作

比如批量点击“计算器”的1到9按钮,只需for循环配合买一送一:

for(int i = 1; i <= 9; i++){var button = window.FindFirstDescendant(cf => cf.ByText(i.ToString()))?.AsButton();button?.Invoke();
}

4. 录制与辅助,有捷径

虽然FlaUI不是CodedUI自带录制器,但社区已有录制辅助(比如FlaUInspect),录控件更直观,鼠标点哪哪高亮,用起来比某些闭源收费家伙还舒畅!


五、FlaUI的扩展玩法

1. 集成CI/CD,自动化测试流水线一气呵成

FlaUI配合AppVeyor/Jenkins检测客户端回归,用CI让自动化测试上大雅之堂——“人到茶凉,测试已跑完”。

2. 自定义扩展,与任意.NET库共舞

用FlaUI定位控件后,你完全可以混合NUnit/xUnit编写断言; 还可以与你的工厂、封装层配合,让用例更优雅。

3. API级二次开发

想要特殊姿势,比如读取控件更多属性,甚至直接用原生UIA对象,FlaUI全部给你暴露出来!可谓“君子坦荡荡”,开发无死角!


六、被夸得天花乱坠,FlaUI有没有槽点

1. 录制器体验还有提升空间(但社区正在完善)

2. UIA3和WinForms搭配偶尔会有奇怪bug

3. 必须.NET,Python党等只能看看

不过——凡事没有十全十美,但“开源+现代+强大”的优势已经让大部分人乐开了花。UI录制这块手动写写定位器,也是小菜一碟。


七、学FlaUI去哪看?资源大礼包送给你!

  1. 官方文档:https://github.com/FlaUI/FlaUI

  2. YouTube系列教程:H Y R Tutorials,一个带你手把手实操的好频道

  3. 社区答疑:Gitter群活跃,点进去发问不迷路

  4. 源码体验:本体附带十足多的UI测试样例,照葫芦画瓢无压力

相关文章:

聊聊FlaUI:让Windows UI自动化测试优雅起飞!

你还在为手动点点点测试Windows应用而感到膝盖疼&#xff1f;更愁于自动化测试工具价格贵得让钱包瑟瑟发抖&#xff1f;今天&#xff0c;我要给你安利一款“野路子有余&#xff0c;正经事儿也能干”的.NET UI自动化神器——FlaUI&#xff01;别眨眼&#xff0c;看完你能少加三个…...

VIN码车辆识别码解析接口如何用C#进行调用?

一、什么是VIN码车辆识别码解析接口 输入17位vin码&#xff0c;获取到车辆的品牌、型号、出厂日期、发动机类型、驱动类型、车型、年份等信息。无论是汽车电商平台、二手车商、维修厂&#xff0c;还是保险公司、金融机构&#xff0c;都能通过接入该API实现信息自动化、决策智能…...

[论文阅读] 人工智能 | 用大语言模型解决软件元数据“身份谜题”:科研软件的“认脸”新方案

用大语言模型解决软件元数据“身份谜题”&#xff1a;科研软件的“认脸”新方案 论文信息 作者: Eva Martn del Pico, Josep Llus Gelp, Salvador Capella-Gutirrez 标题: Identity resolution of software metadata using Large Language Models 年份: 2025 来源: arX…...

gorm多租户插件的使用

一、关于gorm多租户插件的使用 1、安装依赖 go get -u github.com/kuangshp/gorm-tenant2、创建一个mysql数据表 DROP TABLE IF EXISTS user; CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT primary key COMMENT 主键id,name varchar(50) not null comment 名称,ten…...

Playwright 测试框架 - Java

🚀【Playwright + Java 实战教程】从零到一掌握自动化测试利器! 🔧 本文专为 Java 开发者量身打造,通过详尽示例带你快速掌握 Playwright 自动化测试。涵盖基础操作、表单交互、测试框架集成、高阶功能及常见实战技巧,适用于企业 UI 测试与 CI/CD 场景。 🛠️ 一、环境…...

力扣100题之128. 最长连续序列

方法1 使用了hash 方法思路 使用哈希集合&#xff1a;首先将数组中的所有数字存入一个哈希集合中&#xff0c;这样可以在 O(1) 时间内检查某个数字是否存在。 寻找连续序列&#xff1a;遍历数组中的每一个数字&#xff0c;对于每一个数字&#xff0c; 检查它是否是某个连续序列…...

算法打卡12天

19.链表相交 &#xff08;力扣面试题 02.07. 链表相交&#xff09; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交**&#xff1a;** 题目数据…...

OpenCV C++ 学习笔记(四):图像/视频的输入输出(highgui模块 高层GUI和媒体I/O)

文章目录 图片读取创建窗口图片显示图片保存视频输入输出 图片读取 cv::Mat imread( const String& filename, int flags IMREAD_COLOR );enum ImreadModes {IMREAD_UNCHANGED -1, //!< If set, return the loaded image as is (with alpha channel, othe…...

我的创作纪念日——聊聊我想成为一个创作者的动机

2025年6月4日&#xff0c;是我在CSDN写下第一篇技术博客的第1024天。 1024&#xff0c;这个数字对于程序员来说意义非凡&#xff0c;它不仅是内存单位的基础&#xff0c;更是我们这群“码农”的节日符号。而对我来说&#xff0c;它更像是一段旅程的里程碑&#xff1a;从一个曾想…...

蓝桥杯国赛训练 day1 Java大学B组

目录 k倍区间 舞狮 交换瓶子 k倍区间 取模后算组合数就行 import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {solve();}public static vo…...

PyTorch——非线性激活(5)

非线性激活函数的作用是让神经网络能够理解更复杂的模式和规律。如果没有非线性激活函数&#xff0c;神经网络就只能进行简单的加法和乘法运算&#xff0c;没法处理复杂的问题。 非线性变化的目的就是给我们的网络当中引入一些非线性特征 Relu 激活函数 Relu处理图像 # 导入必…...

OPenCV CUDA模块目标检测----- HOG 特征提取和目标检测类cv::cuda::HOG

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::HOG 是 OpenCV 的 CUDA 模块中对 HOG 特征提取和目标检测 提供的 GPU 实现。它与 CPU 版本的 cv::HOGDescriptor 类似&#xff0c;但利…...

MATLAB读取文件内容:Excel、CSV和TXT文件解析

MATLAB读取文件内容&#xff1a;Excel、CSV和TXT文件解析 MATLAB 是一款强大的数学与工程计算工具&#xff0c;广泛应用于数据分析、模型构建和图像处理等领域。在处理实际问题时&#xff0c;我们常常需要从文件中读取数据进行分析。本文将介绍如何使用 MATLAB 读取常见的文件…...

Spring MVC 之 异常处理

使用Spring MVC可以很灵活地完成数据的绑定和响应&#xff0c;极大的简化了Java Web的开发。但Spring MVC提供的便利不仅仅如此&#xff0c;使用Spring MVC还可以很便捷地完成项目中的异常处理、自定义拦截器以及文件上传和下载等高级功能。本章将对Spring MVC提供的这些高级功…...

缓存控制HTTP标头设置为“无缓存、无存储、必须重新验证”

文章目录 说明示例核心响应头设置实现原理代码实现1. 原生 Node.js (使用 http 模块)2. Express 框架3. 针对特定路由设置 (Express) 验证方法&#xff08;使用 cURL&#xff09;关键注意事项 说明 日期&#xff1a;2025年6月4日。 对于安全内容&#xff0c;请确保缓存控制HT…...

ubuntu24.04 使用apt指令只下载不安装软件

比如我想下载net-tools工具包及其依赖包可以如下指令 apt --download-only install net-tools 自动下载的软件包在/var/cache/apt/archives/目录下...

macOS 上使用 Homebrew 安装redis-cli

在 macOS 上使用 Homebrew 安装 redis-cli&#xff08;Redis 命令行工具&#xff09;非常简单&#xff0c;以下是详细步骤&#xff1a; 1. 安装 Redis&#xff08;包含 redis-cli&#xff09; 运行以下命令安装 Redis&#xff1a; brew install redis这会安装完整的 Redis 服…...

计算机网络安全问答数据集(1788条) ,AI智能体知识库收集! AI大模型训练数据!

继续收集数据集&#xff0c;话不多说&#xff0c;见下文&#xff01; 今天分享一个计算机网络安全问答数据集&#xff08;1788条)&#xff0c;适用于AI大模型训练、智能体知识库构建、安全教育系统开发等多种场景&#xff01; 一、数据特点 结构清晰&#xff1a;共计1788条&…...

WinCC学习系列-高阶应用(WinCC REST通信)

WinCC作为一个经典SCADA系统&#xff0c;它是OT与IT数据无缝集成桥梁&#xff0c;自WinCC7.5版本开始&#xff0c;可以直接提供Rest服务用于其它系统数据访问和操作。 WinCC REST 服务允许外部应用程序访问 WinCC 数据。 外部应用程序可以通过 REST 接口读取和写入 WinCC 组态…...

八、Python模块、包

目录 1. 模块 1.1 什么是模块&#xff1f; 1.2 创建模块 1.3 导入模块 1.4 模块的命名空间 1.5 模块的搜索路径 1.6 模块的重新加载 2. 包 2.1 什么是包&#xff1f; 2.2 创建包 2.3 导入包中的模块 2.4 包的层次结构 3. 模块和包的管理 3.1 安装模块 3.2 卸载模…...

使用交叉编译工具提示stubs-32.h:7:11: fatal error: gnu/stubs-soft.h: 没有那个文件或目录的解决办法

0 前言 使用ST官方SDK提供的交叉编译工具、cmake生成Makefile&#xff0c;使用make命令生成可执行文件提示fatal error: gnu/stubs-soft.h: 没有那个文件或目录的解决办法&#xff0c;如下所示&#xff1a; 根据这一错误提示&#xff0c;按照网上的解决方案逐一尝试均以失败告…...

macOS 连接 Docker 运行 postgres,使用navicat添加并关联数据库

下载 docker注册一个账号&#xff0c;登录 Docker创建 docke r文件 mkdir -p ~/.docker && touch ~/.docker/daemon.json写入配置&#xff08;全量替换&#xff09; {"builder": {"gc": {"defaultKeepStorage": "20GB",&quo…...

指针的使用——基本数据类型、数组、结构体

1 引言 对于学习指针要弄清楚如下问题基本可以应付大部分的场景&#xff1a; ① 指针是什么&#xff1f; ② 指针的类型是什么&#xff1f; ③ 指针指向的类型是什么&#xff1f; ④ 指针指向了哪里&#xff1f; 2 如何使用指针 任何东西的学习最好可以总结成一种通用化的…...

TK海外抢单源码/指定卡单

​ 抢单源码&#xff0c;有指定派单&#xff0c;打针&#xff0c;这套二改过充值跳转客服 前端vue 后端php 两端分离 可二开 可以指定卡第几单&#xff0c;金额多少&#xff0c; 前后端开源 PHP7.2 MySQL5.6 前端要www.域名&#xff0c;后端要admin.域名 前端直接静态 伪静…...

Docker MCP 目录和工具包简介:使用 MCP 为 AI 代理提供支持的简单安全方法

目录 Model Context Protocol 势头强劲 — 还需要改进哪些?发现正确的、官方的和/或值得信赖的工具是很困难的复杂的安装和分发身份验证和权限不足Docker 如何帮助解决这些挑战在安全、隔离的容器中轻松发现和运行 MCP 服务器一键式 MCP 客户端集成,内置安全认证企业就绪的 M…...

【Linux】Linux 环境变量

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125533127 一、环境变量 1.1 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&am…...

OpenCV在图像上绘制文字示例

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 OpenCV中除了提供绘制各种图形的函数外&#xff0c;还提供了一个特殊的绘制函数&#xff0c;用于在图像上绘制文字。这个函数是putText()&#xff0c;它是命名空间cv中的函数&#xff0c;其声明如下&#xff…...

Java 抗量子算法:构建后量子时代的安全基石

一、量子计算带来的加密挑战 在传统加密体系中&#xff0c;RSA、ECC 等公钥算法依赖大数分解和离散对数问题的难解性。然而&#xff0c;量子计算机的 Shor 算法可在多项式时间内破解这些算法&#xff0c;使现有加密体系面临颠覆性威胁。例如&#xff0c;2048 位 RSA 密钥的破解…...

Kubernetes 集群到 Jumpserver

以下是使用 ServiceAccount Token&#xff08;令牌&#xff09; 连接 Kubernetes 集群到 Jumpserver 的 详细分步指南&#xff0c;包括权限配置、Token 获取和常见问题排查。 1. 创建 ServiceAccount 并分配权限 1.1 创建 ServiceAccount 在 Kubernetes 集群中创建一个专用于…...

Android7 Input(十)View 处理Input事件pipeline

概述: 本文主要描述View对InputEvent事件pipeline处理过程。 本文涉及的源码路径 frameworks/base/core/java/android/view/ViewRootImpl.java InputEvent事件处理 View处理input事件是调用doProcessInputEvents方法&#xff0c;如下所示: void doProcessInputEvents() {//…...