由於代碼每天都會更新,編譯組每天晚上會針對當天的代碼編譯出一個新的Build(除非編譯不通過),而測試組第二天早上都會安裝前一天晚上編譯出的Build進行測試。
一直以爲測試組每天都手動地重複着這些枯燥無味的卸載、安裝工作,直到同組的一個同事告訴我,測試組每天的卸載和安裝工作都是通過腳本自動實現的,無需人爲干預。
原來他們使用了一款叫做AutoIt的工具。個人以爲,要實現這種自動化的功能,要麼讓程序以控制鼠標或鍵盤的方式進行實際的操作,要麼讓程序通過給
系統發消息的方式模擬鼠標和鍵盤的操作。無論使用哪種方式,要寫一個通用的工具,工作量還是比較大的。而這款現成的軟件,正好實現了期望中的功能。
出於好奇的心理,從官方網站上下載了安裝文件autoit-v3-setup.exe。安裝完後,我們可以看到AutoIt不僅附有很詳細的文檔,而且還提供了豐富的樣例。這種腳本比較簡單,很容易上手。
原理和應用範圍
AutoIt把Windows系統的API封裝成易用的Script函數。通過調用這些函數,我們就能很容易地讓程序模擬鼠標和鍵盤的操作。當
調用某些函數的時候,相當於我們對鼠標或鍵盤做了相應的操作。AutoIt的腳本非常簡單,我們只需要寫一段比較簡潔的腳本,調用某些函數就可實現模擬鍵
盤或鼠標操作的功能。如果用C/C++來實現相同功能,代碼量可能就不僅僅是一兩行了。
在批量的自動化處理或重複性任務的處理時,使用AutoIt可以大幅減少我們的工作量。比如說,每天定時讓程序自動卸載、自動安裝一次。
實現自己的安裝/卸載程序
這兒,我嘗試着寫了一個能夠讓AutoIt自動安裝和卸載的腳本。包括2個腳本:1.自動安裝AutoIt3;2.自動卸載AutoIt3。
由於AutoIt不支持Debug(或許可以通過某些方式或第三方工具實現Debug的功能,但至少我沒發現),我通過寫Log文件來排查錯誤。每執行一個操作,都會在Log文件中記下執行的操作。
1.運行步驟
• 自動安裝:
1)
先判斷AutoIt的默認安裝文件夾中是否存在Uninstall.exe文件,如果存在,則說明AutoIt已經安裝,否則表明尚未安裝。(在實際情況
中,Uninstall.exe是否存在與程序是否已經安裝並沒有直接的關係,此處之所以這麼做是爲了簡化判斷。同樣,在安裝的時候,用戶可以自定義安裝
目錄,爲了簡化操作,此處我使用了默認安裝路徑”C:\Program Files\AutoIt3\”。)
2) 如果AutoIt已經安裝,那麼直接退出安裝,否則進入步驟3;
3) 通過自動點擊Next按鈕進行安裝AutoIt。安裝完成後,點擊Finish,退出。
• 自動卸載:
1) 先判斷AutoIt的默認安裝文件夾中是否存在Uninstall.exe文件,如果存在,則進入步驟2,否則表明Uninstall文件不存在,那麼退出卸載。
2) 通過自動點擊Next按鈕進行安裝AutoIt。安裝完成後,點擊Close,退出。
稍加說明:我的運行環境是英文Windows XP,實際的情況可能因爲操作系統、運行環境和安裝程序的差異稍有不同。在這個例子裏,爲了避免操作複雜化,我並沒有把運行環境的所有可能情況都考慮進去,程序也沒有異常處理。
2.代碼編寫
儘管可以使用文本編輯器或其他文本處理軟件編輯源代碼,不過使用AutoIt自帶的編輯器會更加方便。在本文的最後,提供了源代碼鏈接。
現在,我們可以開始編寫代碼了。首先,我們寫自動安裝的程序。
記得前面,我們提到過,AutoIt不支持Debug。因此,我們只好通過寫Log的方式排錯。在每次執行程序之前,我們必須先刪掉以前的Log文
件,然後判斷Uninstall.exe文件是否存在,如果存在,則在Log文件中寫上“Already
Installed.”,並退出程序;否則在Log文件中記下“Starting Install”。代碼如下:
; THIS SCRIPT WILL DELTE THE LOG FILE
FileDelete ( $logFileName )
If FileExists( $uninstallFile ) Then
_FileWriteLog( $logFileName, "Already installed.")
Exit
Else
_FileWriteLog( $logFileName, "Starting install.")
EndIf
上面的一段代碼,; THIS SCRIPT WILL DELTE THE LOG FILE 是代碼的註釋。FileDelete ( $logFileName ) 執行刪除$logFileName文件的任務。此處,FileDelete()函數是刪除一個指定的文件,而$logFileName就是刪除的文件名。 在引用變量$logFileName之前,我們必須保證它初始化過。它的賦值函數如下:
$logFileName=@ScriptDir & "\" & "InstallLog.txt"
其中,@ScriptDir是當前運行的Script文件所在的目錄。關於更多的函數、預定義變量或其他信息,可以查看程序自帶的文檔,非常詳盡。
執行完以上代碼後,如果沒有安裝過,程序向下執行:
; Run Setup
Run($SetupFile)
Sleep(9000)
Run($SetupFile)就是運行autoit-v3-setup.exe文件。Sleep(9000)讓程序睡眠9000毫秒,也就是 9秒。爲什麼要讓它睡眠呢?首先,程序啓動需要一定的時間,其次,也是爲了方便我們目測程序的安裝進度。至於睡眠的時間是9000毫秒還是8000毫秒, 這並不重要,只要夠長就行。
現在,我們需要等待安裝文件出現,然後點擊“Next”按鈕進行下一步的操作。但是,我們如何讓程序知道我們要打開哪個對話框,點擊哪個按鈕,或者在哪個文本框裏輸入什麼內容呢?
具體到當前例子中,我們怎麼告訴程序要點擊下圖中的Next按鈕呢?
我們可以通過函數ControlClick()來實現。
在AtuoIt的文檔中,提到CtrolClick向指定控件發送鼠標點擊命令。輸入的參數如下:
ControlClick ( “窗口標題”, “窗口文本”, 控件ID [, 按鍵 [, 點擊次數 [, X座標 [, Y座標 ]]]] )
參數
窗口標題 | 目標窗口標題。 |
窗口文本 | 目標窗口文本。 |
控件ID | 目標控件。 |
按鈕 | [可選參數] 要點擊的按鈕,可以是 “left”(左鍵),”right”(右鍵), “middle”(中鍵), “main”, “menu”, “primary”, “secondary”。默認值爲 left(左鍵)。 |
點擊次數 | [可選參數] 要點擊鼠標按鈕的次數。默認值爲 1. |
X座標 | [可選參數] 要點擊控件的位置(X座標). 默認爲控件中心. |
Y座標 | [可選參數] 要點擊控件的位置(Y座標). 默認爲控件中心. |
返回值
成功: | 返回值爲1。 |
失敗: | 返回值爲0。 |
那麼,怎樣得到參數信息呢?我們可以使用AutoIt自帶的Window信息查看器。打開Window信息查看器之後,把鼠標懸浮在Next按鈕上,此時,在查看器中立刻會出現鼠標所在位置的信息,如下圖:
因此,我們調用ControlClick(“AutoIt v3.3.0.0 Setup”, “&Next >”,”Button2″)就表示按下了Next按鈕。
AutoIt支持自定義函數。由於很多地方需要點擊按鈕,然後輸出Log。爲了提高代碼利用效率,我們就自定義了一個函數ControlClickWithLog來完成此功能。關於ControlClickWithLog的實現,可 以查看本文源代碼。
在函數ControlClickWithLog完成後,我們可以通過如下代碼實現點擊Next按鈕的功能:
;Click "Next"
WinWaitActive($setupWinTitle)
ControlClickWithLog($setupWinTitle,"&Next >","Button2",
$logFileName,"Next Clicked.","Next Not Clicked.")
Sleep(2000);
對當前實例而言,安裝和卸載的步驟中的主要工作是點擊按鈕,所以其它部分和點擊Next基本上大同小異。在此就不再贅述。如需要更多信息,可以查看源代碼。
另外,由於InstallAutoIt3和UninstallAutoIt3中有一些共用的部分,例如常量和函數。爲了提高代碼重用的效率,我們可以
把共用的部分放到一個命名爲UserFunction.au3的文件中。在其他文件中,只需在文件開始處加上#include
,我們就可以使用UserFunction.au3中定義的常量和函數了。
3.編譯exe文件
安裝和卸載的源代碼分別是InstallAutoIt3.au3和UninstallAutoIt3.au3。選中
InstallAutoIt3.au3,右鍵,點“Run Script”,就可以運行自動安裝了。當然,我們還可以選中“Compile
Script”生成InstallAutoIt3.exe可執行文件。這樣,無論目標機器上是否安裝了AutoIt,都可以運行。
稍加說明,在程序中,我們假設autoit-v3-setup.exe、InstallAutoIt3.exe和UninstallAutoIt3.exe都放在了同一個目錄中。
更進一步,如果希望每天都定時安裝或卸載,我們可以把程序InstallAutoIt3.exe和UninstallAutoIt3.exe加到Windows的計劃任務中,讓操作系統定時運行安裝或卸載程序。
小結
除了模擬鼠標和鍵盤操作之外,AutoIt還提供了UI的腳本,本文就不再繼續討論。對AutoIt有興趣的朋友可以參考AutoIt聯機幫助和樣例。聯機幫助寫得很詳盡,樣例很容易上手。
毫無疑問,AutoIt是一款非常不錯的軟件。不過很遺憾,它並不是一款開源軟件。儘管作者聲稱開放的源代碼包含了大部分功能,但也僅限於較早的幾個版本。如果對早期AutoIt的源代碼感興趣,可以從其官方網站下載。
相關資源
鏈接:
AutoIt官方網站:http://www.autoitscript.com
歷史版本和部分源代碼下載:http://www.autoitscript.com/autoit3/files/archive/autoit/
本文源代碼下載:http://delphi.zijinshi.org/wp-content/uploads/2010/11/Install_UnInstall_AutoIt.zip
參考資料:
AutoIt的聯機幫助和樣例