目录
好久没更新了,今天跟大家分享一点GUI自动化前置基础知识,包括使用什么工具,应用场景是什么,如何打开应用,如何定位窗口,如何对窗口进行一些操作。
这里主要使用的python,工具用的是pywinauto。
使用pywinauto的原因
Pywinauto是⼀款基于Python的跨平台GUI自动化库,专门针对Windows桌面应用程序设计,其核心能力在于通过模拟用户交互行为(如鼠标点击、键盘输入)实现对窗口、对话框及内部控件的精准定位与操作,适自动化测试、批量任务处理及日常办公流程优化等场景。
该库通过两种底层技术(backend="win32"和backend="uia")适配不同框架开发的应⽤程序: win32模式适用于于传统MFC、VB6等旧架构uia模式则支持现代WinForms、WPF、Qt5及浏览器等应用。这里主要介绍的是使用了uia底层技术的。
pywinauto也有局限性
- 只能是windows系统,不支持mac和linux系统
- 只支持基于windows系统开发的程序以及一些夸平台程序(能够在windows上运行),像web程序是不能够使用的,其他框架开发的程序也是无法使用的,某些应用程序(如使⽤Flutter、React,Native或其他跨平台框架开发的应⽤)可能使⽤自定义的渲染引擎,这些引擎不会暴露标准的Windows的UI自动化接口(如Win32或UIA)
安装UI对象检查工具
给大家介绍一个工具,UIspy.exe,是一款由微软提供的工具,专门于UI自动化测试。它允许测试⼈员查看应用程序的UI自动化模型,包括控件树、属性和事件。UISpy特别适用于编写UI自动化脚本,因为它提供了⼀个可视化的界面来帮助测试人员选择UI元素,并且可以模拟用户对这些UI元素的操作。
1.安装pywinauto
pip install pywinauto==0.6.9
2.打开程序
#通过命令行打开,返回打开的程序
app = Application(backend="uia").sta("D:\\software\\Notepad++\\notepad++.exe")
3.连接已经打开的程序


#通过进程id连接已经打开的程序,也是返回打开的application
process也通过app.process来获取,也就是利用start启动返回的应用程序
app = Application(backend="uia").contect(process=24796)
app = Application(backend="uia").connect(process=app.process)
#通过句柄handle来连接已经打开的应用程序,返回的也是application,也就是这个应用#但是handle窗口句柄要通过另外一个工具来获取,ViewWizard.exe来获取
app = Application(backend="uia").connect(handle=2830862)
4.获取窗口
通过以上两步,我们已经能够打开程序并且连接到程序,不过以上两步程序其实都是为了获取到打开的程序,只是启动程序打开的我们可以直接获取,而通过连接程序获取到的程序是通过去连接已经打开的程序来获取到程序。
获取窗口有五种常用的方法:
- title:通过程序的标题来获取窗口
- title_re :通过正则表达式匹配来获取窗口
- class_name :通过CLASSNAME获取窗口
- class_name_re:获取正则表达式匹配CLASSNAME获取窗口
- best_match:标题与指定值相似的元素(这个需要先去获取程序的一些控件信息,后面会具体说到)
我们先来看一下阿里云盘的一些UI信息:

这里主要看className,对应的就是class_name,而Name对应的就是title
#这里就只介绍准确获取的方法,正则表达式一致的,可以先去了解一下正则表达式,而根据你要的获取的窗口的classname和title进行正则表达式的书写,比较适合会变的名字。
win = app.window(title="阿里云盘")
win = app.window(class_name="Chrome_WidgetWin_1")
接下来讲一下如何使用best_macth获取窗口
win.print_control_identifiers() 方法用于打印窗口及其子控件的标识符信息,帮助用户识别控 件
• 输出内容:
◦ 控件的类名、标题、位置(左、上、右、下边界的坐标值)、控制类型等信息。
◦ 每个控件的"best_match"名称列表,这些名称可以用于引用控件。
这里展示一部分打印的内容,红框中的三个值就可以用来表示best-match的值
所以best_macth定位窗口方法如下:['Dialog', '新文件 1 - Notepad++', '新文件 1 - Notepad++Dialog']
win =app.window(best_match="Dialog")
win =app.window(best_match="新文件 1 - Notepad++")
win =app.window(best_match="新文件 1 - Notepad++Dialog")
5.窗口的操作
win.maximized()最大化窗口
|------------------|--------------------------|
| maximized() | 最大化 |
| minimized() | 最小化 |
| is_maximized() | 判断是否是最大化 |
| is_minimized() | 判断是否是最小化 |
| is_normal() | 判断是否是正常大小 |
| restore() | 恢复正常大小 |
| close() | 关闭窗口 |
| get_show_state() | 获取窗口的状态,0-正常,1-最大化,2-最小化 |
| is_dialog() | 判断是否是顶级窗口 |
