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()
未来的你,会感谢现在努力的你!