4. 测试程序拿到IAccessible接口,开始调用IAccessible接口函数操作测试目标。
IAccessible接口里面的几个关键函数是:
IAccessible::get_accChild/ IAccessible::get_accParent通过这两个函数,调用者可以浏览目标程序的窗口关系树,定位到UI元素。
IAccessible::accLocation/I Accessible::accHitTest读取和分辨目标元素的屏幕位置。
IAccessible::accName/ I Accessible:: accSelect读取元素的名字,对UI元素进行指定的操作,比如选取Listbox里面的某一项等等。
IAccessible::accValue 开发人员可以自定义value属性的实现。比如针对折线图控件,开发人员可以在accValue中返回折线的坐标数列。
MSAA的理念类似于test hook。 通过主动让UI程序暴露一个接口来让调用者控制。在具体使用中,测试人员往往是结合MSAA和Win32 API操作,取长补短。一方面对于UI元素丰富的属性,比如style,钩选状态,是否最大化和模拟用户输入等,继续采用Win32 API。另一方面用MSAA的优势来弥补Win32 API的一些不足,比如:
由于MSAA有自己的get_accChild方法,使其控件树关系并不一定要和Win32 HWNDd关系对应一致。对于自绘窗口,虽然说只有一个HWND,但是开发人员可以通过实现IAccessible接口来实现逻辑上的层次关系。比如Excel中就可以通过IAccessible把多个cell的子IAccessible接口暴露给调用者。
IAccessible的实现是由开发者提供,开发者可以灵活地根据实际情况决定方法的实现。比如前面提到了折线图控件可以返回坐标数列。对于.NET WinForm, 微软在Framework中就提供了IAccessible的默认实现,这样在具体实现中,就可以处理.NET动态维护HWND的细节等等。
针对MSAA的工具也有很多,比如AccExplorer(图二)可以像Spy++一样对指定程序进行控件的树形浏览,检查MSAA属性等。
图二: AccExplorer
如果您是开发人员, 对于unmanaged UI程序的MSAA实现,参考MSDN中关于WM_GETOBJECT的说明返回IAccessible interface就可以了。对于managed程序, 实现方法更简单, 现成的例子可以参考:
Control..::.ControlAccessibleObject Class
How to create accessible controls by using Visual Basic .NET or Visual Basic 2005
对于测试程序如何直接获取并使用IAccessible接口,并非本系列重点,所以并不提供更多介绍。在后面的文章中, 会介绍如何隐含使用IAccessible和MSAA。
MSAA也有自身的缺点:
1. 虽然说MSAA基于COM技术, 但IAccessible并不是一个COM标准接口。 比如使用者不需要调用CoInitialize即可使用,也无法通过QueryInterface进一步获取更多的自定义接口。这局限了MSAA所能提供的功能。
2. IAccessible接口的定义有缺陷。里面不少方法是可有可无的,但是又缺少一些支持UI自动化的关键方法。 比如它提供了accSelect支持控件的选取,但是却没有类似accExpand这样的方法支持树状控件的展开等。
关于MSAA和UI自动化的更多渊源,MSAA设计理念,现状和缺陷,可以参考微软早期的一篇名为What is UI Automation的文章。
UIAutomation和WPF
UIAutomation是微软从Windows Vista开始推出的一套全新UI自动化测试技术, 简称UIA。在最新的Windows SDK中,UIA和MSAA等其它支持UI自动化技术的组件放在一起发布,叫做Windows Automation API。
和前面的介绍相比,我倾向于认为UIA是一项自动化测试“技术”,而MSAA和Win32 API只是实现自动化测试的两种“方法”。这里区分“技术”和 “方法”的原因是, 一项“技术”往往有独立的模型,体贴的开发接口,用来专门解决某一类的问题,同时允许不同的实现细节。UIA可以被看作“技术”,是因为:
UIA定义了全新的、针对UI自动化的接口和模式。 分别是支持对UI元素进行遍历和条件化查询的TreeWalker/FindAll。定义了读写UI元素属性的UIA Property, 包括Name、 ID、Type、ClassName、Location、 Visibility等等。定义了UI元素行为的UIA Pattern, 比如Select、Expand、Resize、 Check、Value等等。 还引入了UIA Event接口,可以让测试程序在某些事件发生后得到通知,比如新窗口打开事件等。
以往的Win32和MSAA 设计出发点并不是为解决UI自动化。Win32旨在提供的通用开发接口, MSAA旨在提供程序的多种访问方式。相反,UIA的设计目的,以及新引入的模式和接口都完全是针对UI自动化测试的。
在后面的文章中我们会详细分析UIA的内部实现。可以看到,UIA这一套接口和模式,可以在不同平台,不同开发工具中实现和使用。其内部实现方式也因地制宜, 前后的兼容性都照顾得很好。 同时,UIA提供了托管的和非托管两种API,这些都是Win32和MSAA无法比拟的。
文章来源于领测软件测试网 https://www.ltesting.net/