驱动或自动化 GUI 应用程序
通过 GUI 驱动或控制应用程序的 GUI 自动化
引言
有时你想要或需要控制(或自动化使用)一个应用程序,但该应用程序没有提供自动化 API(命令行接口或 CLI、COM 组件、.NET API DLL、Web 服务等),那你该怎么办?你只能依赖(图形化)用户界面(GUI)自动化。当然,如果是基于命令行的应用程序,那就是 CLI 自动化。本文仅涵盖 GUI 自动化。对于 CLI 自动化,最好的方法是多次调用命令行应用程序并每次传递必要的参数,或者通过重定向输入和输出(通常是文件)来进行自动化。
GUI 自动化有许多解决方案,并且 GUI 自动化可能很复杂,具体取决于你的需求。GUI 自动化也分为两个类别:GUI/UI 测试,以及驱动或控制 GUI/UI 应用程序。通常,在我们谈论 GUI 自动化时,至少在测试/QA 领域,指的是前者,这可能很棘手,因为最难的部分是验证给定 GUI 组件的状态。但我相信商业 QA GUI 测试工具使得验证这些组件不像看起来那么困难(尽管仍然很繁琐)。然而,本文指的是后者的定义。在驱动应用程序方面,自动化或驱动 GUI 要容易得多。我们通常不关心给定 GUI 组件的状态,因为我们不是在“测试”它。通过在驱动或自动化应用程序的代码中验证 GUI 状态(以便它能按我们意愿执行),或者让驱动 GUI 应用程序的外部应用程序/脚本进行验证,来确保应用程序已被驱动到适当的状态(以便它将执行我们想要的操作)。
本文介绍了几种驱动 GUI 应用程序的技巧或方法
注意:如上所述,虽然有多种驱动应用程序的方法,但你可能需要根据应用程序的设计来使用多种方法才能正确驱动应用程序。请阅读每种方法的详细信息以获得更清晰的认识。
本文最后提供了一些关于自动化 GUI 组件(通过其控件 ID)的技巧,提出了一些创建 GUI 自动化接口的想法,并提到了一些可以用来驱动 GUI 应用程序的免费 GUI 自动化工具。
检测和设置活动窗口
要正确驱动或自动化应用程序,首先必须确保要自动化的窗口或对话框是活动的,如果不是,则使其活动。一旦激活,你就可以开始自动化。如果你无法激活或找到活动窗口,那么你可能就无能为力了,或者你的自动化将不得不假设应用程序在自动化运行时是活动的。请参阅你选择的 GUI 自动化解决方案以获取确切的 API 调用。但通常它会像以下伪 API 方法一样
WindowActivate("Window name",other parameters)
WaitForActiveWindow("Window name to wait until active",timeout period, other parameters)
“等待活动窗口”方法可用于验证某个窗口是否由于驱动应用程序的特定操作(如打开“文件打开/保存”对话框或显示弹出消息框)而出现。
使用键盘快捷键和导航
尽可能使用键盘快捷键,因为它能极大地简化应用程序的驱动。我所说的键盘快捷键是指诸如 *Alt+F*、*Ctrl+O*、*Shift+A*、*Ctrl+Shift+S*、*F1*、*Alt+Tab*、*Ctrl+S* 等。用于导航和数据输入的其他键也可以使用,如 *Enter*/*Return*、*Tab*、*Shift+Tab*、*Page Up*/*Down*、*Up*/*Down*/*Left*/*Right* 以及字母数字键。但是,不要过度使用诸如制表和在表单字段中导航、输入文本等导航和数据输入键。虽然这是可能的,但它会导致代码质量低下且难以理解(例如,需要多少个 Tab 才能到达字段 C,或者需要多少个 Shift+Tab 才能回到字段 A?)。因此,在本节的结论是,主要使用键盘来执行键盘快捷键,而对于基于键盘的导航和文本输入,仅在绝对必要时使用(当其他自动化方法无效时)。
请参阅你选择的 GUI 自动化解决方案以获取确切的 API 调用。但通常,它会是 Microsoft Windows SendKeys 命令的某个版本。
获取和设置 GUI 组件的值
如果可能,这是首选的自动化方法。要使用此方法,你需要使用一个 GUI 组件/控件监视工具,该工具可以告诉你关于每个 GUI 组件的详细信息,例如其控件标识符(控件 ID)、名称、类、实例等。你主要关注控件 ID。根据我的经验,我发现使用控件 ID 可以轻松地自动化控件。但尝试仅使用类名或其他控件参数时,它通常不起作用。
要确定控件可以被自动化,你需要验证你希望控制的特定 GUI 组件是否具有控件 ID,并且该 ID 是静态的,在每次运行应用程序时都不会改变。因此,你需要通过监视控件的 ID 来验证这一点,然后关闭应用程序并重复(通过重新打开应用程序再次监视)。验证 ID 是否不会改变。你可能还希望做其他事情,例如反复打开“文件打开/保存”对话框或弹出消息框,并验证目标控件的 ID 不会改变,或者重新启动操作系统并重复监视过程以验证 ID 不会改变。如果 ID 不变,你可以继续使用此方法。如果 ID 改变,你将需要使用其他自动化方法来驱动应用程序。
一旦你获得了控件 ID 并知道它们不会改变,读取控件的值或设置其值就只是使用适当的自动化 API 方法的问题。请参阅你选择的 GUI 自动化解决方案以获取确切的 API 调用。有关使用此自动化方法的更多信息,请参阅 自动化 GUI 组件的技巧 部分。使用你喜欢的任何 GUI 自动化解决方案,但对于 GUI 监视工具,我推荐并偏爱 RanorexSpy。
使用相对屏幕坐标和鼠标事件
有时,使用鼠标是最佳选择,尽管最好避免在自动化中使用鼠标。这适用于没有替代键盘快捷键,或者键盘导航替代方案需要更多导航步骤,并且 GUI 组件没有控件 ID 或 ID 不是静态的(总是变化)的情况。Counterpath 的 eyeBeam 和 X-Lite 软电话是这种困境的一个很好的例子,因为 GUI 监视工具无法检测到大多数 GUI 控件,如拨号盘、闪断按钮、录音按钮等。更糟糕的是,键盘快捷键命令并不包含闪断和呼叫录制功能的使用。因此,对于这些功能,你将不得不使用鼠标事件,因为你无法检测到控件,也无法轻松地通过键盘导航到它。
要最大限度地利用鼠标驱动应用程序,请使用相对坐标,或者更具体地说,“相对于活动窗口的坐标”。使用此方法,活动窗口的位置在哪里无关紧要,屏幕分辨率也无关紧要。取决于你选择的 GUI 自动化解决方案,该解决方案可能默认使用相对坐标,或者你可能需要专门设置或指定使用相对坐标。
那么,如何确定相对坐标进行自动化呢?通过使用图像编辑器。通常,任何好的图像编辑器都可以,但我偏爱使用免费的 Paint.NET。首先,确保屏幕上聚焦的是活动窗口,然后截取屏幕截图(Print Screen 或更好的 Alt + Print Screen)。然后将截图粘贴到你选择的图像编辑器中。如果你截取的是整个桌面而不是仅活动窗口的截图,你需要裁剪出活动窗口。接下来,将鼠标移动到感兴趣的 GUI 组件或区域。你的图像编辑器应该有一个部分/区域或工具(通常在状态栏中)告诉你鼠标相对于当前编辑图像的坐标。记下感兴趣的坐标。最后,使用你选择的 GUI 自动化解决方案,在活动窗口上使用给定坐标调用鼠标单击或鼠标按下事件。请参阅你选择的 GUI 自动化解决方案以获取确切的 API 调用。
自动化 GUI 组件的技巧
我会根据我更多的评论来更新此部分。我自己并没有做太多(驱动)GUI 自动化,所以没有遇到通过获取/设置控件 ID 来(驱动)GUI 自动化的所有可能陷阱。通常,文本字段是最容易处理的,可能还有单选按钮、复选框和按钮。以下控件处理起来有点棘手
选择框或下拉菜单
根据我的经验,要让此控件正常工作,你首先需要单击该控件或执行“显示下拉列表”命令以显示下拉列表。然后,你可以使用列表选择命令来选择适当的值。之后,你可能需要再次单击鼠标或执行“隐藏下拉列表”命令来完成选择。如果不执行此过程,似乎无法设置控件的值。使用 GUI 监视工具,你会看到下拉菜单的控件 ID 是你在下拉列表未显示时看到的 ID。当下拉列表可见时,完整的下拉列表有一个不同的控件 ID。你应该使用列表未显示或已下拉时的控件 ID。
多选列表框?目前不确定。
可展开的显示/隐藏树菜单结构?目前不确定。
文件/文件夹浏览树结构?目前不确定。
弹出菜单?目前不确定。
等等。欢迎你提供你的经验,以便我更新这一部分。
GUI 自动化接口
除了固定的或单次使用的自动化场景,你还需要为驱动应用程序的 GUI 自动化提供一个接口,因为本质上它是一个你开发的新“工具”,而不是一个 QA 测试脚本。你可以有几种选择
- 用命令行接口(CLI)封装自动化
- 用 COM 组件接口封装自动化
- 用 API DLL 库接口封装自动化,例如用于 .NET
- 用 Web 服务接口封装自动化
我通常更喜欢将自动化封装在 CLI 中,因为你可以从任何脚本或另一个应用程序调用 CLI,并且它是跨平台的(你可以通过 SSH、Telnet 等在网络上调用 CLI)。其他选项可能更适合,具体取决于你的需求和选择的平台。
资源:一些 GUI 自动化工具
以下是你可用于驱动或自动化 GUI 应用程序的工具
- AutoIt - 免费且非常好的 GUI 自动化解决方案,拥有自己的监视工具、自定义脚本语言和编译器(可将脚本编译成可执行文件)。通过 COM 组件也支持 C++、VB 和 VBScript。
- Ranorex - 基于 .NET 的 GUI 自动化解决方案。个人使用免费。商业使用需要购买许可证。完整套件附带监视工具和脚本录制/生成实用程序。支持 C++(基于 .NET)、C# 和 Python。可能也支持 VB.NET。效果非常好,如果完全免费就好了。其监视工具可独立使用,并且免费用于所有用途。
- Perl Win32::GuiTest 模块 - Perl 的免费 GUI 自动化解决方案。效果很好,但不如 AutoIt 或 Ranorex 功能齐全。对于“真正的”GUI 自动化,此工具可能有效也可能无效,因为一些功能缺失或支持不佳。
- RanorexSpy - 用于自动化用途的免费且非常好的 GUI 监视工具。
- WinSpy++ - 另一款用于自动化用途的免费 GUI 监视工具。
- Paint.NET - 我用来获取鼠标相对坐标进行自动化的优秀免费图像编辑器。
- 还有不少其他的 GUI 自动化解决方案和工具,但这里提到的工具我都尝试过,并且是其中一些最好的。
历史
- 2007 年 12 月 30 日 - 初始发布