上篇文章实现了数据驱动,接下来对使用数据之后的结果进行判定(先不使用unittest等框架,纯手写)
一.手动断言
加上如下这段代码就是一个简单的断言了。
根据except_result来判断将要进行的判定:
如果是登录成功,就判断页面内id为spnUid的元素值是否为用户名
如果是登录失败,判定下图所取元素的值是否为账号或密码错误。亲测这边使用id定位会报错,所以我用的是xpath来定位。
判定成功后在字典的最后一位写入结果,不过这里仅仅是写入字典而已,我们应该写入excel。
在ExcelOperate.py文件中写入一个函数,用以修改excel单元格里的数据,修改完记得用save函数保存一下,否则修改不生效。
贴一下这部分函数的代码,ExcelOperate.py整个文件的代码在上一篇贴过了,这里不重复贴了。
def modify_cell(self,row,column,data):
'''
在单元格内写入数据
:param row:
:param column:
:param data:
:return:
'''
self.sheet.cell(row=row,column=column).value = data
self.workbook.save(xlsxPath)
接着在业务层代码里调用一下刚写的这个函数就行了哦。
测试结果写入成功。
最后贴一下修改后的LoginCases.py代码:
import time
from selenium import webdriver
from ConfigFiles.ConfigPath import xlsxPath
from Modules.LoginAction import LoginAction
from Utils.ExcelOperate import ExcelOperate
from Utils.fin_ele import find_element
def test_login():
login_action = LoginAction()
excelOperate = ExcelOperate()
excelOperate.load_workbook(xlsxPath)
excelOperate.get_sheet_by_name('Sheet1')
#获取最大行数
row_nums = excelOperate.get_rows_nums()
#获取第一行的值
row_1_values = excelOperate.get_row_values(1)
for i in range(2,row_nums+1):
row_values = excelOperate.get_row_values(i)
#第一行与其他行组装成一个字典
#zip函数将可迭代的两个对象中的对应的元素一一映射并打包成元组,并将所有这些元组放入一个列表中
values = dict(zip(row_1_values,row_values))
# is_executed的值为y则代表这行数据要执行
if values['is_executed'] == 'y':
username = values['username']
password = values['password']
#申明driver
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')
driver.maximize_window()
login_action.do_login(driver, username, password)
#判定登录成功
if values['except_result'] == '登录成功':
try:
if find_element(driver,'id','spnUid').text == 'lsqtester001@163.com':
values['test_result'] = '登录成功'
excelOperate.modify_cell(i,7,'登录成功')
except Exception as e:
print(e)
#判定登录失败
if values['except_result'] == '登录失败':
try:
if find_element(driver,'xpath','/html/body/div[2]/div[2]/div[2]/form/div/div[7]/div[2]').text == '帐号或密码错误':
values['test_result'] = '登录失败'
excelOperate.modify_cell(i,7,'登录失败')
except Exception as e:
print(e)
time.sleep(2)
driver.quit()
if __name__ == '__main__':
test_login()
二.其他辅助模块
日志模块,每次用例的执行都需要打印相应的日志。
安装loguru模块
在Utils包下新建一个Logger.py文件,封装打印日志所需要的方法
试着打印一条日志
这边虽然已经pip install 过loguru这个包了,但这里导入报错。原因如下:
打开file,settings,点击python interpreter,当前项目使用的解释器里并不包含loguru这个包。
更换一下,换成在python安装目录的那个解释器即可。
看一下打印效果
在项目下新建一个包,用来专门存放打印的日志文件,之后的日志记录将会输出到这里
回到Logger.py,继续完善这个文件
注意这个特殊的写法,代表这个类只能被引用一次,打印日志的类不需要被不停地调用。
完善一下,将loguru模块里的各个方法在这个文件里封装一下。
贴一下代码:
import time
from loguru import logger
# logger.debug('this is a debug message')
# logger.info('this is a info message')
# logger.warning('this is a warning message')
# logger.error('this is a error message')
# logger.success('this is a success message')
# logger.critical('this is a critical message')
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):
'''
根据时间生成.log文件
'''
logger.add('runtime_{}.log'.format(time.time()))
def debug(self,message):
logger.debug(message)
def info(self,message):
logger.info(message)
def error(self,message):
logger.error(message)
def warning(self,message):
logger.warning(message)
然后开始在其他文件里使用loguru模块里的方法。
在模块层里尝试使用log功能(也可以在其他文件里,loguru的打印与print没太大区别),打开Modules包下的LoginAction.py文件,加入log打印代码
运行 一下,成功打印,并根据时间生成.log文件
我们也可以做如下改动,在包下建一个文件夹专门存放日志。
我们也可以将log文件创建到别的包下面,哎,就是玩儿^ - ^
在ConfigPath里获取之前创建的包Logging的路径
再使用上一步获得的logPath变量,对代码进行如下改动
log日志就打印到一个专门准备的包下面啦,骚不骚
代码不贴了,都是一些很小的改动,都在截图里了。