Selenium3與Python3實戰 Web自動化測試框架
一、關鍵字模型
excel表:
關鍵字模型

通過代碼實現:讀取excel表中上述數據,進行一系列操作,實現自動打開網頁、輸入信息並跳轉
1、excel_operation.py: excel表基本讀寫操作:
import xlrd # 需安裝 from xlutils.copy import copy # xlutils 需安裝 import time from setting.setting import excel_path class Excel_Opertion(object): """excel表數據相關操作""" def __init__(self,ex_path=None,index=None): if ex_path == None: self.excel_path = excel_path # 默認excel文件路徑 else: self.excel_path = ex_path if index == None: index = 0 self.data = xlrd.open_workbook(self.excel_path) self.table = self.data.sheets()[index] # sheets第一頁數據 # 獲取excel數據,按照每行一個list,添加到一個大的list里面 def get_data(self): result = [] rows = self.get_lines() if rows !=None: for i in range(1,rows): row = self.table.row_values(i) # print(row) # ['test001@qq.com', 'Mushishi001', '111111', 'code', 'user_email_error', '請輸入有效的電子郵件地址'] result.append(row) # [['test001@qq.com', 'Mushishi001', '111111', 'code', 'user_email_error', '請輸入有效的電子郵件地址'], ['test002.com', 'Mushishi002', '111112', 'code', 'user_email_error', '請輸入有效的電子郵件地址']] return result return None # 獲取excel行數 def get_lines(self): rows = self.table.nrows # 獲取行數 if rows > 1: return rows return None #獲取單元格的數據 def get_col_value(self,row,col): #print if self.get_lines()>row: data = self.table.cell(row,col).value return data return None #寫入數據 def write_value(self,row,value): read_value = xlrd.open_workbook(self.excel_path) # 打開excel文件 write_data = copy(read_value) # 復制文件,讓xlutils模塊相關操作表 write_data.get_sheet(0).write(row,9,value) # 獲取excel表首頁數據,並在row行9列寫入數據 write_data.save(self.excel_path) # 保存 time.sleep(1)
2、excel_cell_value.py:讀取excel表中各列的數據:
from util.excel_operation import Excel_Opertion class Get_Cells_Value(object): """獲取keyword.xls表單元格數據""" def __init__(self,excel_path): self.case_id = 0 # id self.case_name = 1 # 模塊名稱 self.action_type = 2 # 操作類型:打開瀏覽器、輸入用戶名... self.is_run = 3 # 是否執行 self.action_method = 4 # 執行方法 self.send_value = 5 # 發送的數據 self.oper_element = 6 # 操作元素 self.expect_result = 7 # 預期結果 self.real_result = 8 # 實際結果 self.report_result = 9 # 實際報告,是否通過 self.excel_path = excel_path self.excel_oper = Excel_Opertion(self.excel_path) # 實例化 self.get_lines = self.excel_oper.get_lines() # 獲取行數 def get_case_id(self,row): # 獲取case id case_id = self.excel_oper.get_col_value(row,self.case_id) return case_id def get_case_name(self,row): # 獲取case名稱 case_name = self.excel_oper.get_col_value(row,self.case_name) return case_name def get_is_run(self,row): # 獲取是否執行:yes/no ,用於判斷該case是否運行 is_run = self.excel_oper.get_col_value(row,self.is_run) return is_run def get_action_method(self,row): # 獲取操作的方法 action_method = self.excel_oper.get_col_value(row,self.action_method) return action_method def get_send_value(self,row): # 獲取要輸入的數據 send_value = self.excel_oper.get_col_value(row,self.send_value) return send_value def get_oper_element(self,row): # 獲取操作的元素 oper_element = self.excel_oper.get_col_value(row,self.oper_element) return oper_element def get_expect_result(self,row): # 獲取預期結果 expect_result = self.excel_oper.get_col_value(row,self.expect_result) return expect_result def get_real_result(self,row): # 獲取實際結果 real_result = self.excel_oper.get_col_value(row,self.real_result) return real_result def get_report_result(self,row): # 獲取報告 report_result = self.excel_oper.get_col_value(row,self.report_result) return report_result
3、actionMethod.py:對應excel表中第 5列的 執行方法,實現:打開瀏覽器、定位對應元素、實現自動輸入信息、關閉瀏覽器等:
#coding=utf-8 from selenium import webdriver from base.find_element import FindElement import time class ActionMethod(object): """用於執行 keyword.xls表指定方法""" #打開瀏覽器 def open_browser(self,browser): try: if browser == 'chrome': self.driver = webdriver.Chrome() elif browser == 'firefox': self.driver = webdriver.Firefox() else: self.driver = webdriver.Edge() except: print("ActionMethodError:沒有'{}'這個元素".format(browser)) #輸入地址 def get_url(self,url): try: self.driver.get(url) except: print("ActionMethodError:url:{},輸入有誤".format(url)) #定位元素 def get_element(self,key): try: find_element = FindElement(self.driver) element = find_element.get_element(key) return element except: print("ActionMethodError:'{}'元素定位失敗".format(key)) #輸入信息 def element_send_keys(self,value,key): try: element = self.get_element(key) element.send_keys(value) except: print("ActionMethodError:輸入有誤:'{}'".format(value)) #點擊元素 def click_element(self,key): try: self.get_element(key).click() except: print("ActionMethodError:'{}'元素不存在,無法點擊".format(key)) #等待 def sleep_time(self): time.sleep(3) #關閉瀏覽器 def close_browser(self): self.driver.close() #獲取title def get_title(self): title = self.driver.title return title
4、 keyword_case.py:實現:讀取excel表中每行各列數據,通過getattr方法映射對應方法,實現自動化操作:
from util.excel_cell_value import Get_Cells_Value from keyword_model.actionMethod import ActionMethod from setting import setting class KeywordCase(object): def __init__(self): self.action_metood = ActionMethod() excel_default_path = setting.excel_keyword_path self.get_cell_value = Get_Cells_Value(excel_default_path) # 實例化 def run_main(self): get_lines = self.get_cell_value.get_lines # 獲取行數 if get_lines: for i in range(1,get_lines): is_run = self.get_cell_value.get_is_run(i) if is_run == 'yes': carry_method = self.get_cell_value.get_action_method(i) # 獲取執行方法 send_value = self.get_cell_value.get_send_value(i) # 獲取輸入的數據 oper_element = self.get_cell_value.get_oper_element(i) # 獲取操作的元素 expect_result = self.get_cell_value.get_expect_result(i) # 獲取預期結果 real_result = self.get_cell_value.get_real_result(i) # 獲取實際結果 self.run_method(carry_method,send_value,oper_element) # 執行excel表中對應指定的方法 def run_method(self,method,send_value = '',handle_value = ''): main_method = getattr(self.action_metood,method) if send_value == '' and handle_value =='': result = main_method() # 關閉瀏覽器、等待等 elif send_value == '' and handle_value != '': result = main_method(handle_value) # 打開瀏覽器、訪問url等 elif send_value != '' and handle_value == '': result = main_method(send_value) # 暫時沒用到 else: result = main_method(send_value,handle_value) # 輸入用戶信息 if __name__ == "__main__": keyword_case = KeywordCase() keyword_case.run_main()
實現自動操作:
- 打開瀏覽器
- 訪問指定url
- 注冊:自動定位→輸入相應用戶信息
- 點擊注冊按鈕提交
- 等待3秒
- 關閉瀏覽器

