pywinauto:用 Python 控制 Windows 桌面程序
最近看到 pywinauto 这个项目,GitHub 上 6000 多 Star,做的事很明确——用 Python 代码操作 Windows 桌面应用,模拟鼠标点击、键盘输入、获取界面文本。对于写自动化测试、处理重复操作的场景,这工具能省不少事。

主要做两件事
pywinauto 的核心功能分两块:一是模拟人的操作,比如点按钮、输入文字、选菜单;二是读取界面信息,比如获取弹窗里的文本、遍历控件列表。
底层支持两套 Windows 自动化技术。Win32 API 是默认后端,兼容性最好,适合传统 Win32 桌面程序。MS UI Automation(UIA)则能处理 WPF、WinForms 等现代框架开发的程序。两套方案基本覆盖了 Windows 上绝大部分桌面应用。
写脚本的代码很简洁。启动记事本,打开帮助菜单,在编辑区输入文字,不到十行代码:
from pywinauto.application import Application
app = Application().start("notepad.exe")
app.UntitledNotepad.menu_select("Help->About Notepad")
app.AboutNotepad.OK.click()
app.UntitledNotepad.Edit.type_keys("pywinauto Works!", with_spaces = True)
代码读起来很直观,方法名一看就知道在做什么。控件按标题自动匹配,大部分情况下不需要手动指定控件 ID。
对于资源管理器这种更复杂的程序,UIA 后端能提供更好的支持。先启动资源管理器打开指定目录,然后通过进程路径连接到已运行的窗口,再用控件类型和名称定位目标元素:
from pywinauto import Desktop, Application
Application().start('explorer.exe "C:\\Program Files"')
app = Application(backend="uia").connect(path="explorer.exe", title="Program Files")
app.ProgramFiles.set_focus()
common_files = app.ProgramFiles.ItemsView.get_item('Common Files')
common_files.right_click_input()
app.ContextMenu.Properties.invoke()
Properties = Desktop(backend='uia').Common_Files_Properties
Properties.print_control_identifiers()
Properties.Cancel.click()
Properties.wait_not('visible')

安装和兼容性
pip install pywinauto 或 conda install -c conda-forge pywinauto 都能装。Windows 上依赖 pyWin32 和 comtypes,Linux 下需要 python-xlib。目前主力支持 Windows,跨平台计划也在推进,Linux 支持已在开发中。
如果需要对控件做截图,装个 Pillow 库就能调用 capture_as_image() 方法。跑单元测试的话需要额外安装 coverage。
适用场景
Windows 桌面端自动化测试是最常见的用途。把测试流程写成脚本,每次发布前自动跑一遍,省去手工点击的重复劳动。数据录入也是常见场景,大批量填表单、导入导出数据,手工操作容易出错,脚本执行稳定得多。
还有一类用法是做辅助工具。比如监控某个窗口的状态变化,满足条件时自动触发操作。调试桌面应用时,也可以用 pywinauto 脚本快速定位控件、打印控件树。
项目不需要额外安装 Agent 程序,直接用 Python 控制目标窗口,对熟悉 Python 的人来说上手很快。代码基于 BSD 3-clause 协议开源,项目最初由 Mark Mc Mahon 创建,0.6.0 版本以后由社区持续维护。
团队也说了这是业余项目,新功能开发都在工作之余进行。所以遇到 Bug 或想要新功能,去提 issue 就好,给点耐心。
小结
Windows 平台上用 Python 做 GUI 自动化,选择空间不大。pywinauto 不花哨,但功能扎实,API 设计得清楚,文档也比较完整。有桌面自动化需求的可以试试,至少省了手工点鼠标的时间。
pywinauto 不花哨,但功能扎实,API 设计得清楚,文档也比较完整。有桌面自动化需求的可以试试,至少省了手工点鼠标的时间。

1997

被折叠的 条评论
为什么被折叠?



