【Pywinauto库】0. Pywinauto Windows GUI 自动化指南
概述
Pywinauto 是一个用于自动化 Windows GUI 应用程序的 Python 库,适用于自动化测试、数据录入和其他重复性桌面操作。
快速参考表
方面 | 方法/属性示例 | 说明 |
---|---|---|
安装 | pip install pywinauto | 安装库 |
后端选择 | Application(backend="uia") 或 Application(backend="win32") | 根据应用程序技术选择后端 |
启动应用 | app.start("notepad.exe") | 启动应用程序 |
连接应用 | app.connect(process=进程ID) | 连接到已运行的应用程序 |
定位窗口 | app.window(title='无标题 - 记事本') | 通过标题定位窗口 |
打印控件标识 | dlg.print_control_identifiers() | 打印窗口中所有控件的标识信息 |
定位控件 | dlg.child_window(title="确定", control_type="Button") | 使用多种方式定位控件 |
操作控件 | .click_input() , .type_keys("文本") | 点击控件、输入文本 |
鼠标操作 | pywinauto.mouse.click(button='left', coords=(x, y)) | 模拟鼠标点击 |
键盘操作 | pywinauto.keyboard.send_keys('{ENTER}') | 模拟键盘按键 |
菜单操作 | dlg.menu_select("文件->另存为") | 选择菜单项 |
详细使用指南
1. 安装与导入
pip install pywinauto
from pywinauto import Application
from pywinauto import findwindows
from pywinauto import mouse, keyboard
2. 后端选择策略
- “uia”:适用于现代应用程序(WPF, WinForms, Qt5, 浏览器应用等)
- “win32”:适用于传统旧式应用程序(MFC, VB6, VCL 等)
选择建议:使用 Inspect.exe(uia)或 Spy++(win32)查看控件属性,选择显示信息更全面的对应后端。
3. 启动或连接应用程序
启动新应用:
app = Application(backend="uia").start("notepad.exe")
连接已运行应用:
# 通过进程ID连接
app = Application(backend="uia").connect(process=1234)# 通过窗口标题连接
app = Application(backend="uia").connect(title="无标题 - 记事本")# 通过窗口句柄连接
handle = findwindows.find_windows(title='无标题 - 记事本', class_name='Notepad')[0]
app = Application().connect(handle=handle)
4. 定位窗口和控件
窗口定位:
dlg = app.window(title='无标题 - 记事本')
dlg = app.window(title_re=".*记事本.*") # 模糊匹配
控件识别:
dlg.print_control_identifiers() # 关键步骤:查看所有控件结构
精确定位控件:
# 多条件组合定位
ok_button = dlg.child_window(title="确定", auto_id="Button1", control_type="Button")# 按控件类型定位
edit_box = dlg.child_window(control_type="Edit")
5. 控件操作
点击操作:
ok_button.click_input() # 推荐:模拟鼠标点击
ok_button.click() # 替代方式
文本输入:
edit_box.type_keys("你好,pywinauto!{ENTER}") # 支持特殊按键
edit_box.set_text("直接设置文本") # 直接设置文本
菜单操作:
dlg.menu_select("文件->另存为")
列表/组合框操作:
combo_box = dlg.child_window(control_type="ComboBox")
combo_box.select("选项一")
6. 等待机制
# 等待窗口存在
dlg.wait("exists", timeout=10)# 等待控件可见
ok_button.wait("visible", timeout=5)# 判断控件存在性
if ok_button.exists():print("控件存在")
7. 完整示例:操作记事本
from pywinauto import Application
from pywinauto.timings import wait_until# 启动记事本
app = Application(backend="uia").start("notepad.exe")# 连接到记事本窗口
dlg = app.window(title='无标题 - 记事本')# 输入文字
edit = dlg.child_window(control_type="Edit")
edit.type_keys("Hello, Pywinauto!{ENTER}This is a new line.")# 菜单操作
dlg.menu_select("文件->另存为")# 操作保存对话框
save_dlg = app.window(title="另存为")
save_dlg.wait("exists", timeout=5)
filename_edit = save_dlg.child_window(control_type="Edit")
filename_edit.type_keys("my_document.txt")
save_button = save_dlg.child_window(title="保存", control_type="Button")
save_button.click_input()# 等待和清理
wait_until(10, 0.5, lambda: dlg.exists())
# app.kill() # 强制结束进程
8. 推荐工具
- Inspect.exe(Windows SDK):uia 后端最佳调试工具,支持跟踪焦点和光标
- Spy++(Visual Studio):win32 后端控件属性查看工具
⚠️ 注意事项
- 控件定位:优先使用
auto_id
或control_type
等稳定属性组合,避免依赖易变的title
或坐标 - 时机处理:使用
wait
方法替代固定的time.sleep
,确保应用程序响应 - 权限要求:以管理员身份运行脚本以确保进程访问权限
- 兼容性:Windows 版本和应用程序更新可能影响脚本稳定性,需要定期维护
总结
Pywinauto 提供了强大的 Windows GUI 自动化能力,通过合理选择后端、精确控件定位和适当的等待机制,可以构建稳定可靠的自动化脚本。多使用 Inspect 等工具进行控件分析,能够显著提高开发效率。