一、引言:为什么要学习 pywinauto
在 windows 桌面应用开发与测试中,我们经常需要 自动化地操作图形界面 —— 例如:
- 自动点击按钮、输入文本;
- 批量处理文件;
- 自动测试 gui 程序;
- 操作 excel、记事本、qq、微信等桌面软件。
这类任务如果用传统方式,需要借助鼠标键盘模拟库(如 pyautogui)或低层 windows api,非常繁琐。而 pywinauto 作为一款专门面向 windows gui 自动化的 python 库,可以像人一样“看懂”界面结构,精准控制窗口、按钮、菜单、文本框等控件。
它的最大特点是:
“能识别控件,而不是盲目点坐标。”
这意味着,它能像自动化测试框架一样理解界面语义,进行稳定的自动化操作,而不依赖屏幕分辨率或窗口位置。
二、pywinauto 简介与安装
1. 安装方式
pywinauto 可以直接通过 pip 安装:
pip install pywinauto
如需更稳定的版本(常用于企业环境):
pip install pywinauto==0.6.8
2. 支持平台
✅ windows 7 及以上系统
❌ macos / linux 不支持(因依赖 win32 api)
✅ 支持 32 位和 64 位程序自动化
3. 主要依赖
pywinauto 主要基于以下模块实现:
- win32api, win32gui, ctypes:与系统交互;
- uiautomationcore.dll:用于获取界面元素;
- comtypes:com 接口支持。
三、核心原理与体系结构
pywinauto 提供了两种“后端”机制,用于不同类型的 windows 程序:
| 后端类型 | 说明 | 适用场景 |
|---|---|---|
| win32 | 基于 win32 api,速度快 | 传统 win32 程序,如记事本、注册表编辑器 |
| uia | 基于微软 ui automation 框架 | 现代应用,如 office、edge、uwp 应用 |
在创建 application 对象时可以指定后端:
from pywinauto import application
app = application(backend='uia').start('notepad.exe')
四、入门实战:控制记事本
1. 启动应用
from pywinauto import application
app = application(backend='uia').start('notepad.exe')
2. 连接已运行的应用
如果应用已启动,可以用 connect() 方法:
app = application(backend='uia').connect(title_re=".*记事本")
3. 获取主窗口
dlg = app.window(title_re=".*记事本")
dlg.wait('visible')
五、基本操作:输入、点击、菜单选择
1. 输入文本
dlg.type_keys("hello, pywinauto!{enter}")
支持特殊按键,例如:
| 按键符号 | 含义 |
|---|---|
| {enter} | 回车 |
| {tab} | 切换焦点 |
| ^a | ctrl + a |
| ^c | ctrl + c |
| {backspace} | 退格 |
2. 菜单操作
dlg.menu_select("文件->另存为")
menu_select 支持中文菜单和多级菜单选择,非常适合批量文件操作自动化。
3. 控件识别与点击
dlg.child_window(title="帮助", control_type="menuitem").click_input()
child_window() 可根据控件属性(标题、类型、类名、自动化id等)查找指定组件。
六、高级用法:窗口与控件操作
1. 获取窗口所有控件
dlg.print_control_identifiers()
输出示例:
control identifiers:
dialog - '无标题 - 记事本'
|
| edit - ''
| button - '帮助'
这能帮助你快速找到控件的唯一标识。
2. 选择控件方式
常见的控件定位方法包括:
dlg.edit.type_keys("hello world")
dlg.child_window(auto_id="15", control_type="edit").set_text("输入文字")
3. 点击按钮 / 勾选复选框
dlg.button.click_input() dlg.checkbox.check() dlg.radiobutton.select()
4. 拖动窗口
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()
这一段脚本可实现:
启动记事本 → 输入内容 → 保存到指定路径 → 关闭。
案例二:自动化 excel 操作
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()
案例三:自动化 gui 测试(验证按钮响应)
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 系统实现自动验证。
八、进阶技巧与调试方法
1. 捕获控件属性
可以查看窗口树结构:
dlg.dump_tree()
或用 inspect.exe 工具(微软提供)分析控件属性,确定 title, auto_id, class_name 等参数。
2. 控制隐藏窗口或后台窗口
dlg.set_focus() dlg.minimize() dlg.restore()
3. 输入速度控制
可调节打字速度:
dlg.type_keys("auto typing...", pause=0.05)
4. 日志调试模式
from pywinauto import timings timings.after_clickinput_wait = 1
在调试脚本时,加入延时可以避免界面未响应造成的异常。
九、内部原理剖析
1. win32 后端机制
在 backend='win32' 模式下,pywinauto 通过 windows 的 sendmessage、postmessage 等 api 向窗口发送命令。例如:
- wm_settext → 设置文本;
- wm_command → 模拟点击按钮;
- wm_keydown / wm_keyup → 模拟键盘输入。
优点:速度快,兼容旧程序。
缺点:不支持现代 ui(uwp)。
2. uia 后端机制
uia 模式使用微软的 ui automation 框架,通过 com 接口访问控件属性。
其核心类包括:
- uiawrapper
- uiaelementinfo
- iuiautomationelement
该模式能访问复杂控件,如 office ribbon、edge 浏览器、vscode 等。
十、pywinauto 与其他自动化库对比
| 库名 | 主要用途 | 控制方式 | 优势 | 劣势 |
|---|---|---|---|---|
| pywinauto | windows gui 自动化 | 控件级 | 精准、可识别控件 | 仅支持 windows |
| pyautogui | 跨平台屏幕自动化 | 坐标级 | 跨平台 | 容易误点 |
| sikulix | 图像识别 | 视觉识别 | 可识别界面元素 | 依赖图像匹配 |
| autoit | windows 自动化 | 脚本语言 | 功能强大 | 非python |
| uiautomation | 纯 uia 控制 | com 接口 | 轻量 | 功能不如 pywinauto 丰富 |
在 windows 自动化测试与企业应用开发中,pywinauto 通常是首选。
十一、性能与稳定性优化
1. 延迟等待机制
pywinauto 内置智能等待系统:
dlg.wait('exists', timeout=10)
这样可在窗口加载时自动等待,避免找不到控件报错。
2. 异常处理建议
from pywinauto.findwindows import elementnotfounderror
try:
dlg.button.click()
except elementnotfounderror:
print("控件不存在,跳过!")
3. 多线程与多窗口并行
可以创建多个 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 自动化工具结合使用。
它的核心优势在于:
- 直接识别控件结构,稳定可靠;
- 支持现代 ui 框架(uia);
- 拥有丰富的调试与等待机制;
- 完全开源、企业可用。
在未来,随着桌面与云端结合、rpa(机器人流程自动化)普及,pywinauto 将成为 python 在 rpa 领域的关键组件之一。
到此这篇关于python pywinauto实现windows图形界面自动化控制详解的文章就介绍到这了,更多相关python pywinauto自动化操作图形界面内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论