對於Web應用來講,大部分的系統在用戶登陸時都要求用戶輸入驗證碼。驗證碼的類型不少,有字母數字的、有漢字的,甚至還須要用戶輸入一道算術題的答案的。對於系統來講,使用驗證碼能夠有效地防止採用機器猜想方法對口令的刺探,在必定程度上增長了安全性。web
但對於測試人員來講,無論是進行性能測試仍是自動化測試,都是一個比較棘手的問題。在WebDriver中並無提供相應的方法來處理驗證碼,這裏我就根據本身的經驗來談談處理驗證碼的幾種常見方法。chrome
這裏最簡單的方法,對於開發人員來講,只是把驗證碼相關的代碼註釋掉便可。若是是在測試環境,這樣作能夠省去測試人員很多的麻煩。但若是自動化腳本是在正式環境測試,那麼這種作法就給系統帶來了必定的風險。設計模式
去掉驗證碼的主要問題是安全,爲了應對在線系統的安全威脅,能夠在修改程序時不取消驗證碼,而在程序中留一個「後門」,即設置一個「萬能驗證碼」。只要用戶輸入這個「萬能驗證碼」,程序就認爲驗證經過,不然就判斷用戶輸入的驗證碼是否正確。瀏覽器
設計萬能驗證碼的方式很是簡單,只須要對用戶的輸入信息多加一個邏輯判斷,下面經過例子演示。 安全
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之間。運行程序分別輸入正確的驗證碼、萬能驗證碼和錯誤的驗證碼。就會發現,只要輸入了萬能驗證碼,不管生成的是什麼數字,均可以經過驗證。服務器
能夠經過Python-tesseract來識別圖片驗證碼。Python-tesseract是光學字符識別Tesseract OCR引擎的Python封裝類,可以讀取如何常規的圖片文件(JPG、GIF、PNG、TIFF等)。不過目前市面上的驗證碼形式繁多,大多驗證碼識別技術的識別率都很難達到100%。可是如今出現了不少的OCR,例如百度雲OCR、微軟Azure圖像識別、有道智雲文字識別、阿里雲圖文識別、騰訊OCR文字識別等太多的識別技術了。然而咱們公司的自動化開發並不使用驗證碼識別技術,咱們公司又更多千奇百怪的過驗證碼技術,可是在文章裏很差描述,就說下經常使用的一種吧,經過爬蟲爬取驗證碼文件,將驗證碼經過統一處理,開發的在進行自動化的時候,讀取到隨機生成的驗證碼的文件信息,與公司的驗證碼的信息進行對比,匹配到信息相同的,就輸入對應的驗證碼。cookie
經過向瀏覽器中添加cookie能夠繞過登陸的驗證碼,這裏比較有意思的一種解決方案。例如咱們第一次登陸某網站時勾選的「記住密碼」的選項,當下次訪問該網站時自動就處於登陸狀態了。這樣天然就繞過了驗證碼問題。這個「記住密碼」的功能其實就是記錄在了瀏覽器的cookie中。前面已經學了經過WebDriver來操做瀏覽器的cookie,能夠經過add_cookie()方法將用戶名密碼寫入瀏覽器cookie,當再次訪問網站時服務器將直接讀取瀏覽器的cookie進行登陸。dom
#訪問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。固然,更直接的方式是詢問開發人員。性能
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能夠獲取到更詳細的請求與應答信息。