5人参与 • 2025-10-27 • Python
在 windows 桌面应用开发与测试中,我们经常需要 自动化地操作图形界面 —— 例如:
这类任务如果用传统方式,需要借助鼠标键盘模拟库(如 pyautogui)或低层 windows api,非常繁琐。而 pywinauto 作为一款专门面向 windows gui 自动化的 python 库,可以像人一样“看懂”界面结构,精准控制窗口、按钮、菜单、文本框等控件。
它的最大特点是:
“能识别控件,而不是盲目点坐标。”
这意味着,它能像自动化测试框架一样理解界面语义,进行稳定的自动化操作,而不依赖屏幕分辨率或窗口位置。
pywinauto 可以直接通过 pip 安装:
pip install pywinauto
如需更稳定的版本(常用于企业环境):
pip install pywinauto==0.6.8
✅ windows 7 及以上系统
❌ macos / linux 不支持(因依赖 win32 api)
✅ 支持 32 位和 64 位程序自动化
pywinauto 主要基于以下模块实现:
pywinauto 提供了两种“后端”机制,用于不同类型的 windows 程序:
| 后端类型 | 说明 | 适用场景 |
|---|---|---|
| win32 | 基于 win32 api,速度快 | 传统 win32 程序,如记事本、注册表编辑器 |
| uia | 基于微软 ui automation 框架 | 现代应用,如 office、edge、uwp 应用 |
在创建 application 对象时可以指定后端:
from pywinauto import application
app = application(backend='uia').start('notepad.exe')
from pywinauto import application
app = application(backend='uia').start('notepad.exe')
如果应用已启动,可以用 connect() 方法:
app = application(backend='uia').connect(title_re=".*记事本")
dlg = app.window(title_re=".*记事本")
dlg.wait('visible')
dlg.type_keys("hello, pywinauto!{enter}")
支持特殊按键,例如:
| 按键符号 | 含义 |
|---|---|
| {enter} | 回车 |
| {tab} | 切换焦点 |
| ^a | ctrl + a |
| ^c | ctrl + c |
| {backspace} | 退格 |
dlg.menu_select("文件->另存为")
menu_select 支持中文菜单和多级菜单选择,非常适合批量文件操作自动化。
dlg.child_window(title="帮助", control_type="menuitem").click_input()
child_window() 可根据控件属性(标题、类型、类名、自动化id等)查找指定组件。
dlg.print_control_identifiers()
输出示例:
control identifiers:
dialog - '无标题 - 记事本'
|
| edit - ''
| button - '帮助'
这能帮助你快速找到控件的唯一标识。
常见的控件定位方法包括:
dlg.edit.type_keys("hello world")
dlg.child_window(auto_id="15", control_type="edit").set_text("输入文字")
dlg.button.click_input() dlg.checkbox.check() dlg.radiobutton.select()
dlg.move_window(x=100, y=100, width=800, height=600, repaint=true)
from pywinauto import application
import time
app = application(backend='uia').start('notepad.exe')
dlg = app.window(title_re=".*记事本")
dlg.type_keys("hello, this is pywinauto test!", with_spaces=true)
dlg.menu_select("文件->另存为")
save_dlg = app.window(title_re="另存为")
save_dlg.child_window(auto_id="1001", control_type="edit").set_text("c:\\users\\public\\test.txt")
save_dlg.child_window(title="保存", control_type="button").click_input()
time.sleep(1)
dlg.close()
这一段脚本可实现:
启动记事本 → 输入内容 → 保存到指定路径 → 关闭。
from pywinauto import application
app = application(backend='uia').start(r'c:\program files\microsoft office\root\office16\excel.exe')
dlg = app.window(title_re=".*excel")
dlg.type_keys("hello world{enter}123{enter}456")
dlg.menu_select("文件->另存为")
save_dlg = app.window(title_re="另存为")
save_dlg.child_window(auto_id="1001", control_type="edit").set_text(r"c:\users\public\data.xlsx")
save_dlg.child_window(title="保存", control_type="button").click_input()
from pywinauto import application
import time
app = application(backend='win32').start(r'c:\path\to\your\app.exe')
dlg = app.window(title="登录窗口")
dlg.edit1.set_text("admin")
dlg.edit2.set_text("password123")
dlg.button1.click()
time.sleep(1)
assert dlg.child_window(title="欢迎", control_type="text").exists(), "登录失败"
这种写法常用于自动化测试场景,可结合 pytest 或 ci/cd 系统实现自动验证。
可以查看窗口树结构:
dlg.dump_tree()
或用 inspect.exe 工具(微软提供)分析控件属性,确定 title, auto_id, class_name 等参数。
dlg.set_focus() dlg.minimize() dlg.restore()
可调节打字速度:
dlg.type_keys("auto typing...", pause=0.05)
from pywinauto import timings timings.after_clickinput_wait = 1
在调试脚本时,加入延时可以避免界面未响应造成的异常。
在 backend='win32' 模式下,pywinauto 通过 windows 的 sendmessage、postmessage 等 api 向窗口发送命令。例如:
优点:速度快,兼容旧程序。
缺点:不支持现代 ui(uwp)。
uia 模式使用微软的 ui automation 框架,通过 com 接口访问控件属性。
其核心类包括:
该模式能访问复杂控件,如 office ribbon、edge 浏览器、vscode 等。
| 库名 | 主要用途 | 控制方式 | 优势 | 劣势 |
|---|---|---|---|---|
| pywinauto | windows gui 自动化 | 控件级 | 精准、可识别控件 | 仅支持 windows |
| pyautogui | 跨平台屏幕自动化 | 坐标级 | 跨平台 | 容易误点 |
| sikulix | 图像识别 | 视觉识别 | 可识别界面元素 | 依赖图像匹配 |
| autoit | windows 自动化 | 脚本语言 | 功能强大 | 非python |
| uiautomation | 纯 uia 控制 | com 接口 | 轻量 | 功能不如 pywinauto 丰富 |
在 windows 自动化测试与企业应用开发中,pywinauto 通常是首选。
pywinauto 内置智能等待系统:
dlg.wait('exists', timeout=10)
这样可在窗口加载时自动等待,避免找不到控件报错。
from pywinauto.findwindows import elementnotfounderror
try:
dlg.button.click()
except elementnotfounderror:
print("控件不存在,跳过!")
可以创建多个 application 实例控制多个程序:
notepad = application().start("notepad.exe")
calc = application().start("calc.exe")
下面展示一个综合应用案例:自动化打开文件夹内所有图片并截图保存。
import os, time
from pywinauto import application
folder = r"c:\users\public\pictures"
save_to = r"c:\users\public\screenshots"
app = application(backend='uia').start('mspaint.exe')
dlg = app.window(title_re="画图")
for file in os.listdir(folder):
if file.endswith('.jpg'):
dlg.menu_select("文件->打开")
open_dlg = app.window(title_re="打开")
open_dlg.edit.set_text(os.path.join(folder, file))
open_dlg.打开.click_input()
time.sleep(1)
dlg.menu_select("文件->另存为->jpeg 图片")
save_dlg = app.window(title_re="另存为")
save_dlg.edit.set_text(os.path.join(save_to, file))
save_dlg.保存.click_input()
time.sleep(1)
该脚本自动批量处理图片,展示了 pywinauto 的稳定操作能力。
windows uac 弹窗无法直接操作(需管理员权限)。
uwp 应用(如 microsoft store app)部分控件未公开接口。
不支持远程桌面环境下运行。
结合 keyboard / mouse:实现完整人机模拟。
结合 opencv:在找不到控件时,用图像匹配补充。
结合 pytest:搭建自动化 gui 测试框架。
结合日志分析:生成测试报告或性能分析。
pywinauto 是 python 在 windows 平台上最成熟的 gui 自动化库之一。
它不仅能精确操控界面元素,还能与测试框架、图像识别、ai 自动化工具结合使用。
它的核心优势在于:
在未来,随着桌面与云端结合、rpa(机器人流程自动化)普及,pywinauto 将成为 python 在 rpa 领域的关键组件之一。
到此这篇关于python pywinauto实现windows图形界面自动化控制详解的文章就介绍到这了,更多相关python pywinauto自动化操作图形界面内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论