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):#如果存在則寫入日誌
http://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: http://logger.info(******************************) http://logger.info(執行 %s 測試場景 %testcasefile ) #載入測試用例讀取函數,並返回其返回值,以判斷用例讀取情況 flag=read_testcase(testcasefile) #如果用例讀取函數返回為False,則說明用例讀取錯誤if flag==False:
http://logger.info(測試用例執行失敗) #如果執行狀態為not,說明當前用例無須執行 elif testoperation == not: http://logger.info(%s 場景無須測試 % testcasefile) #如果既不是do,又不是not,則報告錯誤 else: http://logger.info(執行參數錯誤,請檢查%s %testcasefile) #如果執行狀態錯誤,則跳出循環,停止測試 break#如果測試集文件錯誤,則寫入日誌,並提示錯誤原因
else: http://logger.info(未發現:%s,請檢查文件是否正確 % tsname) #返回測試集執行函數狀態,便於run.py中的unittest中記錄該狀態 read_testsuite = False #返回測試集執行函數執行狀態 return read_testsuite2.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: http://logger.info(未知瀏覽器類型,請檢查測試用例) #啟動沒有問題後載入測試路徑並返回driver對象 driver.get(testdata) get_driver = driver else: #如果測試用例中的啟動參數錯誤,則寫入日誌並給予提示http://logger.info(瀏覽器數據錯誤,請檢查測試用例配置)
get_driver = False return get_driver3.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_script4.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文件 http://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==瀏覽器: http://logger.info(正在啟動瀏覽器) testdriver=get_driver(testpage, teststep, testdata) else: #如果不是瀏覽器,則說明需執行測試用例,調用測試用例執行函數 flag=exec_script(testdriver,testpage, teststep, testdata) #執行完成後退出瀏覽器 testdriver.quit() else: #如果測試用例文件不存在,則寫入日誌,並提示檢查文件是否存在 http://logger.info(未發現 %s 測試用例,請確認該用例是否存在 %testcasefile) #測試用例讀取失敗,狀態標誌位設置為False read_testcase = False #返回測試用例讀取函數的狀態,便於read_testsuite函數調用判斷 return read_testcase推薦閱讀:
※編程界有哪些不懂編程的人也能聽得懂的笑話?
※Python為什麼直接運行和在命令行運行同樣語句但結果卻不同,他們的緩存機制不同嗎?
※Python · SVM(四)· SMO 演算法
※Python資料庫起航篇|零基礎起步
※[python,pandas]數據分析求職指南——獵聘網數據分析職位解析