標籤:完成 內容 str 擷取 driver star 缺點 zid 改變
自動化領域的兩種驅動,對象驅動與資料驅動
- 資料驅動:測試資料的改變引起執行結果的改變 叫 資料驅動
- 關鍵字驅動:測試對象名字的改變起引起測試結果的改變 叫 關鍵字驅動
1 、讀取檔案參數化
以百度表搜尋為例,我們可以通過指令碼迴圈執行,讀取一檔案中不同的內容來完成自動
化工作,也就是說我們每次取的檔案裡的搜尋索引鍵不同,而每次百度搜尋的的結果不同,
這也是資料驅動的本質。
代碼如下:
d:\abc\data.txt
baidu_read_data.py
#coding=utf-8from selenium import webdriverimport os,timesource = open("D:\\abc\\data.txt", "r")values = source.readlines()source.close()# 執行迴圈for serch in values:browser = webdriver.Firefox()browser.get("http://www.baidu.com")browser.find_element_by_id("kw").send_keys(serch)browser.find_element_by_id("su").click()browser.quit()
這裡簡單說明一下,open 方法左以唯讀方式(r)開啟本地的 data.txt 檔案,readlines方法是逐行的讀取檔案內容。
通過 for 迴圈,serch 可以每次擷取到檔案中的一行資料,在定位到百度的輸入框後,
將資料傳入 send_keys(serch)。這樣通過迴圈調用,直到檔案的中的所有內容全被讀取。
2 、使用者名稱密碼的參數化(讀取檔案)
後面的例子東一登入百度為例,主要是讀取檔案(因為百度的登入時,需要驗證碼,所以也沒不會登入成功)
按照上面的方法,對自動化指令碼中使用者名稱密碼進行參數化,從目前所查到 python 讀取方法有,整個檔案讀取,逐行讀取,固定位元組讀取。
怎樣才一次讀取使用者名稱和密碼兩個資訊呢,最初的修改是這樣的:
建立兩個檔案,分別存放使用者名稱密碼
調用使用者名稱密碼登入登入的指令碼
#coding=utf-8from selenium import webdriverimport os,timesource = open("D:\\abc\\data2.txt", "r") #使用者名稱檔案user = source.read(5) #使用者名稱長度source.close()source2 = open("D:\\abc\\data3.txt", "r") #密碼檔案pw = source2.read(6) #密碼長度source2.close()driver = webdriver.Firefox()driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)time.sleep(3)driver.find_element_by_id("TANGRAM__PSP_3__password").clear()driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)time.sleep(3)driver.find_element_by_id("TANGRAM__PSP_3__submit").click()time.sleep(3)driver.close()
缺點:
雖然目的達到了這,但這樣的實現有很多問題:
- 使用者名稱密碼分別在不同的檔案裡,這樣就要求使用者名稱密碼必須一一對應
- 必須指定讀取的長度,測試 readlines() 並不是讀取的一行資料。
- 無法迴圈讀取。
3 、使用者名稱的參數化(字典)
使用者名稱密碼參數化
解決迴圈調用
如果固定只是讀取使用者名稱,密碼兩個值,可以通過如下方法實現。
建立 fun.py 檔案,定義一個字典方法(方法檔案和case檔案放在一個根目錄下):
def zidian():d={‘fnngj‘:‘a23456‘,‘testing360‘:123456}print "suess read username and password!!"return d
字典的可以方便的存放 k,v 索引值對,一個鍵對應一個值;注意,如果密碼中有非數字,需要加單引號。
下面迴圈調用詞典的值:
#coding=utf-8from selenium import webdriverimport os,timeimport fun #匯入函數#迴圈調用字典裡的使用者名稱密碼,分別賦值給 k,vfor k,v in fun.zidian().items():driver = webdriver.Firefox()driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)time.sleep(3)driver.find_element_by_id("TANGRAM__PSP_3__password").clear()driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)time.sleep(3)driver.find_element_by_id("TANGRAM__PSP_3__submit").click()time.sleep(3)driver.close()
指令碼這樣表設計就穩定了很多,每次取的值非常固定,而且同樣實現了參數與指令碼分離,如果幾百個指令碼都調用 fun( ) 函數,當需要修改使用者名稱密碼時,只用修改 fun( )函數裡面字
典的值就可以了。
4 、使用者名稱密碼的參數化(函數)
其實,在項目中只需要做到參數化就行了,並不需要迴圈的讀取內容。那麼通過函數調用就可以很簡單的解決。
首先定義fun.py,(方法檔案和case檔案放在一個根目錄下)
def user(k=‘fnngj‘,v=123456): print "suess read username and password!!" return k,v
賦預設值,並將結果返回。
調用函數值:
#coding=utf-8from selenium import webdriverimport os,time#匯入函數import fun #通過調用函數獲得使用者名稱&密碼k,v = fun.user()print k,vdriver = webdriver.Firefox()driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)driver.find_element_by_id("TANGRAM__PSP_3__password").clear()driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)driver.find_element_by_id("TANGRAM__PSP_3__submit").click()time.sleep(3)driver.close()
運行結果:
>>> =================== RESTART ================================
>>>
suess read username and password!!
fnngj 123456
.
----------------------------------------------------------------------
Ran 1 test in 25.484s
OK
資料驅動測試(Python)