全面讲解python的uiautomation包
Python uiautomation 包简介
- 关键要点:
uiautomation
是一个用于 Windows 桌面应用程序 UI 自动化的 Python 包,基于 Microsoft UI Automation 框架。- 它似乎支持多种 Windows 应用程序类型,如 MFC、Windows Form、WPF、Modern UI(Metro UI)、Qt 和部分浏览器(IE、Firefox、Chrome)。
- 研究表明,该包通过简单的 API 实现控件查找和操作,适用于自动化测试和无障碍技术。
- 安装简单,使用
pip install uiautomation
,但需注意 Python 版本兼容性(避免 3.7.6 和 3.8.1)。 - 在 Windows 7 或更高版本上运行时,可能需要管理员权限以确保正常操作。
什么是 uiautomation?
uiautomation
是一个 Python 包,允许开发者通过 Python 脚本控制 Windows 桌面应用程序的用户界面(UI)。它是对 Microsoft UI Automation 框架的封装,支持自动化测试、屏幕阅读器等无障碍技术以及其他需要程序化操作 UI 的场景。该包适用于 Python 3.4 及以上版本,支持 x86 和 x64 架构。
如何安装和使用?
要开始使用 uiautomation
,可以通过以下命令安装:
pip install uiautomation
安装后,包会在 C:\PythonXX\Scripts
目录下生成一个 automation.py
脚本,可用于从命令行遍历和操作 UI 控件。例如,运行 automation.py -h
查看帮助信息。
在 Python 脚本中,可以通过导入 uiautomation
包并使用其控件类(如 EditControl
、ButtonControl
)来查找和操作 UI 元素。例如:
from uiautomation import *
# 查找名称为 "myedit2" 的编辑框并输入文本
EditControl(searchDepth=3, Name='myedit2').SendKeys('hi')
主要功能
- 控件查找:通过属性(如名称、类型)查找 UI 控件。
- 控件操作:支持发送键盘事件、点击按钮、设置值等操作。
- 命令行工具:通过
automation.py
脚本可以快速遍历 UI 树或执行自动化任务。 - 广泛支持:支持多种 Windows 应用程序框架,适用于自动化测试和无障碍应用。
注意事项
- 权限要求:在 Windows 7 或更高版本上,需以管理员身份运行 Python 脚本,否则可能无法获取控件信息。
- 兼容性:避免使用 Python 3.7.6 和 3.8.1,因
comtypes
库可能存在问题。 - 局限性:仅支持实现了 UI Automation Provider 的应用程序,且仅限 Windows 平台。
更多详细信息可参考 GitHub 仓库 和 Microsoft UI Automation 文档。
全面讲解 Python uiautomation 包
引言
uiautomation
是一个功能强大的 Python 包,专为 Windows 桌面应用程序的 UI 自动化设计。它基于 Microsoft 的 UI Automation 框架,允许开发者通过 Python 脚本以编程方式控制和操作用户界面元素。该包广泛应用于自动化测试、无障碍技术(如屏幕阅读器)以及其他需要与 Windows 应用程序交互的场景。本报告基于可靠来源(如 PyPI、GitHub 和 Microsoft 文档)提供全面分析,涵盖定义、技术特点、工作原理、安装与配置、应用场景、优势与局限以及开发者资源。
from uiautomation import *
# 启动 Notepad
app = Application().start("notepad.exe")
# 查找 Notepad 的编辑框控件
edit_control = EditControl(searchDepth=3, ClassName='Edit')
# 向编辑框输入文本
edit_control.SendKeys('Hello, uiautomation!')
# 打开“格式”菜单并选择“字体”
menu = MenuControl(searchDepth=2, Name='格式')
menu.Click()
font_item = MenuItemControl(searchDepth=3, Name='字体...')
font_item.Click()
# 在字体对话框中选择字体和大小
font_dialog = WindowControl(searchDepth=1, Name='字体')
font_type = ComboBoxControl(searchDepth=2, Name='字体')
font_type.Select('Arial')
font_size = ComboBoxControl(searchDepth=2, Name='大小')
font_size.Select('12')
ok_button = ButtonControl(searchDepth=2, Name='确定')
ok_button.Click()
# 关闭 Notepad
app.Kill()
定义与背景
uiautomation
是一个 Python 3 包装器,基于 Microsoft 的 UI Automation 框架,最初由 yinkaisheng 开发并托管在 GitHub。Microsoft UI Automation 是 Windows 操作系统中的无障碍框架,旨在为屏幕阅读器等辅助技术提供 UI 信息,并支持通过脚本操作 UI 元素。uiautomation
包将这一框架的复杂功能封装为简单的 Python API,使开发者能够轻松实现自动化任务。
该包支持 Python 3.4 及以上版本,适用于 x86 和 x64 架构。研究表明,它在自动化测试、UI 交互和无障碍技术领域有广泛应用,尤其适用于需要操作复杂 Windows 应用程序(如 Notepad、计算器、Outlook)的场景。
技术特点
uiautomation
包具有以下主要特点:
- 多框架支持:支持多种 Windows UI 框架,包括 MFC、Windows Form、WPF、Modern UI(Metro UI)、Qt 以及部分浏览器(IE、Firefox、Chrome)。
- 简单 API:通过控件类(如
EditControl
、ButtonControl
)提供直观的接口,简化控件查找和操作。 - 命令行工具:提供
automation.py
脚本,用于快速遍历 UI 树或执行自动化任务。 - 灵活的控件查找:支持通过多种属性(如名称、类名、控件类型)查找控件,并可设置搜索深度和超时时间。
- 无障碍支持:与 Microsoft UI Automation 的无障碍功能无缝集成,适用于屏幕阅读器等应用。
- 依赖管理:2.0 及以上版本依赖
comtypes
和typing
(Python 3.5+ 内置),无需其他复杂依赖。
工作原理
uiautomation
包通过 Microsoft UI Automation 框架的 COM 接口(IUIAutomationElement
)与 Windows 应用程序交互。其工作流程包括以下步骤:
- 控件查找:通过控件属性(如
Name
、ClassName
、ControlType
)在 UI 树中搜索目标控件。如果未找到控件,包会在默认超时时间(10 秒)内抛出LookupError
异常。 - 控件操作:找到控件后,可调用其方法(如
Click
、SendKeys
、SetValue
)执行操作。 - UI 树遍历:通过
automation.py
脚本或Control.Element
属性遍历 UI 树,获取控件信息。 - COM 对象管理:控件操作通过底层的
IUIAutomationElement
COM 对象实现,确保高效性和兼容性。
控件类与方法
uiautomation
提供了多种控件类,每种控件类对应一种 UI 元素类型,常见类包括:
EditControl
:编辑框,支持SendKeys
、SetValue
等方法。ButtonControl
:按钮,支持Click
、Invoke
等方法。ListControl
:列表,支持Select
、GetItem
等方法。ComboBoxControl
:组合框,支持Select
、Expand
等方法。WindowControl
:窗口,支持Maximize
、Minimize
、Close
等方法。
控件查找支持多种属性,例如:
Name
:控件名称ClassName
:控件类名ControlType
:控件类型(如ButtonControl
、EditControl
)searchDepth
:搜索深度,控制在 UI 树中的搜索范围searchIntervalSeconds
:搜索间隔时间
示例代码
以下是一个更复杂的示例,展示如何自动化 Notepad 的字体设置和文本输入:
from uiautomation import *
# 启动 Notepad
app = Application().start("notepad.exe")
# 查找编辑框并输入文本
edit_control = EditControl(searchDepth=3, ClassName='Edit')
edit_control.SendKeys('Hello, uiautomation!')
# 打开“格式”菜单并选择“字体”
menu = MenuControl(searchDepth=2, Name='格式')
menu.Click()
font_item = MenuItemControl(searchDepth=3, Name='字体...')
font_item.Click()
# 在字体对话框中选择字体和大小
font_dialog = WindowControl(searchDepth=1, Name='字体')
font_type = ComboBoxControl(searchDepth=2, Name='字体')
font_type.Select('Arial')
font_size = ComboBoxControl(searchDepth=2, Name='大小')
font_size.Select('12')
ok_button = ButtonControl(searchDepth=2, Name='确定')
ok_button.Click()
# 关闭 Notepad
app.Kill()
安装与配置
安装
通过以下命令安装 uiautomation
:
pip install uiautomation
安装后,包会自动在 C:\PythonXX\Scripts
目录下生成 automation.py
脚本。
配置
- Python 版本:建议使用 Python 3.5 或更高版本,避免 3.7.6 和 3.8.1,因这些版本的
comtypes
库可能存在兼容性问题。 - 管理员权限:在 Windows 7 或更高版本上,需以管理员身份运行 Python 脚本。例如:
python -m uiautomation myscript.py
- 依赖:2.0 及以上版本依赖
comtypes
和typing
(Python 3.5+ 内置)。
命令行工具
安装后,可使用 automation.py
脚本执行以下操作:
- 查看帮助:
automation.py -h
- 列出所有控件:
automation.py -t 0 -n
- 录制和回放操作:
automation.py -r -d 1 -t 0
应用场景
uiautomation
包在以下场景中有广泛应用:
- 自动化测试:用于测试 Windows 桌面应用程序的 UI 功能,如验证按钮点击、输入框内容等。
- 无障碍技术:为屏幕阅读器等辅助技术提供 UI 信息,支持残障人士使用应用程序。
- 任务自动化:自动化重复性任务,如在 Notepad 中输入文本、更改字体或保存文件。
- 数据提取:从应用程序的 UI 中提取信息,如获取 Outlook 邮件列表或浏览器中的按钮属性。
示例场景
- 自动化 Notepad:如前述示例,自动打开 Notepad、输入文本、更改字体并保存。
- 自动化计算器:GitHub 仓库中的
automation_calculator.py
演示了如何操作 Windows 计算器应用程序。 - 自动化 Outlook:通过查找邮件列表控件提取邮件信息,或自动发送邮件。
优势与局限
优势
- 广泛兼容性:支持多种 Windows UI 框架,适用于大多数实现了 UI Automation Provider 的应用程序。
- 简单易用:API 设计直观,开发者无需深入了解底层 COM 接口即可实现自动化。
- 命令行支持:通过
automation.py
脚本快速调试和遍历 UI 控件。 - 开源免费:托管在 GitHub 上,允许开发者贡献代码和改进功能。
局限
- 仅限 Windows:仅支持 Windows 平台,不适用于 macOS 或 Linux。
- 依赖 UI Automation Provider:无法自动化未实现 UI Automation Provider 的应用程序(如某些自定义控件)。
- 权限要求:在 Windows 7 或更高版本上需管理员权限,可能增加使用复杂性。
- 文档有限:虽然 GitHub 提供了一些示例,但缺乏全面的官方文档,开发者可能需要参考 Microsoft UI Automation 文档。
开发者资源
以下是学习和使用 uiautomation
包的主要资源:
- GitHub 仓库:yinkaisheng/Python-UIAutomation-for-Windows
- 包含源代码、中文版 README(readme_cn.md)和示例脚本(如
automation_calculator.py
)。 - PyPI 页面:uiautomation
- 提供安装信息和版本历史。
- Microsoft UI Automation 文档:
- UI Automation Overview
- Control Pattern Mapping
- UI Automation Provider
- 工具:
- Inspect.exe:Microsoft 提供的工具,用于检查 UI 元素的属性(如名称、类名、控件类型)。
- UIAutomationClient:C++ 源代码,了解底层实现(GitHub)。
- 博客教程:UI Automation Walkthrough
- 提供 Notepad 自动化的示例,展示如何使用
uiautomation
包。
示例脚本
GitHub 仓库的 demos
文件夹包含多个示例脚本,例如:
automation_calculator.py
:演示如何自动化 Windows 计算器。- 其他脚本:展示如何操作不同类型的控件和应用程序。
控件查找与操作
控件查找是 uiautomation
包的核心功能。以下是常见查找方法和操作:
- 查找控件:
# 查找名称为 "myedit2" 的编辑框
edit = EditControl(searchDepth=3, Name='myedit2')
# 检查控件是否存在
if edit.Exists(maxSearchSeconds=5):
print("控件存在")
else:
print("控件未找到")
- 操作控件:
# 点击按钮
button = ButtonControl(searchDepth=2, Name='确定')
button.Click()
# 设置组合框值
combo = ComboBoxControl(searchDepth=2, Name='字体')
combo.Select('Arial')
使用 Inspect.exe
Inspect.exe 是 Microsoft 提供的工具,可用于查看 UI 元素的属性。运行 Inspect.exe 后,可以:
- 查看控件的
Name
、ClassName
、ControlType
等属性。 - 获取控件在 UI 树中的层级,用于设置
searchDepth
。 - 验证控件是否支持 UI Automation Provider。
高级用法
- TreeWalker:用于遍历 UI 树,获取父控件或子控件信息。例如,在 Outlook 中获取邮件列表的父控件。
- 属性获取:通过
GetName
、GetClassName
、GetControlType
等方法获取控件属性。 - 超时与重试:使用
Control.Exists(maxSearchSeconds, searchIntervalSeconds)
检查控件是否存在,避免抛出异常。 - Metro 应用:在 Windows 8/8.1 上,Metro 应用需处于前台,否则无法获取控件信息。
开发注意事项
- Python 版本:避免使用 Python 3.7.6 和 3.8.1,建议使用 3.5、3.6 或 3.9 及以上版本。
- 管理员权限:在 Windows 7 或更高版本上,以管理员身份运行 Python:
runas /user:Administrator "python myscript.py"
- 调试工具:使用
automation.py -t 0 -n
列出所有控件,结合 Inspect.exe 确定控件属性。 - Metro 应用限制:在 Windows 8/8.1 上,需确保目标应用处于前台。
与其他库的比较
uiautomation
包与其他 UI 自动化库(如 Pywinauto、PyAutoGUI)相比有以下特点:
- Pywinauto:支持基于文本属性的 Windows UI 自动化,提供更广泛的鼠标和键盘操作,但 API 较复杂。
- PyAutoGUI:跨平台,支持鼠标和键盘模拟,但基于屏幕坐标,缺乏控件级别的精确操作。
- uiautomation:专注于 Microsoft UI Automation 框架,适合需要精确控件操作的场景,但仅限 Windows。
发展前景
研究表明,uiautomation
包在自动化测试和无障碍技术领域具有重要应用。随着 Windows 应用程序的复杂性增加,该包的高兼容性和简单 API 使其成为开发者的重要工具。未来,随着 Microsoft UI Automation 框架的更新,uiautomation
包可能进一步扩展功能,支持更多控件类型和应用程序。
参考文献
- uiautomation on PyPI
- GitHub Repository
- Microsoft UI Automation Overview
- UI Automation Walkthrough
- Stack Overflow: Get attributes from UI element
用户反馈
GitHub 仓库的 README 和相关博客文章被多个用户评为有帮助,反映了其内容的实用性。
结论
uiautomation
包通过封装 Microsoft UI Automation 框架,为 Windows 桌面应用程序的 UI 自动化提供了强大而简单的解决方案。其支持多种控件类型和操作方法,适用于自动化测试、无障碍技术和任务自动化。开发者可以通过 GitHub 仓库中的示例脚本和 Microsoft 文档深入学习,结合 Inspect.exe 等工具实现高效的 UI 自动化。