Selenium2+python自动化72-logging日志使用

前言

脚本运行的时候,有时候不知道用例的执行情况,这时候可以加入日志,这样出现问题后方便查阅,也容易排查哪些用例执行了,哪些没有执行。

一、封装logging模块

1.关于logging日志的介绍,我这里就不详细讲解了,主要有两大功能,一个是控制台的输出,一个是保存到本地文件

2.先封装logging模块,保存到common文件夹命名为logger.py,以便于调用

# coding:utf-8
import logging,time,os
# 这个是日志保存本地的路径
log_path = "D:\\test\\newp\\report"
class Log:
    def __init__(self):
        # 文件的命名
        self.logname = os.path.join(log_path, '%s.log'%time.strftime('%Y_%m_%d'))
        self.logger = logging.getLogger()
        self.logger.setLevel(logging.DEBUG)
        # 日志输出格式
         self.formatter = logging.Formatter('[%(asctime)s] -  %(filename)s[line:%(lineno)d] - fuc:%(funcName)s- %(levelname)s:  %(message)s')
    def __console(self, level, message):
        # 创建一个FileHandler,用于写到本地
        fh = logging.FileHandler(self.logname, 'a')  # 追加模式
        fh.setLevel(logging.DEBUG)
        fh.setFormatter(self.formatter)
        self.logger.addHandler(fh)

        # 创建一个StreamHandler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        ch.setFormatter(self.formatter)
        self.logger.addHandler(ch)

        if level == 'info':
            self.logger.info(message)
        elif level == 'debug':
            self.logger.debug(message)
        elif level == 'warning':
            self.logger.warning(message)
        elif level == 'error':
            self.logger.error(message)
        # 这两行代码是为了避免日志输出重复问题
        self.logger.removeHandler(ch)
        self.logger.removeHandler(fh)
        # 关闭打开的文件
        fh.close()

    def debug(self, message):
        self.__console('debug', message)

    def info(self, message):
        self.__console('info', message)

    def warning(self, message):
        self.__console('warning', message)

    def error(self, message):
        self.__console('error', message)

if __name__ == "__main__":
   log = Log()
   log.info("---测试开始----")
   log.info("输入密码")
   log.warning("----测试结束----")

二、log保存本地

1.logger模块的封装在9.2章节,我的用例参考目录如下

2.先设置保存log到本地的文件路径地址,如:log_path = "D:\\test\\newp\\report"

三、用例代码

以下是简单的一个百度的搜索案例仅供参考

# coding:utf-8
import unittest,time
from common.logger import Log
from selenium import webdriver
log = Log()
class Test(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.get("https://www.baidu.com")
        self.driver.implicitly_wait(30)
    def test_01(self):
        log.info("-------测试用例开始---------")
        self.driver.find_element_by_id("kw").send_keys("yoyo")
        log.info("输入内容:yoyo")
        self.driver.find_element_by_id("su").click()
        log.info("点击按钮:id = su")
        time.sleep(2)
        t = self.driver.title
        log.info(u"获取title内容:%s"%t)
        self.assertIn(u"百度搜索",t)
    def tearDown(self):
        self.driver.quit()
        log.info("-------测试用例结束----------")
if __name__ == "__main__":
    unittest.main()

四、运行结果:

1.执行run_all脚本(3.9章节)

2.打开存放日志文件的目录,找到log文件

3.打开报告,看到的效果如下

原文发布于微信公众号 - 从零开始学自动化测试(yoyoketang)

原文发表时间:2017-07-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Windows 下的安装phpMoAdmin

Windows7 下安装PHP非常容易,推荐使用WPI,通过框架和运行时选择PHP5.2安装: ? mongoDB 是以 PHP 扩展库 .dll 的形式与 P...

24570
来自专栏互联网大杂烩

Structs框架

Structs框架结构采用MVC设计模式,同时包含客户端(client),请求以及业务逻辑处理(Business Logic),而MVC模式主要由模型(Mode...

7220
来自专栏运维小白

10.11 Linux网络相关

linux网络相关 ifconfig查看网卡ip(yum install net-tools) ifup ens33/ifdown ens33 设定虚拟网卡en...

31560
来自专栏Java技术栈

一个多线程死锁案例,如何避免及解决死锁问题?

多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去翻看历史文章吧。 下面是一个多线程死锁的例子 输出...

31270
来自专栏pangguoming

ant安装、环境变量配置及验证

一、安装ant 到官方主页http://ant.apache.org下载新版(目前为Ant1.8.1)的ant,得到的是一个apache-ant-1.8.1-...

40670
来自专栏cnblogs

Webpack单元测试,e2e测试

此篇文章是续 webpack多入口文件、热更新等体验,主要说明单元测试与e2e测试的基本配置以及相关应用。 一、单元测试 实现单元测试框架的搭建、es6语法的应...

349100
来自专栏JetpropelledSnake

SNMP学习笔记之Linux下安装和配置SNMP

  选择一个SNMP版本,比如5.7.1,下载地址如下:http://sourceforge.net/projects/net-snmp/files/net-s...

29330
来自专栏信安之路

利用 nslookup 解析 DNS 记录

nslookup 是一个域名解析工具,在进行一些网页无法打开的问题上,能帮助我们进行更全面理解问题的所在!

34900
来自专栏后台全栈之路

在 C/C++ 异步 I/O 中使用 MariaDB 的非阻塞接口

对 C/C++,MySQL 提供的库传统上都是阻塞操作,因此适合多线程 / 进程服务器架构编程。但是如果用 C/C++ 编写服务器,往往对性能会有极致要求,此时...

69520
来自专栏肖洒的博客

GitHub Pages自定义域名

最早用GitHub Pages做个人博客,初始的二级域名就是https://x-nicolo.github.io/,之后用了一个免费顶级域名,在Freenom ...

46450

扫码关注云+社区

领取腾讯云代金券