QTP處理驗證碼的一種方法

TIB發表於2010-03-15

QTP在測試WEB站點應用程式時,通常會碰到驗證碼的問題(尤其是論壇類的站點),對於這類問題,通常的做法是利用OCROptical 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 )

       Dim Conn ' 資料庫連線物件

       Dim Rst ' 資料記錄集物件

       Dim str_Link_DBSource ' 資料庫連線串

       Dim SqlStr ' SQL查詢語句

       str_Link_DBSource="Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=dnt25;Data Source=CHENNENGJI"

       SqlStr = "select verifycode from dnt_online where username = '" & username & "'"

      

       Set Conn=CreateObject("ADODB.Connection")

       Conn.Open str_Link_DBSource

      

       Set Rst=CreateObject("ADODB.Recordset")

       Rst.Open SqlStr,Conn,2,2

      

       Rst.MoveFirst

       GetVerifyCode = Rst.Fields(0)      ' 取得驗證碼

      

       Rst.Close

       Conn.Close

       Set Rst=Nothing

       Set Conn=Nothing

End Function

 

 

相關文章