《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)

1.简介

前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar、log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的日志文件,一种是控制台输出的日志,还有一种是HTML格式的日志文件。有时候,我们不一定都需要这些文件,在我们自动化测试框架里,我们只需要把日志文件保存到磁盘文件中,所以,这里介绍一种不用Log4j或者logback来实现日志文件写入和保存。

写着一篇文章的主要目的是后边测试框架设计就用宏哥这种自定义的来获取日志,前边那么多日志输出各有优势,但是那些知识细节需要开发了解,作为测试用宏哥这个自定义的就够了,当然了如果有的小伙伴或者童鞋们想用也是可以的。

2.项目实战

2.1准备环境

为了方便演示宏哥新配置一个测试环境,具体步骤如下:

1.新建一个java project命名为SeleniumFramework,如下图所示:

2.在根目录下新建三个包:framework、pageObject和testSuite,如下图所示:

3.新建一个日志文件夹Log用来存储日志文件,如下图所示:

4.新建一个Tools文件夹,里边存储浏览器驱动器,如下图所示:

5.把selenium需要的jar包添加到java project中,如下图所示:

2.2代码设计

1.在framework包中新建Logger和LogType两个类,如下图所示:

(1)Logger.java

(2)LogType.java  定义枚举类型,一般主要用到INFO和ERROR两种日志类型。

2.在testSuite包中新建测试类TestBaidu,调用Logger中静态方法输出日志,检查日志文件保存路径和内容。如下图所示:

2.3参考代码

(1)Logger.java

