【Pywinauto库】0. Pywinauto Windows GUI 自动化指南

发布于:2025-09-09 ⋅ 阅读:(22) ⋅ 点赞:(0)

概述

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 后端控件属性查看工具

⚠️ 注意事项

  1. 控件定位:优先使用 auto_idcontrol_type 等稳定属性组合,避免依赖易变的 title 或坐标
  2. 时机处理:使用 wait 方法替代固定的 time.sleep,确保应用程序响应
  3. 权限要求:以管理员身份运行脚本以确保进程访问权限
  4. 兼容性:Windows 版本和应用程序更新可能影响脚本稳定性,需要定期维护

总结

Pywinauto 提供了强大的 Windows GUI 自动化能力,通过合理选择后端、精确控件定位和适当的等待机制,可以构建稳定可靠的自动化脚本。多使用 Inspect 等工具进行控件分析,能够显著提高开发效率。


网站公告

今日签到

点亮在社区的每一天
去签到