5、關鍵字模型中之獲取測試結果並保存到excel表中
獲取預期結果,如果預期結果有值則表示需要進行報告填寫。將實際要求結果跟我們獲取到的預期結果做對比,如果匹配成功表示通過(pass),否則表示失敗(fail)
1)因為要將數據寫入excel表中,需要在 excel_cell_value.py 文件中添加一段代碼,用於寫數據到excel表中:
def write_cell_value(self,row,value): # 在指定單元格寫入數據 self.excel_oper.write_value(row,self.report_result,value) #寫入數據 #excel_operation.py文件 def write_value(self,row,col,value): read_value = xlrd.open_workbook(self.excel_path) # 打開excel文件 write_data = copy(read_value) # 復制文件,讓xlutils模塊相關操作表 write_data.get_sheet(0).write(row,col,value) # 獲取excel表首頁數據,並在row行9列寫入數據 write_data.save(self.excel_path) # 保存 time.sleep(1)
2)根據實際要求結果,跟測試時獲取到預測結果,將兩者進行比較,判斷單條case測試是否通過
實際要求結果格式:text=注冊 、 element=password_error 等
預期結果方法:get_title -->獲取網頁title 、 get_element -->獲取定位元素
通過實現預期結果方法,獲取預期結果值,跟實際要求結果進行匹配。
部分代碼:
expect_result_mothod = self.get_cell_value.get_expect_result(i) # 獲取預期結果方法 real_result_value = self.get_cell_value.get_real_result(i) # 獲取表中實際要求結果值 if expect_result_mothod != '': # 預期結果有值 result_value = self.get_real_result_value(real_result_value) if result_value[0] == 'text': # url訪問,獲取網頁title result = self.run_method(expect_result_mothod) # expect_result_mothod:driver.get_title()方法 if result_value[1] in result: # 判斷實際要求結果值是否存在於實際測試結果中 self.get_cell_value.write_cell_value(i,'pass') # 在excel表中對應單元格寫入數據 else: self.get_cell_value.write_cell_value(i,'fail') elif result_value[0] == 'element': # 獲取元素,判斷輸入格式等 result = self.run_method(expect_result_mothod,result_value[1]) # expect_result_mothod:get_element()方法,result_value[1]:參數 if result: # 有值,表示找到對應(如:password_error)錯誤信息,表示格式測試通過(目的就是測試輸入錯誤格式是否會被檢查出來) self.get_cell_value.write_cell_value(i,'pass') else: self.get_cell_value.write_cell_value(i,'fail') else: print("Error:實際要求結果:{},測試無效".format(real_result_value)) else: print('預期結果為空') def run_method(self,method,send_value = '',handle_value = ''): main_method = getattr(self.action_metood,method) if send_value == '' and handle_value =='': result = main_method() # 關閉瀏覽器、等待等 elif send_value == '' and handle_value != '': result = main_method(handle_value) # 打開瀏覽器、訪問url等 elif send_value != '' and handle_value == '': result = main_method(send_value) # 暫時沒用到 else: result = main_method(send_value,handle_value) # 輸入用戶信息 # 對實際要求結果值進行切分(實際要求結果形似:text=注冊) def get_real_result_value(self, data): return data.split('=')
執行結果:報告一列自動輸入匹配結果

