【selenium学习中级篇 -28】封装一个日志类
在脚本运行中,我们可能需要知道脚本运行到哪个地方了,运行了些什么东西,输出的信息哪些比较严重,如果直接在代码里面print输出很不友好,也不适合进行筛选,所以引进了日志
在日志中,可以通过日志的级别来筛选显示我们需要的信息
日志级别 | 数值 |
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30(默认级别) |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |
如果设置的日志级别高于logging模块设置的级别,才会显示,这样,我们就可以控制日志输出的级别
比如,我们设置logging的级别为INFO,那么我们输出时,只会显示CRITICAL,ERROR,WARNING,INFO,而低于INFO级别的DEBUG和NOTSET则不会显示,了解一下,进入我们的正题
封装日志模块步骤:
1.在工程目录下新建Logs文件夹,用于存放我们生成的日志文件
2.在Base包下新建log.py文件
3.在需要输出日志的地方,添加日志输出代码
log.py
import logging import os.path import time class Log(object): def __init__(self, log): # 创建一个log # getLogger(log)中log为日志记录的模块名字,后面的日志格式中的 %(name)s对应的是这里的模块名字 self.log = logging.getLogger(log)
# 设置日志级别,高于DEBUG的才会显示 self.log.setLevel(logging.DEBUG) '''创建handler''' # 获取项目根目录的相对路径 log_path = os.path.dirname(os.path.abspath('.')) + '/Logs/' log_name = os.path.join(log_path, '{0}.log'.format(time.strftime('%Y-%m-%d'))) # 创建一个handler,用来写日志文件 fh = logging.FileHandler(log_name) fh.setLevel(logging.INFO) # 输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.INFO) # 定义输出格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) self.log.addHandler(fh) self.log.addHandler(ch) def getlog(self): return self.log
在test_baidu.py中添加打印日志的代码
日志的添加可以在任何页面的任何地方,我这里只是拿test_baidu.py为例
日志信息将打印在控制台,和Logs下的日志文件中
from Base import * from Flow import * import unittest import time class TestBaiDuSearch(unittest.TestCase): @classmethod def setUpClass(cls):
# 实例化一个日志类的实例对象 cls.logger = Log(log='test_baidu').getlog() browser = BrowserEngine(cls) cls.driver = browser.open_browser() cls.baidu_flow = BaiduFlow(cls.driver) @classmethod def tearDownClass(cls): cls.driver.quit() def test_baidu(self):
# 打印信息 self.logger.info("测试百度知道的selenium第一条链接") self.baidu_flow.open_baidu() result = self.baidu_flow.baidu_know_search("selenium") time.sleep(3) self.assertEqual(result, "http://zhidao.baidu.com/question/147041701.html?fr=iks&word=selenium&ie=gbk") def test_baidu_hao123(self):
# 打印信息 self.logger.info("测试好123页面的URL") self.baidu_flow.open_baidu() self.baidu_flow.click_baidu_hao123() self.baidu_flow.switch_handle() hao_url = self.baidu_flow.get_page_url() self.assertEqual(hao_url,"https://www.hao123.com/")
这样再次运行,则会有日志信息打印了
最后再说一下,日志类中的格式设定
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
%(asctime)s表示这个位置上是字符串形式的当前时间;默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(name)s表示Logger的名字,即实例化日志类时传入的参数 logger = Log(log='test_baidu').getlog(),这里就是test_baidu
%(levelname)s表示输出的级别
%(message)s 则是打印出来的信息,比如,self.logger.info("测试好123页面的URL")中,“测试好123页面的URL”就是对应的%(message)s
更详细的格式如下:
我走的很慢,但从不后退