全面讲解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 *

# 启动 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 包具有以下主要特点:

  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 *

# 启动 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 及以上版本依赖 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 仓库的 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 包可能进一步扩展功能,支持更多控件类型和应用程序。

参考文献

用户反馈

GitHub 仓库的 README 和相关博客文章被多个用户评为有帮助,反映了其内容的实用性。

结论

uiautomation 包通过封装 Microsoft UI Automation 框架,为 Windows 桌面应用程序的 UI 自动化提供了强大而简单的解决方案。其支持多种控件类型和操作方法,适用于自动化测试、无障碍技术和任务自动化。开发者可以通过 GitHub 仓库中的示例脚本和 Microsoft 文档深入学习,结合 Inspect.exe 等工具实现高效的 UI 自动化。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注