keyword_case.py完整代碼:
from util.excel_cell_value import Get_Cells_Value from keyword_model.actionMethod import ActionMethod from setting import setting class KeywordCase(object): def __init__(self): self.action_metood = ActionMethod() excel_default_path = setting.excel_keyword_path self.get_cell_value = Get_Cells_Value(excel_default_path) # 實例化 def run_main(self): get_lines = self.get_cell_value.get_lines # 獲取行數 if get_lines: for i in range(1,get_lines): is_run = self.get_cell_value.get_is_run(i) if is_run == 'yes': carry_method = self.get_cell_value.get_action_method(i) # 獲取執行方法 send_value = self.get_cell_value.get_send_value(i) # 獲取輸入的數據 oper_element = self.get_cell_value.get_oper_element(i) # 獲取操作的元素 expect_result_mothod = self.get_cell_value.get_expect_result(i) # 獲取預期結果 real_result_value = self.get_cell_value.get_real_result(i) # 獲取表中實際要求結果值 self.run_method(carry_method,send_value,oper_element) # 執行excel表中對應指定的方法 if expect_result_mothod != '': # 預期結果有值 result_value = self.get_real_result_value(real_result_value) if result_value[0] == 'text': # url訪問,獲取網頁title result = self.run_method(expect_result_mothod) # expect_result_mothod:driver.get_title()方法 if result_value[1] in result: # 判斷實際要求結果值是否存在於實際測試結果中 self.get_cell_value.write_cell_value(i,'pass') # 在excel表中對應單元格寫入數據 else: self.get_cell_value.write_cell_value(i,'fail') elif result_value[0] == 'element': # 獲取元素,判斷輸入格式等 result = self.run_method(expect_result_mothod,result_value[1]) # expect_result_mothod:get_element()方法,result_value[1]:參數 if result: # 有值,表示找到對應(如:password_error)錯誤信息,表示格式測試通過(目的就是測試輸入錯誤格式是否會被檢查出來) self.get_cell_value.write_cell_value(i,'pass') else: self.get_cell_value.write_cell_value(i,'fail') else: print("Error:實際要求結果:{},測試無效".format(real_result_value)) else: print('預期結果為空') def run_method(self,method,send_value = '',handle_value = ''): main_method = getattr(self.action_metood,method) if send_value == '' and handle_value =='': result = main_method() # 關閉瀏覽器、等待等 elif send_value == '' and handle_value != '': result = main_method(handle_value) # 打開瀏覽器、訪問url等 elif send_value != '' and handle_value == '': result = main_method(send_value) # 暫時沒用到 else: result = main_method(send_value,handle_value) # 輸入用戶信息 # 對實際要求結果值進行切分(實際要求結果形似:text=注冊) def get_real_result_value(self, data): return data.split('=') if __name__ == "__main__": keyword_case = KeywordCase() keyword_case.run_main()
