var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2007年11月08日

    Windows界面自动化解决方案

    分类:

    目前自动化测试工具主要是界面自动化工具(当然,性能和单元测试工具也能归类为自动化测试工具,但这里暂不考虑它们)。

     

    Unix/Linux下有界面的软件相当少,另外其下的界面开发一般基于GTK+,完全异于Windows下。所以,通常大家讨论的界面自动化开发是Windows下的应用程序。但Unix/Linux下也有些GUI自动化测试工具,比如运行在X11(Mac OS X)环境下的GNU Xnee,运行在Unix/Linux下支持GNOMEGNU/Linux Desktop Testing Project (GNU/LDTP)等等。

     

    从零开始开发界面自动化工具可以如下走:

    1.     实现*SPY*程序以得到窗口句柄。采用Hook技术,截取键盘信息、鼠标信息、事件信息来得到窗口的HWnd,进而得到ControlsProperties等等,一般测试软件的“Record-Reply”机制必须要用到这项技术。见SPY工具

    2.     用得到的窗口句柄,采用Win32函数FindWindow/FindWindowEx来一级级的识别窗口,或EnumWindows/EnumChildWindows枚举窗口再用GetClassNameGetWindowText分别获取窗口类名、窗口标题栏,以上函数都定义在user32.dll中,Win32优点在于更快和更可靠(MSAAUI Automation对某些窗口元素不能应用,MSAA没用SendMessageTimeout)。如使用EnumChildWindows检查checkbox选中IE地址栏自动输入等。见Web自动化(1)(2)(3)Ajax网页

    3.     等待界面出现的过程中,加入同步机制,直到界面元素Clickable

    使界面元素Clickable的途径:

    l  移动窗口

    l  设置焦点

    l  扩展原型

    l  滚动

          同步方式:

    l  Sleep(millisecond)

    l  设置一个TimeOut的最大值,在值范围内,不断探测直到出现

    4.     采用MS提供的已封装好的MSAA库(通用于Windows Vista之前的OS但不包括Win98)或者Windows UI Automation(支持Windows Vista及以后),此库已集成在最新的VS 2008中的WPF里面。利用这些已经封装好的库能对所有标准的Windows控件进行自动化识别。但对非标准控件支持不好,比如腾讯公司的QQ系列。

    5.     采用W3C制定的DOM标准,操控Web页面。由于DOM标准已被现今浏览器所支持,因此不会像JavaScript那样产生许多浏览器间的兼容性问题。具体使用可以用JavaScript,如Selenium;也可用高级编程语言通过COM编程实现,如Vbscript中:

    引用ActiveX库,如Microsoft Internet Controlsshdocvw.dll,处理从Web站点返回的URL和信息)和Microsoft HTML Object Librarymshtml.dllHTML解释器):

    Dim IE as InternetExplorer.Application

    Set IE = New InternetExplorer.Application

    IE.Visible = True

    IE.Quit

    Set  IE=Nothing

    使用COM应用程序的ProgID(程序化标识符)

    Dim IE as Object

    Set IE = CreateObject(“InternetExplorer.Application”)

    IE.Visible = True

    IE.Quit

    Set  IE=Nothing

    结合DOM,用Google搜索

    Dim IE

    Set IE = CreateObject(“InternetExplorer.Application”)

    IE.Visible = True

    IE.Navigate2 “http://www.google.com”

    Do

          DoEvents

    Loop while IE.Busy = TRUE

    IE.document.getElementsByName(“q”)(0).value=“Automation”

    IE.document.getElementsByName(“btnG”)(0).click

    Set  IE=Nothing

    []DOM的局限性:跨域(Cross Domain)权限问题,Web页面和该页中的Frame必须在同一域内。

     

    总结,Windows界面自动化主要用到的APIs

    1.     Win32/Win64

    2.     易用性接口UI Automation/MSAA

    3.     Web程序,用DOM等其它扩展

    4.     Flex/Flash,用Adobe公司提供的mx.automation.*类,它包含在Flex Builder内,如HP QuickTest专业版FunFX和录制/回放Flex的工具FlexMonkey,详见Using the Automated Testing API;或用dispatchEvent()方法,如国内开源软件Fluorida

     

    附录Aextern "C" __declspec(dllexport)

    __declspec(dllexport)声明动态导出函数;“C”表示按照标准C进行编译,extern "C" 保证输出的函数按C的方式命名,即在原函数名前加下划线前缀“_”。

     

    附录B:前沿

    据传微软采用一种基于Win32消息、MSAADOM等技术;一种基于UI Automation技术;一种支持MSAAIEUI Automation录制/回放工具。

     

    参考文章

    1.     MSAA体系结构:第一部分第二部分MSAA 2.0 RedistributableMSAA 2.0 DocumentMSAA 2.0 SDK ToolsMsaaVerifyUI Accessibility Checker

    2.     UI Automation overview-集成在Windows Presentation Foundation(WPF)易用性API中,用于取代MSAA的新易用性托管代码框架,能运行在所有支持WPFWindows中,UI Automation Community Promise Specification托管代码Win32应用程序支持Microsoft UI Automation论坛

    3.     Cooperative Java Compatibility Effort Table

    4.     AutoIt v3.1.0源码AutoHotkey源码

    分享到: