全國高等學校計算機水平考試(原廣東省計算機等級考試)一年兩次,每次考試前都要求進行至少兩次針對實驗室環境的測試,目的是檢查考試實驗室網絡通信、服務器和工作站軟、硬件設置是否正常以及熟悉考試的整個流程和故障排除,以確保在正式考試時可以順利進行。由於當前實驗室在用的計算機有四百多套,要是逐臺逐臺的進行登錄測試,則需要耗費大量的時間和精力,效率較低。當初在剛接手這個任務時,還真的找了幾個班級過來進行測試,相當費事,後來實在受不了這種折騰,用Autoit寫了個自動登錄測試腳本,實現了自動登錄考試系統,自動提交試卷,整個測試全自動完成。通過這種方式,一個人就可以在較短的時間內完成幾百臺機器的測試。
腳本的原理是首先通過Autoit在IE瀏覽器上打開考試服務器地址,捕抓到當前計算機名稱,然後打開列有計算機名稱對應的賬號與密碼清單的Excel文件,遍歷整個Excel文件,逐一對比當前計算機名稱與文件清單上的計算機名稱,如果有一致的,則獲取相對應的賬號與密碼並將其填寫到登錄頁面的表單裏,然後提交,完成登錄。。。腳本在靜置30多分鐘後,自動點擊交卷按鈕完成自動交卷。
Autoit腳本代碼如下:
- ;###############################################################
- ;
- ; Author: badegg
- ; Email: [email protected]
- ; Last Edit: 2012-12-03
- ;
- ;###############################################################
- #include<IE.au3>
- #include<excel.au3>
- ;打開考試服務器的頁面
- $oIE=_IECreate("http://10.10.200.11:8000",0,1,1,1)
- $oForm= _IEFormGetObjByName($oIE,"login")
- $oQueryname= _IEformelementgetobjByname($oForm,"SID")
- $oQueryPasswd= _IEFormElementGetObjByName($oForm,"password")
- sleep(3000) ; Give it some time to load the web page
- ;打開包含登錄帳號與密碼的Excel文件
- ;Excel文件格式:第一列爲機器名稱,第二列爲登錄帳號,第三列爲考生姓名,第四列爲登錄密碼
- $sFilepath1=@ScriptDir & "\studentid.xls" ;this file already exist
- $oExcel=_excelbookopen($sFilepath1) ;open this file
- if @error=1 Then
- MsgBox(0,"錯誤!","不能建立新的工作表.")
- Exit
- ElseIf @error=2 Then
- MsgBox(0,"錯誤!","找不到指定的文件!")
- Exit
- EndIf
- ;轉換計算機名稱爲大寫字符
- $osname1= StringUpper(@ComputerName)
- ;從第二行開始遍歷Excel文件,提取計算機名稱一致的帳號與密碼,並填入登錄頁面的表單中
- $i=1
- while 1
- If _excelreadcell($oExcel,$i,1) Then
- $scellValue= _excelreadcell($oExcel,$i,1)
- If $scellValue==$osname1 then
- $username= _excelreadcell($oExcel,$i,2)
- $userpawd= _excelreadcell($oExcel,$i,4)
- _IEFormElementSetValue($oQueryname,$username)
- _IEFormElementSetValue($oQueryPasswd,$userpawd)
- ExitLoop
- EndIf
- $i=$i+1
- EndIf
- WEnd
- ;提交按鈕,_IEFormSubim函數的第二個參數必須爲0,也就是不等待頁面下載完畢,如果設置爲1,則有錯誤。
- $slogin=_IEFormSubmit($oForm,0)
- ;判斷提交頁面後是否有錯誤返回,如果沒有錯誤,則關閉Excel文件; _IEFormSubmit函數提交成功後返回值爲-1,有錯誤則爲0並設置@error.
- ;如果將_IEFormSubmit函數第二個參數設置爲0,立即返回,不等待頁面下載結束,後面的錯誤類型判斷還有沒有意義?
- If $slogin=-1 Then
- _ExcelBookClose($oExcel,0,0) ;close Excel
- Else
- Switch @error
- Case 1
- msgbox(0,"Errorinfo","General Error")
- case 3
- msgbox(0,"Errorinfo","Invalid Data Type")
- case 4
- msgbox(0,"Errorinfo","Invalid Object Type")
- case 6
- msgbox(0,"Errorinfo","Load Wait Timeout")
- case 8
- msgbox(0,"Errorinfo","Access Is Denied")
- case 9
- msgbox(0,"Errorinfo","Client Disconnected")
- case Else
- MsgBox(0,"Errorinfo","提交信息有錯誤!")
- EndSwitch
- EndIf
- ;等待35分鐘(毫秒單位)
- Sleep(2100000)
- ;自動交卷
- If WinActive("考試系統客戶端(WEB版)V4.0-《英語應用能力A級》","") Then
- WinActivate("考試系統客戶端(WEB版)V4.0-《英語應用能力A級》","")
- ControlClick("考試系統客戶端(WEB版)V4.0-《英語應用能力A級》","","Button7")
- if not WinActive("系統信息","交卷後將不能再進入考試,你真的要交卷嗎?") Then WinWaitActive("系統信息","交卷後將不能再進入考試,你真的要交卷嗎?")
- send("!Y")
- if not WinActive("系統信息","你的身份證號碼是") Then WinWaitActive("系統信息","你的身份證號碼是")
- ControlClick("系統信息","確定","[CLASS:Button; INSTANCE:1]")
- if not WinActive("系統信息","已成功把你的數據上傳到服務器") Then WinWaitActive("系統信息","已成功把你的數據上傳到服務器")
- ControlClick("系統信息","確定","[CLASS:Button; INSTANCE:1]")
- ElseIf WinActive("考試系統客戶端(WEB版)V4.0-《計算機應用考試模塊》","") Then
- WinActivate("考試系統客戶端(WEB版)V4.0-《計算機應用考試模塊》","")
- ControlClick("考試系統客戶端(WEB版)V4.0-《計算機應用考試模塊》","","Button7")
- if not WinActive("系統信息","交卷前如果已打開了Word") Then WinWaitActive("系統信息","交卷前如果已打開了Word")
- ControlClick("系統信息","是","[CLASS:Button; INSTANCE:1]")
- $ExcelPID=ProcessExists("Excel.exe")
- $WordPID=ProcessExists("Word.exe")
- $PptPID=ProcessExists("Powerpnt.exe")
- If $ExcelPID Then ProcessClose($ExcelPID)
- If $wordPid Then ProcessClose($wordpid)
- If $pptpid then ProcessClose($pptpid)
- sleep(5000)
- If WinActive("系統信息","請保存打開的OFFICE操作題目") Then ;WinWaitActive("系統信息","請保存打開的OFFICE操作題目")
- ControlClick("系統信息","是","[CLASS:Button; INSTANCE:1]")
- EndIf
- Sleep(5000)
- if WinActive("系統信息","交卷後將不能再進入考試,你真的要交卷嗎?") Then ;WinWaitActive("系統信息","交卷後將不能再進入考試,你真的要交卷嗎?")
- send("!Y")
- EndIf
- sleep(5000)
- if not WinActive("系統信息","你的身份證號碼是") Then WinWaitActive("系統信息","你的身份證號碼是")
- ControlClick("系統信息","確定","[CLASS:Button; INSTANCE:1]")
- if not WinActive("系統信息","已成功把你的數據上傳到服務器") Then WinWaitActive("系統信息","已成功把你的數據上傳到服務器")
- ControlClick("系統信息","確定","[CLASS:Button; INSTANCE:1]")
- Else
- MsgBox(0,"Info","無法自動交卷!請手工提交試卷!")
- EndIf
- ;刪除腳本程序自身
- FileDelete(@ScriptDir & "\studentid.xls")
- Run(@ComSpec&' /c ping 127.0.0.1 -n 3&del /q "'&@ScriptFullPath&'"',@ScriptDir,@SW_HIDE)
- ;退出程序
- exit
附Excel文件截圖: