在上一篇中写了一个
web系统登录的
测试脚本,此篇将对改脚本做一些优化。
在
QTP中,参数化是一个非常强大的功能,在
AutoIT中同样也是可以通过编程参数化的。在使用QTP实现
自动化测试的时候,我们通常会使用Excel来保存测试数据,脚本会从Excel中读取测试数据来进行数据驱动测试。下面将在AutoIT实现此脚本的参数化,以达到数据驱动的目的。
#Include <IE.au3>
#Include<ScreenCapture.au3>
#Include<BaseOp.au3>
Global $hBmp
Global $test
Global $result
Global $isobj=False
Global $timer=0
Global $OIE
Global $testURL="
http://192.168.85.36/web"
$sheet = Gettestsheet("C:\Documents and Settings\aslandhu\桌面\autoit3\用户信息.xlsx",1)
For $i=2 To 3 Step 1
Dim $Tester=$sheet.Cells($i,1).value
Dim $TesterPWD=$sheet.cells($i,2).value
LoginTest($Tester,$TesterPWD)
Next
CloseExcel()
Func LoginTest($Tester,$TesterPWD)
$OIE = _IECreate($testURL,0,1,1,0)
_IELoadWait($OIE)
Local $Login=_IELinkClickByText($OIE,"登录")
While Not $isobj
If $timer>=3 Then
WriteToFile("C:\Documents and Settings\aslandhu\桌面\autoit3\test.Log","找不到输入框")
SetError("2")
ExitLoop
EndIf
$timer+=1
Local $Inputname = _IEGetObjByName($OIE,"txtPhoneNum")
Local $Inputpassword = _IEGetObjByName($OIE,"txtPassword")
If Not IsObj($Inputname)Or Not IsObj($Inputpassword) Then
Sleep(2000)
Else
$isobj=True
$Inputname.value=$Tester
$Inputpassword.value=$TesterPWD
EndIf
WEnd
$timer=0
$isobj=False
Local $Inputcheck= _IEGetObjByName($OIE,"txtRadomPicCode")
If Not IsObj($Inputcheck) Then
$test= CaptureScreen("C:\Documents and Settings\aslandhu\桌面\autoit3","CheckCodeError")
$spans=_IETagNameGetCollection($OIE,"span")
if $spans(0).innertext==("用户"&$Tester) Then
SetError("5")
Else
SetError("4")
EndIf
Else
$checkCode=InputBox("提示","请输入验证码:")
$Inputcheck.value=$checkCode
Local $btn= _IEGetObjByName($OIE,"btnSubmitLogin")
_IEAction($btn,"Click")
_IELoadWait($OIE)
Sleep(2000)
Local $Loginwrap = _IEGetObjById($OIE,"Loginwrap")
_IELoadWait($OIE)
If Not IsObj($Loginwrap) Then
$spans=_IETagNameGetCollection($OIE,"span")
if $spans(0).innertext==("用户"&$Tester) Then
SetError("1")
Else
$test= CaptureScreen("C:\Documents and Settings\aslandhu\桌面\autoit3","LoginError")
SetError("3")
EndIf
Else
SetError("3")
EndIf
EndIf
Switch @error
Case 1
$result="成功"
Case 2
$result="登录框上的按钮不见啦"
Case 3
$result="抱歉,登录失败"
Case 4
$result="登录时,验证码输入框不存在"
Case 5
$result="用户已经登录了"
Case Else
$result="未定义的错误"
EndSwitch
WriteToFile("C:\Documents and Settings\aslandhu\桌面\autoit3\test.Log","测试号码是:"&$Tester&"密码是:"&$TesterPWD&"结果为:"&$result)
$IsClose=_IEQuit($OIE)
If $IsClose<>1 Then
$test= CaptureScreen("C:\Documents and Settings\aslandhu\桌面\autoit3","quitIEError")
ProcessClose($OIE)
EndIf
EndFunc
下面对脚本做一些说明:
(1)AutoIT内置的UDF中包含了强大的Excel操作函数,但我还是更倾向于使用COM。毕竟这个跟我们长期使用QTP的使用习惯有关。这个脚本中调用了两个简单的Excel操作函数。
Gettestsheet("C:\Documents and Settings\aslandhu\桌面\autoit3\用户信息.xlsx",1)
CloseExcel()
这两个函数的代码如下:
Func Gettestsheet($path,$sheetindex)
ProcessClose("EXCEL.EXE")
$oExcel = ObjCreate("Excel.Application")
$oExcel.visible=0
$workbook=$oExcel.WorkBooks.Open($path)
$sheet=$workbook.Worksheets.Item($sheetindex)
Return $sheet
EndFunc
Func CloseExcel()
$workbook.Save();
$oExcel.Quit();
ProcessClose("EXCEL.EXE");退出不了则强制杀死进程
EndFunc
(2)ProcessClose函数是一个非常有用的函数,可以杀死一些不能自动退出的进程。当IE因为某些原因无法退出的时候,可以使用它。
(3)整个脚本将登录部分封装成了LoginTest函数,与用例执行层分离。这样其实和QTP实现自动化测试的一些思想也是保持一致的。
在自动化测试中,Excel是非常有用的数据存储文件。任何测试工具都不同形式的支持Excel的读写,同样,对于
数据库也是如此。下一篇将介绍如何进一步改进此脚本,加入数据库的检查点。