> 技术文档 > 全面讲解python的uiautomation包

全面讲解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 包并使用其控件类(如 EditControlButtonControl)来查找和操作 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 *# 启动 Notepadapp = 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()# 关闭 Notepadapp.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 包具有以下主要特点:

  1. 多框架支持:支持多种 Windows UI 框架,包括 MFC、Windows Form、WPF、Modern UI(Metro UI)、Qt 以及部分浏览器(IE、Firefox、Chrome)。
  2. 简单 API:通过控件类(如 EditControlButtonControl)提供直观的接口,简化控件查找和操作。
  3. 命令行工具:提供 automation.py 脚本,用于快速遍历 UI 树或执行自动化任务。
  4. 灵活的控件查找:支持通过多种属性(如名称、类名、控件类型)查找控件,并可设置搜索深度和超时时间。
  5. 无障碍支持:与 Microsoft UI Automation 的无障碍功能无缝集成,适用于屏幕阅读器等应用。
  6. 依赖管理:2.0 及以上版本依赖 comtypestyping(Python 3.5+ 内置),无需其他复杂依赖。
工作原理

uiautomation 包通过 Microsoft UI Automation 框架的 COM 接口(IUIAutomationElement)与 Windows 应用程序交互。其工作流程包括以下步骤:

  1. 控件查找:通过控件属性(如 NameClassNameControlType)在 UI 树中搜索目标控件。如果未找到控件,包会在默认超时时间(10 秒)内抛出 LookupError 异常。
  2. 控件操作:找到控件后,可调用其方法(如 ClickSendKeysSetValue)执行操作。
  3. UI 树遍历:通过 automation.py 脚本或 Control.Element 属性遍历 UI 树,获取控件信息。
  4. COM 对象管理:控件操作通过底层的 IUIAutomationElement COM 对象实现,确保高效性和兼容性。
控件类与方法

uiautomation 提供了多种控件类,每种控件类对应一种 UI 元素类型,常见类包括:

  • EditControl:编辑框,支持 SendKeysSetValue 等方法。
  • ButtonControl:按钮,支持 ClickInvoke 等方法。
  • ListControl:列表,支持 SelectGetItem 等方法。
  • ComboBoxControl:组合框,支持 SelectExpand 等方法。
  • WindowControl:窗口,支持 MaximizeMinimizeClose 等方法。

控件查找支持多种属性,例如:

  • Name:控件名称
  • ClassName:控件类名
  • ControlType:控件类型(如 ButtonControlEditControl
  • searchDepth:搜索深度,控制在 UI 树中的搜索范围
  • searchIntervalSeconds:搜索间隔时间
示例代码

以下是一个更复杂的示例,展示如何自动化 Notepad 的字体设置和文本输入:

from uiautomation import *# 启动 Notepadapp = 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()# 关闭 Notepadapp.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 及以上版本依赖 comtypestyping(Python 3.5+ 内置)。
命令行工具

安装后,可使用 automation.py 脚本执行以下操作:

  • 查看帮助:automation.py -h
  • 列出所有控件:automation.py -t 0 -n
  • 录制和回放操作:automation.py -r -d 1 -t 0
应用场景

uiautomation 包在以下场景中有广泛应用:

  1. 自动化测试:用于测试 Windows 桌面应用程序的 UI 功能,如验证按钮点击、输入框内容等。
  2. 无障碍技术:为屏幕阅读器等辅助技术提供 UI 信息,支持残障人士使用应用程序。
  3. 任务自动化:自动化重复性任务,如在 Notepad 中输入文本、更改字体或保存文件。
  4. 数据提取:从应用程序的 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 后,可以:

  • 查看控件的 NameClassNameControlType 等属性。
  • 获取控件在 UI 树中的层级,用于设置 searchDepth
  • 验证控件是否支持 UI Automation Provider。
高级用法
  • TreeWalker:用于遍历 UI 树,获取父控件或子控件信息。例如,在 Outlook 中获取邮件列表的父控件。
  • 属性获取:通过 GetNameGetClassNameGetControlType 等方法获取控件属性。
  • 超时与重试:使用 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 自动化。