對於 web 應用來說,大部分的系統在用戶登錄時都要求用戶輸入驗證碼,驗證碼的類型的很多,有字母數字的,有漢字的,甚至還要用戶輸入一條算術題的答案的,
對於系統來說使用驗證碼可以有效果的防止采用機器猜測方法對口令的刺探,在一定程度上增加了安全性。
但對於測試人員來說,不管是進行性能測試還是自動化測試都是一個比較棘手的問題。在 WebDriver中並沒有提供相應的方法來處理驗證碼。
如下圖的驗證碼:
一般來說有以下幾種解決方案:
- 去掉驗證碼
這是最簡單的方法,對於開發人員來說,只是把驗證碼的相關代碼注釋掉即可,如果是在測試環境,這樣做可省去了測試人員不少麻煩,如果自動化腳本是要在正式環境跑,這樣就給系統帶來了一定的風險。
- 設置萬能碼
去掉驗證碼的主要是安全問題,為了應對在線系統的安全性威脅,可以在修改程序時不取消驗證碼,而是程序中留一個“后門”---設置一個“萬能驗證碼”,只要用戶輸入這個“萬能驗證碼”,程序就認為
驗證通過,否則按照原先的驗證方式進行驗證。
設計萬能碼的方式非常簡單,只對於用戶的輸入信息多加一個邏輯判斷,如下面的小例子:
#coding=utf-8 import random #生成一個 1000 到 9999 之間的隨機整數 verify = random.randint(1000,9999)
print u"生成的隨機數:%d " %verify number = input(u"請輸入隨機數:") print number
if number == verify: print u"登錄成功!!" elif number == 132741: #萬能驗證碼 print u"登錄成功!!" else: print u"驗證碼輸入有誤!"
randint()用於生成隨機數,設置隨機數的范圍為1000~9999之間。運行程序分別輸入正確的驗證碼、萬能碼和錯誤的驗證碼
- 驗證碼識別技術
例如可以通過 Python-tesseract 來識別圖片驗證碼,Python-tesseract 是光學字符識別 Tesseract OCR 引擎的 Python 封裝類。
能夠讀取任何常規的圖片文件(JPG, GIF ,PNG , TIFF 等)。不過,目前市面上的驗證碼形式繁多,目前任何一種驗證碼識別技術,識別率都不是100% 。
- 記錄 cookie
通過向瀏覽器中添加 cookie 可以繞過登錄的驗證碼,這是比較有意思的一種解決方案。比如我們在第一次登錄某網站可以勾選“記住密碼”的選項,當下次再訪問該網站時自動就處於登錄狀態了。
這樣其實也繞過驗證碼問題。那么這個“記住密碼”的功能其實就記在了瀏覽器的 cookie 中。可以通過 add_cookie()方法將用戶名密碼寫入瀏覽器 cookie ,再次訪問網站時服務器直接讀取瀏覽器 Cookie 登錄。
.... #訪問 xx 網站 driver.get("http://www.xx.cn")
#將用戶名密碼寫入瀏覽器 cookie driver.add_cookie({'name':'Login_UserNumber', 'value':'username'}) driver.add_cookie({'name':'Login_Passwd', 'value':'password'})
#再次訪問 xx 網站,將會自動登錄 driver.get("http://www.xx.cn/") time.sleep(3) .... driver.quit()
這種方式最大的問題是如何從瀏覽器的 Cookie 中找到用戶名和密碼對應的 key 值,並傳傳輸入對應的登錄信息。可以 get_cookies()方法來獲取登錄的所有的 cookie 信息,
從中找到用戶名和密碼的 key。當然,如果網站登錄時根本不將用戶名和密碼寫 Cookie,這會存在一定的安全風險。那么這種方式就不起作用了。