关键字驱动
从面向对象的思路出发,同样的业务逻辑会自然的编写成一个类或者函数作为关键字来被不同的测试脚本所调用。
关键字驱动其实就是通过自定义的函数,来解决重复的测试行为的操作。来提升代码的灵活性,降低代码的冗余。
主要关键字包括三类:被操作对象(Item)、操作行为(Operation)和操作值(Value)
excel数据驱动
优势:学习成本低
劣势:维护成本高
使用openpyxl对excel文件进行操作
关键字驱动+excel数据驱动实现fecmall登录流程
web_keys.py
对selenium进行二次封装,封装常见的元素操作:打开浏览器,定位,点击,输入,断言,select
'''
关键字驱动
selenium的二次封装。将常用部分提取,封装成自定义类,后续调用
'''
import traceback
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.select import Select
def open_browser(type_):
browser={
'Chrome':['chrome','Chrome','gc','谷歌浏览器'],
'FireFox':['FireFox','firefox','ff','火狐浏览器'],
'Edge':['edge','Edge']
}
for key,value in browser.items():
if type_ in value:
try:
#etattr(webdriver, option_)()等价于webdriver.option_()。这里的option_就是需要传入的驱动。
driver = getattr(webdriver,key)()
except:
driver = webdriver.Edge()
break
return driver
class WebKeys:
# 构造函数:解决不同浏览器的实例化需求
def __init__(self,type_):
self.driver = open_browser(type_)
def open(self,url):
self.driver.get(url)
def locator(self,by,value):
return self.driver.find_element(by,value)
def input(self,by,value,txt):
self.locator(by,value).send_keys(txt)
def click(self,by,value):
self.locator(by,value).click()
def quit(self):
self.driver.quit()
def wait(self,time):
sleep(int(time))
def window_max(self):
self.driver.maximize_window()
# select标签
# select = Select(driver.find_element('id','hgh'))
# select.select_by_index(1) #基于下标选择值,从1开始
# select.select_by_value("5") #基于option的value属性选择
# select.select_by_visible_text('天津') #基于文本选择
def select_value(self,by,value,txt):
select = Select(self.locator(by,value))
select.select_by_value(txt)
# 文本断言
def assert_equal(self,by,value,expected):
try:
reality = self.locator(by,value).text
assert reality==expected,f'''
断言失败:
reality = {reality}
expected = {expected}
{reality} != {expected}
'''
return True
except:
traceback.print_exc()
return False
数据样式
通过openpyxl库的调用,读取excel内容,然后进行后续的数据处理,操作行为、参数与web_key.py封装的方法对应
log_conf.ini
日志配置文件内容
[loggers]
keys = root
[handlers]
keys = fileHandler,streamHandler
[formatters]
keys = simpleFormatter
[logger_root]
level=DEBUG
handlers = fileHandler,streamHandler
[handler_fileHandler]
class = FileHandler
level = DEBUG
formatter = simpleFormatter
args = ('log_conf.log','a','utf-8')
[handler_streamHandler]
class = StreamHandler
level = DEBUG
formatter = simpleFormatter
[formatter_simpleFormatter]
format = %(levelname)s %(asctime)s %(filename)s %(lineno)s:%(message)s
logging_conf.py
配置日志
# 封装版本的日志记录器的函数
'''
日志配置文件形态,生成日志内容,实现日志输出与记录
'''
import pathlib
# 日志配置文件获取实例
import logging.config
import logging
def getLogger():
file = './conf/log_conf.ini'
logging.config.fileConfig(file)
logger = logging.getLogger()
return logger
excel_driver.py
1.处理excel内容,将参数处理成字典的形式
2.定义操作行为,操作行为有三种:open_broswer,断言,常规操作
3.完成日志收集
'''
实现excel的数据驱动,管理自动化测试数据
基于excel文件中的内容,实现对应的操作行为,从而满足自动化
'''
import traceback
import openpyxl
# 参数解析
from web_ui_v4.conf.logging_config import getLogger
from web_ui_v4.excel_driver import excel_style
from web_ui_v4.web_keys.web_keys import WebKeys
def argument(data):
temp_data = dict()
if data:
str_temp=data.split(';') #;进行分割
for temp in str_temp:
t = temp.split('=',1) #=拆分,左边是key,右边是value,只分割一次,防止分割xpath失误
#字典赋值
temp_data[t[0]] = t[1]
return temp_data
# 定义测试数据的初始化
success = 0 #成功用例数
fail =0 #失败用例数
fail_list=[] #失败用例文件列表
# 参数解析
def run(test_case):
global success,fail
log = getLogger()
excel = openpyxl.load_workbook(test_case)
try:
sheet = excel['Sheet1']
for value in sheet.values:
if (type(value[0]) is int):
# 2.参数用于执行过程中的函数参数传递
data = argument(value[2])
# 1.操作行为用于驱动代码,实现函数的调用,满足测试行为
# 行为有三部分,类的实例化,常规操作,断言
if value[1] == 'open_broswer':
wb = WebKeys(**data)
elif 'assert' in value[1]:
status = getattr(wb,value[1])(expected=value[4],**data)
if status:
excel_style.pass_(sheet.cell(row=value[0]+2,column=6))
success +=1
else:
excel_style.failed_(sheet.cell(row=value[0] + 2, column=6))
fail+=1
fail_list.append(test_case)
excel.save(test_case)
else:
getattr(wb,value[1])(**data)
# 3.描述可以用于日志的显示
log.info(value[3])
except:
log.error('运行出现错误')
traceback.print_exc()
finally:
excel.close()
log.warning(f'''
用例总计执行:{success+fail}
成功用例数{success}个
失败用例数{fail}个
失败用例详情:{fail_list}
''')
日志信息