Selenium Page Object 自動化測試框架-script測試腳本設計

script

script目錄創建時選擇「Python Package」格式。測試引擎腳本存放路徑,如測試執行時驅動所有測試業務、測試用例的腳本文件module.py。

module.py包含測試集讀取函數read_testsuite、獲取驅動函數get_driver、測試用例讀取函數read_testcase、測試執行函數exec_script。

1.read_testsuite

read_testsuite函數負責解析測試場景文件。os.path.abspath方法獲取當前腳本的執行路徑,以便於data目錄中的testsuite.xlsx測試場景文件。通過引用os.path方式,增強了腳本的可移植性。

測試腳本代碼用for irow in range(2, ws.max_row + 1)循環迭代讀取測試場景文件testsuite.xlsx中的每一行記錄,通過傳入的測試場景名稱,先判斷是否存在需測試的場景名稱,如果有則再用if testoperation==do判斷是否要獲取第三項中保存的場景文件名。這裡關鍵字do代表的是執行,第二列的關鍵字可以根據將來的需要進一步拓展,設計更多的關鍵字。

read_testsuite代碼如下:

#創建讀取測試集函數

def read_testsuite(tsname):

#設置測試用例讀取執行狀態標誌位

flag = True

#設置讀取測試集函數執行狀態標誌位

read_testsuite = True

#判斷測試集文件是否存在

if os.path.exists(tsname):

#如果存在則寫入日誌

logger.info(已找到TestSuite文件,開始分析測試集...)

#創建excel操作對象

wbexcel = load_workbook(tsname)

sheetnames = wbexcel.get_sheet_names()

ws = wbexcel.get_sheet_by_name(sheetnames[0])

#分析測試集文件中的執行信息:執行標誌位及測試腳本名稱,從第二行開始

for irow in range(2,ws.max_row+1):

#獲取測試集文件中的執行標誌位值,從第二行開始,第二列

testoperation = ws.cell(row=irow, column=2).value

#獲取測試集文件中的測試用例名稱,從第二行開始,第三列

testcasefile = ws.cell(row=irow, column=3).value

#判斷執行標誌位是否需要執行,如果是do,則調用測試用例執行函數,如果是not,則不執行,如果是其他

#值,則寫入日誌,報告執行參數錯誤,並指出是哪個用例執行參數錯誤

if testoperation == do:

logger.info(******************************)

logger.info(執行 %s 測試場景 %testcasefile )

#載入測試用例讀取函數,並返回其返回值,以判斷用例讀取情況

flag=read_testcase(testcasefile)

#如果用例讀取函數返回為False,則說明用例讀取錯誤

if flag==False:

logger.info(測試用例執行失敗)

#如果執行狀態為not,說明當前用例無須執行

elif testoperation == not:

logger.info(%s 場景無須測試 % testcasefile)

#如果既不是do,又不是not,則報告錯誤

else:

logger.info(執行參數錯誤,請檢查%s %testcasefile)

#如果執行狀態錯誤,則跳出循環,停止測試

break

#如果測試集文件錯誤,則寫入日誌,並提示錯誤原因

else:

logger.info(未發現:%s,請檢查文件是否正確 % tsname)

#返回測試集執行函數狀態,便於run.py中的unittest中記錄該狀態

read_testsuite = False

#返回測試集執行函數執行狀態

return read_testsuite

2.get_driver

根據測試場景文件確定調用何種瀏覽器,並啟動瀏覽器。

#定義瀏覽器啟動函數,本次並沒有使用common中定義的browserlauncher函數,讀者可自行擴展改寫

def get_driver(testpage,teststep,testdata):

#設置瀏覽器啟動函數執行狀態,便於後續運行控制

get_driver = True

#判斷測試用例中是否需要啟動瀏覽器,如果需要,則判斷啟動哪種瀏覽器

if testpage == 瀏覽器:

#考慮測試用例中的step大小寫問題,讀者自行研究解決

if teststep == firefox:

driver = webdriver.Firefox()

elif teststep == ie:

driver = webdriver.Ie()

elif teststep == chrome:

driver = webdriver.Chrome()

#如果瀏覽器類型設置錯誤,寫入日誌並給予提示

else:

logger.info(未知瀏覽器類型,請檢查測試用例)

#啟動沒有問題後載入測試路徑並返回driver對象

driver.get(testdata)

get_driver = driver

else:

#如果測試用例中的啟動參數錯誤,則寫入日誌並給予提示

logger.info(瀏覽器數據錯誤,請檢查測試用例配置)

get_driver = False

return get_driver

3.exec_script

exec_script(testpage,teststep,testaction,testdata)功能是接受testpage,teststep,testdata三個參數,分別代表主頁類(對象),頁面元素,頁面數據。代碼首先判斷主頁類(testpage)屬於那個類,這些類是已經實現的page object類。testpage類中有一個是瀏覽器類,是Webdriver實現的。腳本分別實現了三個類的testpage判斷,分別是瀏覽器、登陸頁面類、主頁頁面類三個類。