package framework;import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @author 北京-宏哥* * @公众号:北京宏哥* * 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架设计基础-java实现自定义日志输出(详解教程) ** 2022年4月01日*/public class Logger {public static String OutputFileName = getDateTimeByFormat(new Date(), "yyyyMMdd_HHmmss");private static OutputStreamWriter outputStreamWriter;private static String logFileName;public static boolean LogFlag = true;public Logger() {}private static void WriteLog(String logEntry) {try {// 定义日志文件保存路径和日志文件名称logFileName = ".\\Log" + "\\" + OutputFileName + ".log";if (outputStreamWriter == null) {File logFile = new File(logFileName);if (!logFile.exists())logFile.createNewFile();//利用OutputStreamWriter往日志文件写内容,字符编码是unicodeoutputStreamWriter = new OutputStreamWriter(new FileOutputStream(logFileName), "utf-8");}outputStreamWriter.write(logEntry, 0, logEntry.length());outputStreamWriter.flush();} catch (Exception e) {System.out.println(LogType.LogTypeName.ERROR.toString() + ": Failed to write the file " + logFileName);e.printStackTrace();}}//获取当前系统时间,得到格式化时间字符串private static String getDateTimeByFormat(Date date, String format) {SimpleDateFormat df = new SimpleDateFormat(format);return df.format(date);}public static void Output(LogType.LogTypeName logTypeName, String logMessage) {Date date = new Date();String logTime = getDateTimeByFormat(date, "yyyy-MM-dd HH:mm:ss.SSS");String logEntry = logTime + " " + logTypeName.name() + ": " + logMessage + "\r\n";System.out.print(logEntry);// 定义一个开关,为True就输出日志,如果你不想输出,改成Falseif (LogFlag)WriteLog(logEntry);}
}

(2)LogType.java

package framework;/*** @author 北京-宏哥* * @公众号:北京宏哥* * 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架设计基础-java实现自定义日志输出(详解教程) ** 2022年4月01日*/public class LogType {public LogType(){}public enum LogTypeName{//INFO,//ERROR,//WARNING,//DEBUG;}
}

(3)TestBaidu.java

package testSuite;import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;import framework.LogType;
import framework.Logger;/*** @author 北京-宏哥* * @公众号:北京宏哥* * 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架设计基础-java实现自定义日志输出(详解教程) ** 2022年4月01日*/public class TestBaidu {public static void main(String[] args) {System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");  WebDriver driver = new ChromeDriver(); Logger.Output(LogType.LogTypeName.INFO, "启动chrome浏览器");driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);Logger.Output(LogType.LogTypeName.INFO, "设置隐式时间10秒");driver.get("https://www.baidu.com");Logger.Output(LogType.LogTypeName.INFO, "打开百度首页");driver.manage().window().maximize();Logger.Output(LogType.LogTypeName.INFO, "最大化浏览器");driver.findElement(By.id("kw")).sendKeys("Selenium");Logger.Output(LogType.LogTypeName.INFO, "搜索输入框输入关键字selenium");driver.close();Logger.Output(LogType.LogTypeName.INFO, "退出浏览器");}}
2.4运行代码

1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

3.运行完后,右键刷新Log文件夹,可以看到日志文件。如下图所示:

4.打开日志文件,如下图所示:

3.小结

1. Lo4j有一个小问题就是,不太方便设置日志文件名称是当前系统的时间,所以,log4j前面写死了日志名称,每次执行都会覆盖之前的日志。但是本篇的方法就不会发生这样情况,每次自动化运行都有日志保存,方便追溯定位错误。

2.出现日志文件乱码的情况,你需要在菜单导航栏上Window-->Preferences 打开"首选项"对话框,左侧导航树,导航到 General-->Workspace,把编码从GBK改成utf-8.

  每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 镜像仓库常见命令

Docker Registry (镜像仓库) 常用命令 docker login 功能:登录到一个 Docker 镜像仓库,如果没有指定镜像仓库的地址,默认就是官方的 Docker Hub 仓库。 语法: docker login [options] [server]选项: -u:登…

字母加密(C语言)

一、题目; 为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W…

<script>和<script setup>的区别

在Vue 3中&#xff0c;<script setup>是Composition API的一个语法糖&#xff0c;它提供了一种更简洁的方式来编写组件逻辑。使用<script setup>&#xff0c;您可以在组件外部直接导入或定义方法和响应式数据&#xff0c;而不需要在setup()函数内部进行。 <scr…

iframe嵌套页面 拒绝访问 X-Frame-Options配置

iframe嵌套页面 拒绝访问 X-Frame-Options配置 iframe拒绝访问 X-Frame-Options: deny X-Frame-Options: sameorigin X-Frame-Options: allow-from https://example.com/deny 表示该页面不允许在 frame 中展示&#xff0c;即便是在相同域名的页面中嵌套也不允许。 sameorigi…

[源码分享]基于Unity的Live2D虚拟人物——结合了GPT、Azure、情绪识别和口型同步,也可以集合苹果Vision Pro做成3D的形象

# 技术文档 ## 1 项目简介 ### 项目目录 ``` Assets ├─ Animator // 动画 ├─ Code // 代码 │ ├─ AI // AI 模块 │ │ ├─ LM // 语言模型模块 │…

notepad++的使用技巧

notepad的使用技巧_notpad垂直粘贴-CSDN博客 notepad的使用技巧 多视图 视图----移动/复制到当前文档-----移动到另一视图&#xff08;可以配合水平/垂直同步滚动功能&#xff09; 书签功能 在任意行点击左边栏或者按CtrlF2会出现蓝色小点&#xff0c;这表示添加了一个书签…

算法训练 | 使用JAX训练CLIP算法_支持fine-tuning

项目应用场景 面向 CLIP 算法训练场景&#xff0c;项目采用 JAX 来实现 CLIP 算法的训练&#xff0c;支持 fine-tuning。 项目细节 > 具体参见项目 README.md (1) 安装 pip install clip-jax (2) 下载训练数据 # clone and install datacomp# download data python downl…

基于Springboot+Vue的Java项目-网上购物商城系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

数仓建模—数据仓库初识

数仓建模—数据仓库初识 数据仓库之父Bill Inmon在1991年出版的"Building the Data Warehouse"一书中所提出的定义被广泛接受 数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integ…

hv第一坑:定时器

错误代码 重试策略&#xff1a;一次延迟1s,最长30s直至事件成功。 int try_count 0;//do something if(not success)m_loop->setTimerInLoop((try_count > 30 ? 30: try_count) *1000 , cb, INFINITE, 0x100);表现现象 cpu 爆了内存爆了 总结原因 hv内部代码bug&…

C++异步回调示例:多线程执行任务,主线程通过回调监测任务状态

1、回调函数 回调函数定义&#xff1a;把函数的指针或者地址作为参数传递给另一个参数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;那么这就是一个回调的过程&#xff0c;这个被回调的函数就是回调函数。回调函数不是由该函数的实现方直接调用&#xff0c;而…

Ubuntu20.04 ISAAC SIM仿真下载使用流程(4.16笔记补充)

机器&#xff1a;华硕天选X2024 显卡&#xff1a;4060Ti ubuntu20.04 安装显卡驱动版本&#xff1a;525.85.05 参考&#xff1a; What Is Isaac Sim? — Omniverse IsaacSim latest documentationIsaac sim Cache 2023.2.3 did not work_isaac cache stopped-CSDN博客 Is…

相机1:如何系相机肩带

开始解锁新领域&#xff0c;多看几个相关视频&#xff0c;大概也就可以掌握一两种系相机肩带的方法&#xff0c;本质就是新知识的学习过程&#xff0c;不可能等着或者期待出来一个完整的教程&#xff0c;一步一步自己去探索&#xff0c;自己去查资料。 目录 总述 第一步&#…

chrome 浏览器 f12 如何查看 websocket 消息?

1. 打开目标页面 2. f12--》网络--》WS&#xff0c;然后刷新页面( 如果不刷页面&#xff0c;就会看不到 websocket 请求&#xff0c;因为 websocket 是长连接&#xff0c;页面加载后只发出一次连接请求&#xff0c;不像 http 接口&#xff0c;不用刷新页面&#xff0c;待会儿也…

STM32F103 hal库 移植 freeRTos+LVGL

先配置freeRTOS 配置时钟 选用外部晶振 这里选用其他定时器&#xff0c;至于为什么我也不是很懂&#xff0c;好像说是跟稳定 配置FREERTOS 其他配置看着办 移植LVGL 先去gitee下载源码 选择一个版本 开始移植 1、添加lvgl源码到工程文件中 把lvgl-8.0.2\src文件夹直接复制…

Elasticsearch:(二)3.安装Elasticsearch-head插件

1.环境安装介绍: 安装java环境安装Elasticsearch安装kibana安装Elasticsearch-head插件 本节文章主要讲解Elasticsearch-head的安装。 2.安装 这个head插接可以安装在本机客户端或者服务器都可以,这里讲解windows安装 2.1 安装依赖 下载node:下载地址:https://nodejs.or…

FlinkCDC基础篇章1-安装使用

1、下载、安装Flink 下载地址&#xff1a; Downloads | Apache Flink --------具体环境参考官网-------- 解压&#xff1a;tar zxf flink-XXXX-bin-scala_XXX.tgz 启动应用&#xff1a;./bin/start-cluster.sh 可访问&#xff1a;http://127.0.0.1:8081/ 校验 启动客户端…

SpringBoot(一)【入门】

前言 1、SpringBoot 快速入门 1.1、SpringBoot 简介 SpringBoot 是用来简化 Spring 应用的初始搭建以及开发过程 首先我们回顾一下 SpringMVC 项目的开发过程&#xff1a; 导入依赖&#xff08;javax.servlet-api 和 spring-webmvc&#xff09;Servlet 容器配置类&#xff…

227基于matlab的作业调度问题

基于matlab的作业调度问题。采用遗传算法&#xff0c;解决作业调度问题。一共三个作业&#xff0c;每个作业有不同的时间长度和紧急程度&#xff0c;超过时间会有惩罚措施。通过遗传算法计算出最好的作业安排&#xff0c;使得惩罚最小&#xff0c;获益最大。最终结果通过GUI用甘…

Maven 项目 JDK 8、JDK 17 多版本 Java 编译依赖最佳实践

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…