標籤:輸入 基礎 sheet value try tuple cal 迭代 time
簡介:資料驅動excel驅動方式,就是資料配置在excel裡面,主程式調用的時候每次用從excel裡取出的資料作為參數,進行操作,需要掌握的地方是對excel的操作,要靈活的找到目標資料 測試資料.xlsx:
路徑-D:\test\0627
ExcelUtil.py:
#encoding=utf-8
from openpyxl import load_workbook
class ParseExcel(object):
def __init__(self, excelPath, sheetName):
# 將要讀取的excel載入到記憶體
self.wb = load_workbook(excelPath)
# 通過工作表名稱擷取一個工作表對象
self.sheet = self.wb.get_sheet_by_name(sheetName)
# 擷取工作表中存在資料的地區的最大行號
self.maxRowNum = self.sheet.max_row
def getDatasFromSheet(self):
# 用於存放從工作表中讀取出來的資料
dataList = []
# 因為工作表中的第一行是標題列,所以需要去掉
for line in self.sheet.rows:
# 遍曆工作表中資料區域的每一行,
# 並將每行中各個儲存格的資料取出存於列表tmpList中,
# 然後再將存放一行資料的列表添加到最終資料列表dataList中
tmpList = []
tmpList.append(line[1].value)
tmpList.append(line[2].value)
dataList.append(tmpList)
# 將擷取工作表中的所有資料的迭代對象返回
return dataList[1:]
if __name__ == ‘__main__‘:
excelPath = u‘E:\\資料驅動\\測試資料.xlsx‘
sheetName = u"搜尋資料表"
pe = ParseExcel(excelPath, sheetName)
print pe.getDatasFromSheet()
for i in pe.getDatasFromSheet():
print i[0], i[1]
加print調試日誌:
#encoding=utf-8
from openpyxl import load_workbook
class ParseExcel(object):
def __init__(self,excelPath,sheetName):
self.wb=load_workbook(excelPath)
self.sheet=self.wb.get_sheet_by_name(sheetName)
self.maxRowNum=self.sheet.max_row
def getDatasFromSheet(self):
dataList=[]
for line in self.sheet.rows:
tmpList=[]
tmpList.append(line[1].value)
print "line[1].value",line[1].value
tmpList.append(line[2].value)
print "line[2].value",line[2].value
dataList.append(tmpList)
print dataList[1:]
return dataList[1:]
if __name__==‘__main__‘:
excelPath=u"d:\\test\\0627\\測試資料.xlsx"
sheetName=u"搜尋資料表"
pe=ParseExcel(excelPath,sheetName)
print pe.getDatasFromSheet()
for i in pe.getDatasFromSheet():
print i[0],i[1]
單獨運行結果:
D:\test\0627>python ExcelUtil.py
ExcelUtil.py:7: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
self.sheet=self.wb.get_sheet_by_name(sheetName)
line[1].value 搜尋字詞
line[2].value 期望結果
line[1].value 鄧肯
line[2].value 蒂姆
line[1].value 喬丹
line[2].value 邁克爾
line[1].value 庫裡
line[2].value 斯蒂芬
[[u‘\u9093\u80af‘, u‘\u8482\u59c6‘], [u‘\u4e54\u4e39‘, u‘\u8fc8\u514b\u5c14‘], [u‘\u5e93\u91cc‘, u‘\u65af\u8482\u82ac‘]]
[[u‘\u9093\u80af‘, u‘\u8482\u59c6‘], [u‘\u4e54\u4e39‘, u‘\u8fc8\u514b\u5c14‘], [u‘\u5e93\u91cc‘, u‘\u65af\u8482\u82ac‘]]
line[1].value 搜尋字詞
line[2].value 期望結果
line[1].value 鄧肯
line[2].value 蒂姆
line[1].value 喬丹
line[2].value 邁克爾
line[1].value 庫裡
line[2].value 斯蒂芬
[[u‘\u9093\u80af‘, u‘\u8482\u59c6‘], [u‘\u4e54\u4e39‘, u‘\u8fc8\u514b\u5c14‘], [u‘\u5e93\u91cc‘, u‘\u65af\u8482\u82ac‘]]
鄧肯 蒂姆
喬丹 邁克爾
庫裡 斯蒂芬
最後啟動並執行指令碼:
data_drivern_by_excel.py:
#encoding=utf-8
from selenium import webdriver
import unittest,time
import logging,traceback
import ddt
from ExcelUtil import ParseExcel
from selenium.common.exceptions import NoSuchElementException
#初始化日誌對象
logging.basicConfig(
#記錄層級
level=logging.INFO,
#日誌格式
#時間、代碼所在檔案名稱、程式碼號、記錄層級名稱、日誌資訊
format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,
#列印日誌的時間
datefmt=‘%a,%Y-%m-%d %H:%M:S‘,
#記錄檔存放的目錄(目錄必須存在)及記錄檔名
filename=‘d:\\test\\0627\\report.log‘,
#開啟記錄檔的方式
filemode=‘w‘
)
excelPath=u"d:\\test\\0627\\測試資料.xlsx"
sheetName=u"搜尋資料表"
#建立ParseExcel類的執行個體對象
excel=ParseExcel(excelPath,sheetName)
#資料驅動裝飾器
@ddt.ddt
class TestDemo(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox(executable_path=‘c:\\geckodriver‘)
@ddt.data(*excel.getDatasFromSheet())#對調用函數返回的含列表的列表進行解包,傳過來的就是列表中的一個列表
def test_dataDrivenByFile(self,data):
print "tuple(data):",tuple(data)#把傳過來的一個列錶轉換成元祖,包含兩個元素,搜尋值和期望值
testData,expectData=tuple(data)
print "testData:",testData#調試用
print "expectData:",expectData#調試用
url=‘http://www.baidu.com‘
#訪問百度首頁
self.driver.get(url)
#講瀏覽器視窗最大化
self.driver.maximize_window()
#print testData,expectData
#設定隱式等待時間為10秒鐘
self.driver.implicitly_wait(10)
try:
#擷取當前的時間戳記,用於後面計算查詢耗時用
start=time.time()
#擷取目前時間的字串,表示測試開始時間
startTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
#找到搜尋輸入框,並輸入測試資料
self.driver.find_element_by_id(‘kw‘).send_keys(testData)
#找到搜尋按鈕,並點擊
self.driver.find_element_by_id(‘su‘).click()
time.sleep(3)
#斷言期望結果是否出現在頁面原始碼中
self.assertTrue(expectData in self.driver.page_source)
print u"搜尋-%s,期望-%s"%(testData,expectData)
except NoSuchElementException,e:
logging.error(u"尋找的頁面元素不存在,異常堆棧資訊:"+str(traceback.format_exc()))
except AssertionError,e:
logging.info(u‘搜尋-"%s",期望-"%s",-失敗‘%(testData,expectData))
except Exception,e:
logging.error(u"未知錯誤,錯誤資訊:"+str(traceback.format_exc()))
else:
logging.info(u‘搜尋- "%s",期望-"%s"-通過‘%(testData,expectData))
def tearDown(self):
self.driver.quit()
if __name__==‘__main__‘:
unittest.main()
結果:
d:\test\0627>python test.py
d:\test\0627\ExcelUtil.py:11: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
self.sheet=self.wb.get_sheet_by_name(sheetName)
tuple(data): (u‘\u9093\u80af‘, u‘\u8482\u59c6‘)
testData: 鄧肯
expectData: 蒂姆
搜尋-鄧肯,期望-蒂姆
.tuple(data): (u‘\u4e54\u4e39‘, u‘\u8fc8\u514b\u5c14‘)
testData: 喬丹
expectData: 邁克爾
搜尋-喬丹,期望-邁克爾
.tuple(data): (u‘\u5e93\u91cc‘, u‘\u65af\u8482\u82ac‘)
testData: 庫裡
expectData: 斯蒂芬
搜尋-庫裡,期望-斯蒂芬
.
----------------------------------------------------------------------
Ran 3 tests in 45.614s
OK
report.log:
Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜尋- "鄧肯",期望-"蒂姆"-通過
Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜尋- "喬丹",期望-"邁克爾"-通過
Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜尋- "庫裡",期望-"斯蒂芬"-通過
總結:
如果日誌logging部分書寫格式有問題、或者路徑不存在、或者字元等有問題,日誌就會輸出到螢幕上,如果沒有問題,才會列印到記錄檔report.log中
資料驅動excel驅動方式和其他方式(txt等)原理大同小異,都是把資料從檔案中取出來,用ddt模組進行解包,傳進主程式,痛點就是對不同的檔案類型進行讀取可能需要專門的程式包來處理,說白了,都是對基礎的運用進行整合,真正項目中用到的肯定比這個要複雜。。。
python webdriver 測試架構-資料驅動excel驅動的方式