軟件測試工具中QTP處理驗證碼的一種方法
QTP在測試WEB站點應用程序時,通常會碰到驗證碼的問題(尤其是論壇類的站點),對于這類問題,通常的做法是利用OCR(Optical Character Recognization,光學字符識別)技術,通過識別圖片中的文字來獲取驗證碼,但是這種方法可靠性不高,受到驗證碼圖片混淆程度的影響。另外一種做法是在開發階段由程序員屏蔽驗證碼功能,或者提供所謂的“萬能驗證碼”。
本文介紹在測試Discuz !NT 2.5論壇系統時的關于驗證碼獲取和設置的一種解決辦法。通過分析Discuz的源代碼,發現驗證碼保存在數據庫的dnt_online表中:
/// <summary> /// 檢查在線用戶驗證碼是否有效 /// </summary> /// <param name="olid">在組用戶ID</param> /// <param name="verifycode">驗證碼</param> /// <returns>在組用戶ID</returns> public bool CheckUserVerifyCode(int olid, string verifycode, string newverifycode) { DbParameter[] parms = { DbHelper.MakeInParam("@olid", (DbType)SqlDbType.Int, 4, olid), DbHelper.MakeInParam("@verifycode", (DbType)SqlDbType.VarChar, 10, verifycode) }; DataTable dt = DbHelper.ExecuteDataset(CommandType.Text, string.Format("SELECT TOP 1 [olid] FROM [{0}online] WHERE [olid]=@olid and [verifycode]=@verifycode", BaseConfigs.GetTablePrefix), parms).Tables[0]; parms[1].Value = newverifycode; DbHelper.ExecuteNonQuery(CommandType.Text, string.Format("UPDATE [{0}online] SET [verifycode]=@verifycode WHERE [olid]=@olid", BaseConfigs.GetTablePrefix), parms); return dt.Rows.Count > 0; } |
dnt_online表中的最后一個字段verifycode存儲的就是驗證碼。驗證碼是在用戶登錄論壇后隨機產生并存入表中的,在管理員選擇“系統設置”功能進入“管理員控制臺”模塊之前需要輸入驗證碼,輸入的驗證碼與dnt_online表中所存儲的驗證碼進行對比,如果一致則接受用戶登錄請求。
因此可以在在QTP腳本中編寫數據庫查詢語句,在登錄管理員控制臺之前從數據庫dnt_online表獲取到管理員的驗證碼,具體的QTP腳本如下所示:
' 登錄論壇
Browser("Discuz!NT ASP.net|論壇 -").Page("Discuz!NT ASP.net|論壇 -").WebEdit("username").Click Browser("Discuz!NT ASP.net|論壇 -").Page("Discuz!NT ASP.net|論壇 -").WebEdit("username").Set "admin" Browser("Discuz!NT ASP.net|論壇 -").Page("Discuz!NT ASP.net|論壇 -").WebEdit("password").Set "123456" Browser("Discuz!NT ASP.net|論壇 -").Page("Discuz!NT ASP.net|論壇 -").WebButton("登錄").Click |
' 從數據庫讀取到驗證碼
verifycode = GetVerifyCode ("admin") |
' 登錄管理員控制臺
Browser("Discuz!NT ASP.net|論壇 -").Page("Discuz!NT ASP.net|論壇 -").Link("系統設置").Click Browser("管理員控制臺登錄").Page("管理員控制臺登錄").WebEdit("PassWord").Set "123456" Browser("管理員控制臺登錄").Page("管理員控制臺登錄").WebEdit("vcode").Set verifycode ' 設置驗證碼 Browser("管理員控制臺登錄").Page("管理員控制臺登錄").WebButton("WebButton").Click |
' 退出
Browser("管理員控制臺登錄").Page("系統設置 - Powered by Discuz!NT").Frame("mainFrame").Link("退出").Click |
Function GetVerifyCode( username ) Set Conn=CreateObject("ADODB.Connection") Set Rst=CreateObject("ADODB.Recordset") Rst.MoveFirst Rst.Close |
文章來源于領測軟件測試網 http://www.kjueaiud.com/