第一個根據testpage是否是瀏覽器類後,按照teststep判斷瀏覽器類型firefox、IE及chrome生成對象實例,最後請求testdata變數保存的網頁鏈接。

第二個根據testpage是否是登陸頁面類後,判斷執行teststep用戶名或密碼等動作,來執行頁面對象的操作,操作數據用傳入的testdata.

第二個根據testpage是否是主頁頁面類後,判斷teststep是否執行退出ECShop動作。

exec_script代碼如下:

#定義測試用例執行函數,共有四個參數

def exec_script(driver,testpage, teststep, testdata):

#定義測試用例執行函數狀態標誌位

exec_script = True

try:

#登陸功能測試

if testpage == 登錄:

url = driver.current_url

url = geturl(url) + user.php

if driver.current_url != url:

driver.get(url)

login = LoginPage(driver, testdata)

if teststep == 用戶名:

login.input_username(testdata)

if teststep == 密碼:

login.input_password(testdata)

if teststep == 登錄:

login.click_submit()

time.sleep(5)

#註冊功能測試

if testpage == 註冊:

url = driver.current_url

url = geturl(url) + user.php?act=register

if driver.current_url != url:

driver.get(url)

userreg = RegistePage(driver, testdata)

if teststep == 用戶名:

userreg.input_username(testdata)

if teststep == email:

userreg.input_email(testdata)

if teststep == 密碼:

userreg.input_password(testdata)

if teststep == 確認密碼:

userreg.input_comfirpwd(testdata)

time.sleep(8)

if teststep == 註冊:

userreg.click_submit()

time.sleep(5)

if testpage == 主頁:

time.sleep(3)

url = driver.current_url

mainpage = MainPage(driver, url)

if teststep == 搜索:

mainpage.search_goods(testdata)

time.sleep(3)

if teststep == 購買:

mainpage.buy_goods()

time.sleep(3)

if teststep == 退出:

mainpage.exit_sys()

time.sleep(3)

if testpage == 其他主頁:

pass

except:

exec_script = False

url = geturl(driver.current_url)

driver.get(url)

return exec_script

4.read_testcase

read_testcase(testcasefile)是解析testcase文件如login.xlsx,userregister.xlsx等,參數是測試用例文件路徑。for irow in range(2, ws.max_row + 1)是從第二行開始遍歷,ws.max是獲得測試用例文件有測試腳本指令的行數,參數從2開始,是因為第一行是標題,第二行開始才是正式腳本。Testpage,teststep,testdata分別保存了測試用例文件(userregister.xlsx,login.xlsx)中的page,step,data數據,它們代表了頁面類,元素對象,元素數據。然後作為參數傳給exec_script函數。

read_testcase代碼如下:

#定義測試用例讀取函數

def read_testcase(testcasefile):

#設置測試用例讀取函數狀態標誌位

read_testcase = True

#根據read_testsuite函數中給出的testcasefile測試用例名,拼接測試用例路徑信息

testcasefile=os.path.abspath(.)+\data\+testcasefile+.xlsx

#判斷需讀取執行的測試用例文件是否存在

if os.path.exists(testcasefile):

#如果存在,則寫日誌,並讀取該用例的excel文件

logger.info(已找到 %s 測試用例,現在開始讀取該用例 %testcasefile)

wbexcel = load_workbook(testcasefile)

sheetnames = wbexcel.get_sheet_names()

ws = wbexcel.get_sheet_by_name(sheetnames[0])

#讀取測試用例中每個列的值,以便調用瀏覽器啟動函數或執行測試用例函數

for irow in range(2, ws.max_row + 1):

testpage = ws.cell(row=irow, column=1).value

teststep = ws.cell(row=irow, column=2).value

testdata = ws.cell(row=irow, column=4).value

#如果是瀏覽器,說明需啟動瀏覽器,調用瀏覽器啟動函數

if testpage==瀏覽器:

logger.info(正在啟動瀏覽器)

testdriver=get_driver(testpage, teststep, testdata)

else:

#如果不是瀏覽器,則說明需執行測試用例,調用測試用例執行函數

flag=exec_script(testdriver,testpage, teststep, testdata)

#執行完成後退出瀏覽器

testdriver.quit()

else:

#如果測試用例文件不存在,則寫入日誌,並提示檢查文件是否存在

logger.info(未發現 %s 測試用例,請確認該用例是否存在 %testcasefile)

#測試用例讀取失敗,狀態標誌位設置為False

read_testcase = False

#返回測試用例讀取函數的狀態,便於read_testsuite函數調用判斷

return read_testcase


推薦閱讀:

編程界有哪些不懂編程的人也能聽得懂的笑話?
Python為什麼直接運行和在命令行運行同樣語句但結果卻不同,他們的緩存機制不同嗎?
Python · SVM(四)· SMO 演算法
Python資料庫起航篇|零基礎起步
[python,pandas]數據分析求職指南——獵聘網數據分析職位解析

TAG:Selenium | 自動化測試 | Python |