下面我們來介紹如何使用AutoIT完成單機程序的自動化測試。使用AutoIT完成桌面應用程序的自動化測試,最重要的是找到識別GUI對象的方法,然后調用AutoIT函數來操縱它或讀取它的屬性值,並與正確的結果進行比較。AutoIT內置了大量操作Windows標准控件的方法,可以滿足一般應用程序的測試需求。我們還可以通過調用動態庫或COM擴展的方式來擴展AutoIT的功能。
1. 識別窗口的方法
編寫自動化腳本的時候,首先要解決的一個問題就是如何(在眾多窗口中)准確識別出目標窗口。一般來說,我們常把窗口的標題(Title)作為它的識別方法。但有時候只給出窗口標題還不夠,還要同時給出標題及文件(text)。要獲得某個窗口的標題是件很簡單的事情(大多數窗口直接就可以看到),可以使用AutoIt提供的窗口信息工具(AutoIt Window Info)抓取。大多數窗口的標題都是顯而易見的,例如系統自帶的記事本程序(notedad.exe),它的默認標題是“無標題-記事本”,如圖所示。窗口標題及其文本是大小寫敏感的,包括標點符號在內,我們必須確保它們是完全匹配的。
AutoIt的大部分窗口函數都有窗口標題和文本參數,比如說下面的WinWaitActive函數。這個函數的功能是使腳本暫停執行並一直等到指定窗口出現且激活為止。
WinWaitActive(“窗口標題",["窗口文本"],[超時時間])
其中,“窗口標題”是必須指定的參數,而"窗口文本"和"超時時間"都是可選參數。不過,也有些函數的窗口文本參數是必須指定的,如果想省略這個參數,只須指定空字符串("")作為參數即可。在參數窗口文本中指定一個空字符串甚至沒有值(NULL),相當於告訴AutoIt任何文本都是有效的。
下面以記事本窗口為例說明上面提到的函數的兩種用法:
WinWaitActive(“無標題-記事本") 或 WinWaitActive(“無標題-記事本","")
2. 窗口句柄
AutoIt中的變量可用來存儲窗口句柄(Windows Handles)。所謂窗口句柄是指Windows自動分配給每個新創建的窗口的特殊值。窗口句柄可用來代替窗口標題參數。使用窗口句柄來代替窗口標題的好處是能夠更加精確地識別窗口,例如,有時候我們會同時打開同一應用程序的多個副本,這些窗口具有完全相同的窗口標題和窗口文本,這時就可以利用窗口句柄的唯一性來准確地識別所指定的窗口。
很多函數如WinGetHandle、WinList和GUICreate都會返回窗口句柄,示例:
$handle=WinGetHandle(“無標題-記事本”) WinClose($handle)
注意:不管當前的WinTitleMatchMode被設置為何種模式,窗口句柄始終可用。
3. 識別控件的方法
AutoIt提供了直接操作控件的功能。窗口上能看到的東西大多數都是以下控件中的一種:按鈕、列表框、文本編輯框、靜態文本等。例如,系統自帶的記事本程序的主窗口也只是一個相對而言比較大的“編輯框(Edit)”控件罷了。正因為AutoIt提供了直接對控件操作的功能,我們再也不須要使用模擬鍵擊等低級的方法來操作窗口了,這使得實現對窗口操作的腳本更加可靠。
AutoIt主要支持標准的Microosft控件。有些應用程序使用了大量的自定義控件,很像是標准的MS控件,但卻無法被腳本程序識別,就需要特別的辦法來解決。
在使用Control…()函數時,一些控件描述必須提供ControlID。通過這些描述才能正確識別控件。這些描述包括:
- ID,內部控件的ID;
- TEXT,控件文本,如"下一步"按鈕;
- CLASS,內部控件的類的名稱,如"Edit"或"Button";
- INSTANCE,枚舉;
- CLASSNN,類別名,如"Edit1";
以上的屬性可以單獨使用,也可以組合起來使用。具體使用哪一種屬性,主要依據個人喜歡及從AutoIt窗口信息工具所獲得的信息類型。一般而言,最好的方法就是使用控件ID,但如果控件ID無法獲得或靠控件ID還不足以保證能識別目標控件,那么就須要使用其他的屬性,或者屬性的組合。
例如,發送文本到記事本的第1個Edit控件:
ControlSend(“無標題-記事本”,"","[CLASS:Edit;INSTANCE:1]”,"這是一些文本")
或
ControlSend(“無標題-記事本","","[CLASSNN:Edit1]”,"這是一些文本")
或
ControlSend(“無標題-記事本","","Edit1”,"這是一些文本")
單擊“我的窗口”里面的控件,得到控件ID 254,就可以直接使用ID:
ControlClick(“我的窗口","","[ID:254]")
或
ControlClick(“我的窗口","",254)
例如單擊第2個包含“完成”文本的按鈕,就使用組合方法:
ControlClick(“我的窗口","","[CLASS:Button;TEXT:”完成";INSTANCE:2]")
如果要獲得某個控件的句柄可使用ControlGetHandle函數。控件句柄是Windows賦予控件的獨一無二的標識符,即每個被創建的控件都具有不同的句柄。示例如下:
$handle=ControlGetHandle(“Untitled- Notepad”,"","Edit1")
4. 操作窗口和控件
確定了窗口和控件的識別方法之后,我們就可以使用AutoIt提供的函數來完成對窗口和控件的操作。常用的函數如下。
激活指定的窗口(設置焦點到該窗口,使其成為活動窗口) WinActive("窗口標題"[,"窗口文本"]) 關閉指定窗口 WinClose("窗口標題"[,"窗口文本"]) 移動指定的窗口或調整窗口的大小 WinMove("窗口標題","窗口文本"],X坐標,Y坐標[,寬度,[,高度[,速度]]]) 顯示、隱藏、最小化、最大化或還原某個窗口 WinSetState("窗口標題","窗口文本",標志) 向指定控件發送鼠標點擊命令: ControlClick("窗口標題","窗口文本”,控件ID[,按鍵[,點擊次數[,X坐標[,Y坐標]]]]) 向指定控件發送命令: ControlCommand("窗口標題","窗口文本",控件ID,"命令"[,"選項"]) 設置輸入焦點到指定窗口的某個控件上: ControlFocus("窗口標題","窗口文本",控件ID) 向指定的控件發送字符串: ControlSend("窗口標題","窗口文本",控件ID,"字符串"[,標志]) 修改指定控件的文本: ControlSetText("窗口標題","窗口文本",控件ID,"新文本",標志) 向激活窗口發送模擬鍵擊操作: Send("按鍵"[,標志]) 執行鼠標點擊操作: MouseClick("按鈕"[,X坐標,Y坐標[,點擊次數[,速度]]] ) 執行鼠標拖拽操作: MouseClickDrag("按鈕",X1坐標,Y1坐標,X2坐標,Y2坐標[,速度])
5.驗證
在完成測試用例的操作步驟之后,黑盒測試方法主要是通過檢查和比較軟件的輸出結果(包括界面、文件、數據等)來驗證測試的結果,判斷軟件是否存在缺陷。軟件界面的檢查主要是檢查軟件窗口和控件的各種狀態、標題、文本和圖片等信息,並將檢查結果寫入最終的測試報告中,以供分析。
5.1 驗證窗口、控件狀態常用的方法
獲取窗口控件的坐標位置和大小等: WinGetPos("窗口標題"[,"窗口文本"]) ;用於窗口 ControlGetPos("窗口標題","窗口文本",控件ID) ;用於控件 獲取窗口控件的狀態(包括是否可見、是否激活、最大化、最小化等): WinGetSate("窗口標題"[,"窗口文本"]) ;用於窗口 ControlCommand("窗口標題","窗口文本",控件ID,選項) ;用於控件 檢查窗口是否存在 WinExists("窗口標題"[,”窗口文本”])
5.2 驗證窗口、控件文本常用的方法
獲取窗口的完整標題名: WinGetTitle("窗口標題"[,"窗口文本"]) 獲取窗口中的文本: WinGetText("窗口標題"[,"窗口文本"]) 獲取控件上的文本: ControlGetText("窗口標題","窗口文本",控件ID)
5.3 驗證圖片或顯示效果的常用的方法
AutoIt沒有提供圖像比較函數,須要自己開發相應的函數。如果不准備開發這方面的功能,就只有將要檢查的圖像或效果用截屏的方法保存下來,並附在測試報告中,讓測試人員事后人工分析。
截取整個屏幕或指定區域:
_ScreenCapture_Capture("C:\Image1.jpg") 或 _ScreenCapture_Capture("C:\Image1.jpg",0,0,796,596) 或 _ScreenCapture_CaptureWnd("C:\Image1.jpg",窗口句柄)
事例:
#include <ScreenCapture.au3> ;用來保存圖像的路徑和文件名 $file="c:\ScreenCapture"&@MON & @MDAY & @HOUR & @MIN & @SEC&" .jpg" _ScreenCapture_Capture($file);並保存到文件中
5.4 驗證文件常用的方法
檢查文件是否存在: FileExists("路徑") 獲取文件大小: FileGetSize("路徑") 獲取文件基本屬性(包括只讀,隱藏等): FileGetAttrib("路徑")
5.5 其他驗證
返回當前鼠標指針形狀的ID: MouseGetCursor() 獲取當前鼠標的坐標位置: MouseGetPos([dimension])
6. 實例
下面這個腳本實例演示了如何打開計算器、找到計算器窗口、操作計算器完成“1+2”的計算和驗證,並將檢查的結果寫入測試報告中。
腳本如下:
Run("calc.exe") WinWaitActive("計算器") ControlClick("計算器","","1") ControlClick("計算器","","+") ControlClick("計算器","","2") ControlClick("計算器","","=") $Result=ControlGetText("計算器","",403) if $Result=="3. " Then FileWriteLine("C:\result.txt","正確:和期望結果3一致") Else FileWriteLine("C:\result.txt","錯誤:和期望結果3不一致,實際結果結果為"&$Result) EndIf WinClose("計算器")