GUI自动化基础(一)

目录

使用pywinauto的原因

pywinauto也有局限性

安装UI对象检查工具

1.安装pywinauto

2.打开程序

3.连接已经打开的程序

4.获取窗口

5.窗口的操作

好久没更新了,今天跟大家分享一点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() | 判断是否是顶级窗口 |

相关推荐
卷Java2 小时前
Python字典:键值对、get()方法、defaultdict,附通讯录实战
开发语言·数据库·python
七夜zippoe2 小时前
区块链开发:从智能合约到DApp
python·区块链·智能合约·开发·dapp
hhhjllhj2 小时前
如何用关键词优化报表提升网站流量?
python·搜索引擎·facebook
明月(Alioo)2 小时前
Python 并发编程详解 - Java 开发者视角
java·开发语言·python
跟着珅聪学java2 小时前
编写高质量 CSS 样式完全指南
人工智能·python·tensorflow
进击的小头2 小时前
第18篇:PID参数整定与裕度优化的现场调试实战
python·算法
飞Link3 小时前
LangChain 核心链式架构演进史:从顺序链到企业级路由兜底实战
python·架构·langchain
啥咕啦呛3 小时前
java打卡学习3:ArrayList扩容机制
java·python·学习
编程之升级打怪3 小时前
用排他锁来实现Python语言的变量值更新
开发语言·python