GUI: 用户图形接口。
1. Windows API
FindWindow, EnumWindows可用于查找到窗口句柄。
GetWindowText, GetWindowRect, GetWindowLong可用于获取窗口属性。
SetWindowText, GetWindowText可用于操作控件上显示的文字。
SetForegroundWindow用于设置顶层窗口。
GetForegroundWindow用于获取当前的顶层窗口。
GetActiveWindow
SetActiveWindow
...
优点:对标准Windows的控件支持还不错,较底层。
缺点:底层意味着复杂,需要多层的封装,开发效率低下,对Windows API的完全依赖。对非标准(自定义)控件,较难实现自动化,就算实现了代码不稳定,维护和分析结果的成本也很高。
2. MSAA——Microsoft Active Accessibility
IAccessible,本身是一个Com组件,最主要的是其接口提供的方法可以获取控件更详细的信息,也可以通过一些方法对控件进行简单的操作。
优点:用户只需跟IAccessible打交道,通过这个接口能获得的控件信息相对丰富,基本操作也不需要通过Windows Message的方式来实现。另外一个较大优点是自定义控件的支持。开发自定义控件时可以实现IAccessible的接口,并且通过这个接口,把一些属性的操作暴露出来,测试人员就可以将这个控件当做标准控件,并用MSAA来自动化。
缺点:并非为自动化测试设计,获取到的控件信息比Windows API多,但仍对自动化测试不够,仅支持一个基本操作,其它的仍需Windows Message。
3. UIAutomation
从架构上说UIA针对标准控件时通过UI Automation Proxy调用了MSAA Server,基本覆盖了MSAA功能。
UI Spy是UIA的一个小工具。
与MSAA比较:
1)Tree.broken Exception,维护成本提高
2)只能用.Net语言来写,运行在.Net托管堆中->性能差异
3)MSAA支持进程内操作
UIA未定义支持,使用可能有性能问题
4)自定义控件支持好
4. Window Automation API 3.0
是对UIA和MSAA的升级。
Windows 7对自动化测试的支持将会更好。可用Managed Code和Unmanaged Code,基本解决上面UIA的问题。
Managed Code(托管代码) vs Unmanaged Code(非托管代码):
在公共语言运行库环境的外部,由操作系统直接执行的代码称为非托管代码,它必须提供自己的垃圾回收、类型检查、安全支持等服务,它与托管代码不同,后者从公共语言运行库中获得这些服务,而非托管代码是在运行库之外运行的代码。例如Com组件、Active X接口、和Win32 API这些都是非托管代码的示例。
自动化测试的实质是为了快速、高效地发现和预防回归缺陷,并非发现新缺陷(Test Monkey除外)。旨在解决成本问题。
UIAutomation无法产生鼠标、键盘事件->可用Win API
UI Spy使用:
焦点跟踪、悬停,注意run as Admin,可获得以下内容:
1)UI项和UI自动化属性值
2)控件模式实现
3)UI自动化事件信息
4)导航和键盘焦点
注意IE 8以上版本IE打开会有两个进程,大的为主进程,用于正在浏览的网页,小的是辅助进程,用于网页错误时恢复并reopen。
从UI 测试自动化的角度来看,意味着所测试的应用程序被称为服务器,测试工具被视为客户端。
UIAutomationClient.dll库实际上就是UI自动化客户端使用的测试自动化库。
UIAutomationTypes.dll库包含UIAutomationClient.dll和其它自动化服务器库使用的各种类型的定义。
UIAutomationClientSideProvider.dll包含一组与构建时不支持自动化的控件配件配合使用的代码,这些控件可能包括旧式控件和自定义的.NET控件。
UIAutomationProvider.dll库是一组接口定义,可供创建自定义UI控件和希望控件被UI自动化库访问的开发人员使用。
TreeScope是个枚举类型:
Element, Children, Descendants, Parent, Ancestors, Subtree(包含搜索的根和全部子代)
System.Windows.Automation.AndCondition代表一个与条件
System.Windows.Automation.NotCondition
System.Windows.Automation.OrCondition
System.Windows.Automation.PropertyCondition测试属性是否具有指定的值