1. 驗證碼的處理
對於Web應用來說,大部分的系統在用戶登錄時都要求用戶輸入驗證碼。驗證碼的類型很多,有字母數字的、有漢字的,甚至還需要用戶輸入一道算術題的答案的。對於系統來說,使用驗證碼可以有效地防止采用機器猜測方法對口令的刺探,在一定程度上增加了安全性。
但對於測試人員來說,不管是進行性能測試還是自動化測試,都是一個比較棘手的問題。在WebDriver中並沒有提供相應的方法來處理驗證碼,這里我就根據自己的經驗來談談處理驗證碼的幾種常見方法。
1.1 去掉驗證碼
這里最簡單的方法,對於開發人員來說,只是把驗證碼相關的代碼注釋掉即可。如果是在測試環境,這樣做可以省去測試人員不少的麻煩。但如果自動化腳本是在正式環境測試,那么這種做法就給系統帶來了一定的風險。
1.2 設置萬能驗證碼
去掉驗證碼的主要問題是安全,為了應對在線系統的安全威脅,可以在修改程序時不取消驗證碼,而在程序中留一個“后門”,即設置一個“萬能驗證碼”。只要用戶輸入這個“萬能驗證碼”,程序就認為驗證通過,否則就判斷用戶輸入的驗證碼是否正確。
設計萬能驗證碼的方式非常簡單,只需要對用戶的輸入信息多加一個邏輯判斷,下面通過例子演示。
from random import randint #生成一個1000到9999之間的隨機整數 verify = randint(1000,9999) print(u"生成的隨機數:%d" %verify) number = input("請輸入隨機數:") print(number) number = int(number) if number == verify: print("登錄成功!!") elif number == 123456: print("登錄成功!!") else: print("驗證碼輸入有誤!")
randint()用於生成隨機數,設置隨機數的范圍為1000-9999之間。運行程序分別輸入正確的驗證碼、萬能驗證碼和錯誤的驗證碼。就會發現,只要輸入了萬能驗證碼,無論生成的是什么數字,都可以通過驗證。
1.3 驗證碼識別技術
可以通過Python-tesseract來識別圖片驗證碼。Python-tesseract是光學字符識別Tesseract OCR引擎的Python封裝類,能夠讀取如何常規的圖片文件(JPG、GIF、PNG、TIFF等)。不過目前市面上的驗證碼形式繁多,大多驗證碼識別技術的識別率都很難達到100%。但是現在出現了很多的OCR,例如百度雲OCR、微軟Azure圖像識別、有道智雲文字識別、阿里雲圖文識別、騰訊OCR文字識別等太多的識別技術了。然而我們公司的自動化開發並不使用驗證碼識別技術,我們公司又更多千奇百怪的過驗證碼技術,但是在文章里不好描述,就說下常用的一種吧,通過爬蟲爬取驗證碼文件,將驗證碼通過統一處理,開發的在進行自動化的時候,讀取到隨機生成的驗證碼的文件信息,與公司的驗證碼的信息進行對比,匹配到信息相同的,就輸入對應的驗證碼。
1.4 記錄cookie
通過向瀏覽器中添加cookie可以繞過登錄的驗證碼,這里比較有意思的一種解決方案。例如我們第一次登錄某網站時勾選的“記住密碼”的選項,當下次訪問該網站時自動就處於登錄狀態了。這樣自然就繞過了驗證碼問題。這個“記住密碼”的功能其實就是記錄在了瀏覽器的cookie中。前面已經學了通過WebDriver來操作瀏覽器的cookie,可以通過add_cookie()方法將用戶名密碼寫入瀏覽器cookie,當再次訪問網站時服務器將直接讀取瀏覽器的cookie進行登錄。
#訪問XX網站 wd.get("http://www.xx.com") #將用戶名密碼寫入瀏覽器cookie wd.add_cookie({'name':'Login_UserNumber','value':'username'}) wd.add_cookie({'name':'Login_Passwd','value':'password'})
#再次訪問XX網站,將會自動登錄
wd.get("http://www.xx.com")
這種方式最大的問題是如何從瀏覽器的cookie中找到用戶名和密碼對應的key值,並處輸入對應的登錄信息。可以用get_cookies()方法來換取登錄的所有cookie信息,從中找到用戶名和密碼的key。當然,更直接的方式是詢問開發人員。
2. WebDriver原理
WebDriver是按照Server-Client的節點設計模式設計的。
Server端就是Remote Server,可以是任意的瀏覽器。當我們的腳本啟動瀏覽器后,該瀏覽器就是Remote Server,它的職責就是等待Client發送請求並作出響應。
Client端簡單說來就是我們的測試代碼。我們測試代碼中的一些行為,例如打開瀏覽器,跳轉到特定的URL等操作是以http請求的方式發送給被測試瀏覽器的,也就是Remote Server。Remote Server接受請求,執行相應操作,並在Response中返回執行狀態、返回值等信息。
WebDriver的工作流程:
WebDriver啟動目標瀏覽器,並綁定到指定端口。啟動的瀏覽器實例將作為WebDriver的Remote Server。
Client端通過CommandExcuter發送HTTPRequest給Remote Server的監聽端口(通信協議:the webriver wire protocol)
Remote Server需要依賴原生的瀏覽器組件(如IEDriverServer.exe、chromedriver.exe)來轉化瀏覽器的native調用。
Python提供了logging模塊給運行中的應用提供了一個標准的信息輸出接口。它提供了basicConfig()方法用於基本信息的定義。開啟debug模塊,就可以捕捉到客戶端向服務器發送的請求。
from selenium import webdriver import logging logging.basicConfig(level=logging.DEBUG) wd = webdriver.Chrome() wd.get('https://www.baidu.com') wd.find_element_by_id("kw").send_keys("selenium") wd.find_element_by_id("su").click()
basicConfig()所捕捉的log信息。不過basicConfig()開啟的debug模式只能捕捉到客戶端向服務器發送的POST請求,而無法獲取服務器所返回的應答信息。我們在后面的章節中將會學會Selenium Server,通過Selenium Server可以獲取到更詳細的請求與應答信息。