一、日志基本应用
#日志:纪录系统运行的信息,记录系统发生的事件日志文件
#作用:了解系统运行的状态,去定位和分析错误问题
#debug:调试1级别
#info:系统正常运行2级别
#warning:警告信息程序有问题,但是他又不影响程序运行不会提Bug3级别默认的级别
#error:错误,出现问题,提bug4级别
#critical:严重的,快要崩溃
#常用:info,error
#反应出问题的严重程度
#logging能够设置日志级别生成日志信息,自带的不需要安装
importlogging
#设置日志级别
#logging.basicConfig(level=logging.DEBUG)
#想要生成日志信息调用日志级别
logging.debug("debug信息")
logging.error("erroe信息")
logging.info("info信息")
logging.warning("warning信息")
logging.critical("critical信息")
运行结果:
#设置日志级别
logging.basicConfig(level=logging.DEBUG)
运行结果:
格式字符串字段:
%(asctime)s 日志事件发生的时间-人类可读时间,如:2003_07_08 16:47:45,896
%(created)f 日志事件发生的事件-时间戳,就是当时调用time,time()函数返回的值
%(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用)
%(msecs)d 日志事件发生时间的毫秒部分
%(levelname)s 该日志记录的文字形式的日志级别('DEBUG','INFO','WARNING','ERROR','CRITICAL')
%(name)s 所使用的日志器名称,默认是'root',因为默认使用的是rootLogger
%(message)s 日志记录的文本内容,哦那个过msg % args计算得到的
%(pathname)s 调用日志记录函数的源码文件的全路径
%(filename)s pathname的文件名部分,包含文件后缀‘
%(module)s filename的名称部分,不包含文件后缀
%(lineo)d 调用日志记录函数的源代码所在的行号
%(funcName)s 调用日志记录函数的函数名
#日志:纪录系统运行的信息,记录系统发生的事件日志文件
#作用:了解系统运行的状态,去定位和分析错误问题
#debug:调试1级别
#info:系统正常运行2级别
#warning:警告信息程序有问题,但是他又不影响程序运行不会提Bug3级别默认的级别
#error:错误,出现问题,提bug4级别
#critical:严重的,快要崩溃
#常用:info,error
#反应出问题的严重程度
#logging能够设置日志级别生成日志信息,自带的不需要安装
importlogging
#生成日志信息生成时间文件名日志的状态类名方法名日志内容
fmt='%(asctime)s%(filename)s%(levelname)s%(module)s%(funcName)s%(message)s'
#设置日志级别
logging.basicConfig(level=logging.DEBUG,format=fmt)
#想要生成日志信息调用日志级别
logging.debug("debug信息")
logging.error("erroe信息")
logging.info("info信息")
logging.warning("warning信息")
logging.critical("critical信息")
运行结果:
日志信息只会保存在log.log文件里面,控制台不会输出日志信息,需要优化
二、日志在框架中如何应用
首先创建一个简单的自动化登录框架
Login_page.py 实现一个登录操作
from selenium import webdriver
from selenium.webdriver.common.by import By
from base_page import BasePage
classLoginPage(BasePage):
#采用POM思想,将元素定位拿出来找到输入框输入用户名和密码,找到登录按钮登录
#因为页面元素容易更改,所以将页面元素单独拎出来,方便后期修改
#页面元素
user=(By.NAME,'accounts')
pwd=(By.NAME,'pwd')
button=(By.NAME,'/html/body/div[4]/div/div[2]/form/div[3]/button')
#页面元素
url='http://39.98.138.157/shopxo/index.php?s=/index/user/logininfo.html'
#页面的操作流程
deflogin(self,txt,pwd_):
#原本的写法:self.driver.find_element_by_name('accounts').sendkeys('666666')
#为了不写多余的代码,利用关键字驱动进行了封装
self.open(self.url)
self.max()
self.input(self.user,txt)
self.input(self.pwd,pwd_)
self.click(self.button)
if__name__=='__main__':
driver=webdriver.Chrome()
user='666666'
pwd='111111'
Ip=LoginPage(driver)
Ip.login(user,pwd)
如图所示:
Base_page.py 实现登录的关键字驱动
from selenium import webdriver
import logging
class BasePage:
#构造函数
def__init__(self,driver):
self.driver=driver
#访问url
def open(self,url):
self.driver.get(self.url)
#退出
def quit(self):
self.driver.quit()
#元素定位
def locator(self,loc):
returnself.driver.find_element(*loc)
#输入
def input(self,loc,txt):
self.locator(loc).send_keys(txt)
#点击
def click(self,loc):
self.locator(loc).click()
#窗体最大化
de fmax(self):
self.driver.maximize_window()
如何将日志添加到这个登录框架里面去
将输入操作点击操作等等添加到日志文件里面
调用logging类
from selenium import webdriver
#日志
#logging能够设置日志级别生成日志信息,自带的不需要安装
import logging
#生成日志信息生成时间文件名日志的状态类名方法名日志内容
fmt='%(asctime)s%(filename)s%(levelname)s%(module)s%(funcName)s%(message)s'
#设置日志级别,日志格式,生成的日志文件保存到log.log
logging.basicConfig(level=logging.INFO,format=fmt,filename='./log.log')
class BasePage:
#构造函数
def__init__(self,driver):
logging.info("初始化driver{}".format(driver))
self.driver=driver
#访问url
def open(self,url):
logging.info("访问{}网址".format(url))
self.driver.get(self.url)
#退出
def quit(self):
logging.info("退出网址")
self.driver.quit()
#元素定位
def locator(self,loc):
logging.info("正在定位{}元素".format(loc))
returnself.driver.find_element(*loc)
#输入
def input(self,loc,txt):
logging.info("正在定位{}元素,输入{}内容".format(loc,txt))
self.locator(loc).send_keys(txt)
#点击
def click(self,loc):
logging.info("正在点击{}元素".format(loc))
self.locator(loc).click()
#窗体最大化
def max(self):
self.driver.maximize_window()
运行结果:显示密码错误
框架里面哪里要日志,在框架的底层,关键字驱动,登录的方法里面,方法正确try excepet捕获错误日志
三、优化日志模块
1、将日志单独写成一个封装的方法
注意方法是有返回值的
2、关键字驱动文件里面需要对日志文件进行调用
from selenium import webdriver
#logging能够设置日志级别生成日志信息,自带的不需要安装
#import logging
##生成日志信息生成时间文件名日志的状态类名方法名日志内容
#fmt='%(asctime)s%(filename)s%(levelname)s%(module)s%(funcName)s%(message)s'
##设置日志级别,日志格式,生成的日志文件保存到log.log
#logging.basicConfig(level=logging.INFO,format=fmt,filename='./log.log')
from baselog import test_log
#实例化对象要顶格写
log=test_log()
class BasePage:
#构造函数
def__init__(self,driver):
#logging.info("初始化driver{}".format(driver))
log.info("初始化driver{}".format(driver))
self.driver=driver
#访问url
def open(self,url):
log.info("访问{}网址".format(url))
#logging.info("访问{}网址".format(url))
self.driver.get(self.url)
#退出
def quit(self):
#logging.info("退出网址")
log.info("退出网址")
self.driver.quit()
#元素定位
def locator(self,loc):
#logging.info("正在定位{}元素".format(loc))
log.info("正在定位{}元素".format(loc))
returnself.driver.find_element(*loc)
#输入
def input(self,loc,txt):
#logging.info("正在定位{}元素,输入{}内容".format(loc,txt))
log.info("正在定位{}元素,输入{}内容".format(loc,txt))
self.locator(loc).send_keys(txt)
#点击
def click(self,loc):
try:
#logging.info("正在点击{}元素".format(loc))
log.info("正在点击{}元素".format(loc))
self.locator(loc).click()
exceptExceptionase:
#logging.error('错误日志'%e)
log.error('错误日志'%e)
#窗体最大化
def max(self):
self.driver.maximize_window()
3、直接运行就可以了
继续优化
Baselog.py是对日志的一个基本应用,有一个问题,控制台没有日志输出,只有Log文件有
basicConfig 日志再去优化封装
#对于日志再优化封装
import logging
#创建一个日志器
logger=logging.getLogger()
#设置日志级别
logger.setLevel(logging.INFO)
#指定日志输出的目的地,控制台那要先创建一个控制台
#创建控制台处理器
sh=logging.StreamHandler()
#把日志信息放到控制台里面去
logger.addHandler(sh)
#控制台里面输出的日志信息有些是我们不需要的,有些是我们需要但没有的
#创建格式器
#生成日志信息生成时间文件名日志的状态类名方法名日志内容
fmt='%(asctime)s%(filename)s%(levelname)s%(module)s%(funcName)s%(message)s'
formator=logging.Formatter(fmt)
#优化控制台格式
sh.setFormatter(formator)
#日志信息也要显示再log文件里面
#创建文本处理器,指定日志信息输出到文本处理器
fh=logging.FileHandler('./Log/log.log',encoding='utf-8')
logger.addHandler(fh)
#文本里面的日志格式也可以自己重新定义,这里没有重新定义,直接用上述定义好的格式
fh.setFormatter(formator)
logger.info('日志信息')
运行结果:
路径:../ 当前目录向上两级
./ 当前目录向上一级
/ 当前目录同级
优化好的日志文件,在框架中怎么使用?
1、日志文件中定义一个有返回值的方法 loggingtest.py
#对于日志再优化封装
import logging
def test_logging():
#创建一个日志器
logger=logging.getLogger()
#设置日志级别
logger.setLevel(logging.INFO)
#指定日志输出的目的地,控制台那要先创建一个控制台
#创建控制台处理器
sh=logging.StreamHandler()
#把日志信息放到控制台里面去
logger.addHandler(sh)
#控制台里面输出的日志信息有些是我们不需要的,有些是我们需要但没有的
#创建格式器
#生成日志信息生成时间文件名日志的状态类名方法名日志内容
fmt='%(asctime)s%(filename)s%(levelname)s%(module)s%(funcName)s%(message)s'
formator=logging.Formatter(fmt)
#优化控制台格式
sh.setFormatter(formator)
#日志信息也要显示再log文件里面
#创建文本处理器,指定日志信息输出到文本处理器
fh=logging.FileHandler('./Log/log.log',encoding='utf-8')
logger.addHandler(fh)
#文本里面的日志格式也可以自己重新定义,这里没有重新定义,直接用上述定义好的格式
fh.setFormatter(formator)
return logger
#logger.info('日志信息')
2、在框架底层(关键字驱动层)引用方法 basepage.py
下面的信息不变
四、启动的时候报了一个错,没有登录成功
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="/html/body/div[4]/div/div[2]/form/div[3]/button"]"}
(Session info: chrome=92.0.4515.159)
常见的例外情况。NoSuchElementException:消息:没有这样的元素:无法找到元素:{“方法”:“css选择器”,“选择器”:“[name=“/html/body/div[4]/div/div[2]/form/div[3]/button”]”
(会话信息:chrome=92.0.4515.159)