在 Windows 中有多种自动化用户界面的方法,可以通过 Python 访问(使用 ctypes 或一些 Python 窗口绑定):
原始窗口 API——Get/SetCursorPos 用于鼠标,HWND API,如 GetFocus 和 GetForegroundWindow
AutoIt -- 一种自动化脚本语言:Calling AutoIt Functions in Python
Microsoft Active Accessibility (MSAA) / WinEvent -- 通过 Win95 中的辅助功能 API 询问 UI 的 API。
UI/Automation (UIA) -- Vista 中引入的 MSAA 的替代品(适用于 XP SP3 IIRC)。
自动化用户界面以对其进行测试是一项艰巨的任务。有很多陷阱会让你大吃一惊。
我建议以自动化方式测试您的自动化框架,以便您可以验证它是否在您正在测试的平台上工作(以识别自动化中的故障API 与应用程序中的故障)。
另一个考虑是如何处理本地化。另请注意,Minimize/Maximize/... 的名称也是本地化的,并且可以使用与应用程序不同的语言(系统与用户区域设置)!
在伪代码中,用于最小化应用程序的 MSAA 程序看起来像:
window = AccessibleObjectFromWindow(FindWindow("My Window"))
titlebar = [x for x in window.AccessibleChildren if x.accRole == TitleBar]
minimize = [x for x in titlebar[0].AccessibleChildren if x.Name == "Minimize"]
if len(minimize) != 0: # may already be minimized
mimimize[0].accDoDefaultAction()
MSAA 可访问项目存储为 (object: IAccessible, childId: int) 对。此处需要注意正确调用(例如get_accChildCount 仅使用IAccessible,因此当childId 不为0 时,您必须返回0 而不是调用get_accChildCount)!
IAccessible 调用可以返回不同的错误代码来指示"this object does not support this property"——例如DISP_E_MEMBERNOTFOUND 或 E_NOTIMPL。
注意窗口的状态。如果窗口最大化然后最小化,restore 会将窗口恢复到最大化状态,因此您需要再次恢复它以使其恢复到正常/窗口状态。
MSAA 和UIA API 不支持鼠标右键单击,因此您需要使用Win32 API 来触发它。
MSAA 模型不支持树视图层次结构信息——它将其显示为平面列表。另一方面,UIA 只会枚举可见的元素,因此您将无法访问 UIA 树中折叠的元素。