接上一篇PageObject三层架构模式实现,发现我们的用户名和密码都是在代码中写死的,如果要测试不同用户名和密码的登录,那么每执行一次就要修改一次代码。这样效果非常不好。
因此本篇文章介绍如何实现数据驱动并且记录下每次操作的日志。
在上一篇文章的基础下,我们再增加两个文件夹,一个TestData文件夹用来存放测试数据,一个Logs文件夹用来存放执行过程中记录的日志信息。
1:先来简单看一下目录结构:
整体目录结果不变,增加了两个文件夹
2:我们把需要用到的参数都放到excel文件中,再将excel文件放到TestData文件夹下,excel文件的内容如下(仅参考):
接下来,就是把excel文件中的内容读取出来。
在Util文件夹下,创建一个excel_parse.py文件,用来读取excel中的内容,具体内容如下:
from openpyxl import load_workbook
from Setting.Config import Test_Data_Path
class ExcelParse:
def __init__(self):
self.workbook = None
self.sheet = None
def load_workbook(self, filename):
'''加载文件'''
try:
self.workbook = load_workbook(filename)
except Exception as e:
raise e
def get_sheet_by_name(self, sheetname):
'''根据sheetname加载某一页'''
try:
self.sheet = self.workbook[sheetname]
except Exception as e:
raise e
def get_row_num(self):
'''返回行数'''
return self.sheet.max_row
def get_col_num(self):
'''返回列数'''
return self.sheet.max_column
def get_cell_value(self, row, col):
'''获取某一单元格的值'''
try:
cell_value = self.sheet.cell(row=row, column=col).value
return cell_value
except Exception as e:
raise e
def get_row_value(self, row):
'''返回某一行的值'''
try:
cols = self.get_col_num()
row_value = []
for i in range(1, cols+1):
# row_value.append(self.sheet.cell(row=row, column=i).value)
row_value.append(self.get_cell_value(row, i))
return row_value
except Exception as e:
raise e
if __name__ == '__main__':
excel = ExcelParse()
excel.load_workbook(Test_Data_Path)
excel.get_sheet_by_name('login')
res = excel.get_row_value(2)
print(res)
3:接下来就可以修改pageobject三层架构的第三层,业务层test_login.py文件的内容,修改内容如下:
from Module.login import Login
from Util.excel_parse import ExcelParse
from Setting.Config import Test_Data_Path
from selenium import webdriver
def test_login():
try:
# 获取数据
excel = ExcelParse()
excel.load_workbook(Test_Data_Path)
excel.get_sheet_by_name('login')
rows = excel.get_row_num()
row1_value = excel.get_row_value(1)
# 遍历每一行数据
for i in range(2, rows+1):
tmp_row_value = excel.get_row_value(i)
# 将表头与数据聚合成一个字典,方便调用
tmp_dict = dict(zip(row1_value, tmp_row_value))
print(tmp_dict)
username = tmp_dict['用户名']
password = tmp_dict['密码']
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')
login = Login()
login.login(driver, username, password)
except Exception as e:
raise e
如此就实现了参数化,想传什么参数,直接修改excel文件即可。
4:最后是记录日志,记录日志用的是第三方库:loguru模块
首先先安装loguru模块(pip install loguru)
接下来创建一个Logs文件夹,用来存放日志文件。
在Util文件夹下创建一个日志工具类log_util.py文件,具体内容如下:
from loguru import logger
from Setting.Config import Log_Path
class Log:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, 'instance'):
cls.instance = super(Log, cls).__new__(cls)
return cls.instance
def __init__(self):
logger.add(Log_Path + '/runtime_{time}.log') # 日志存放位置及日志名称
def debug(self, message):
logger.debug(message)
def info(self, message):
logger.info(message)
def warning(self, message):
logger.warning(message)
def error(self, message):
logger.error(message)
log = Log()
5:在pageobject的对象层(loginpage.py文件),导入log,并对操作进行记录,如下:
# 对象层
from selenium import webdriver
from Util.find_ele import find_element
from Util.read_ini import ParseConfigFile
from Util.log_util import log
class LoginPage:
def __init__(self, driver):
self.driver = driver
def input_username(self, username):
'''定位用户名输入控件,并输入用户名'''
log.info('定位用户名输入框,并输入用户名')
find_element(self.driver, 'name', 'email').send_keys(username)
def input_password(self, password):
'''定位密码输入控件,并输入密码'''
log.info('定位密码输入框,并输入密码')
find_element(self.driver, 'name', 'password').send_keys(password)
def switch_frame(self):
'''切换iframe'''
log.info('切换iframe')
frame = find_element(self.driver, 'tag name', 'iframe')
self.driver.switch_to.frame(frame)
def login_click(self):
'''点击登录'''
log.info('定位登录按钮,并点击登录')
find_element(self.driver, 'id', 'dologin').click()
if __name__ == '__main__':
driver = webdriver.Chrome()
# 访问网址
driver.get('https://mail.163.com/')
login = LoginPage(driver) # 初始化LoginPage类
# 执行登录操作
login.switch_frame()
login.input_username('12345')
login.input_password('123456')
login.login_click()
如此,一个简单的pageobject框架就完成。其中呢还有一些可以优化的地方,这里就不再进行优化了,可以根据自己的想法对代码进行优化,这只是给自己刚学习使用pageobject三层架构的一个记录。