java-selenium 使用log4j在测试过程中打印执行日志

  新建一个maven工程(这里不做具体介绍),配置pom.xml文件。导入 项目所需要的jar包selenium-java、testng和log4j

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>Selenium</groupId>
  <artifactId>LX</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>LX</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
     <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.53.1</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.9.9</version>
            <scope>test</scope>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        
        
  </dependencies>
</project>

  方法一:使用log4j.properties 文件存放配置

  一、右击工程名->New->Folder 新建一个configs文件夹,再右击config文件 ->new ->File新建一个log4j.properties 文件

java-selenium 使用log4j在测试过程中打印执行日志

 java-selenium 使用log4j在测试过程中打印执行日志

 java-selenium 使用log4j在测试过程中打印执行日志

  二、在log4j.properties 中加入以下信息

### 设置根 定义###
log4j.rootLogger = info,stdout,FILE
org.apache.log4j.DailyRollingFileAppender
##ERROR、WARN、 INFO、DEBUG###
### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =%d{yyyy-MM-dd HH:mm:ss.sss} - [ %p ] %m%n

### 输出info 级别以上的日志到logs/error.log ###
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File = logs/log4j.log
log4j.appender.FILE.Append = true
log4j.appender.FILE.Threshold = info
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern =%d{yyyy-MM-dd HH:mm:ss.sss} - [ %p ]  %m%n

### 配置输出到文件,并且每天都创建一个文件 ###
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.File = logs/log4j.log
log4j.appender.dailyRollingFile.Append = true
log4j.appender.dailyRollingFile.Threshold = info
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.ConversionPattern =%d{yyyy-MM-dd HH:mm:ss}  - [ %p ]  %m%n

  三、新建名为cn.Log4j的package,并再此包下新建一个Log类文件和一个Log4jTest类文件

  Log类的代码如下:

package cn.Log4j;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Log {
    private static Logger logger =null;
    private static Log logg=null;
    
    public static Log getlogger(Class<?> T){
        if(logger==null){
            //实例化Properties类,处理.properties格式的文件
            Properties props=new Properties();
            try{
                //获取当前工程项目的路径
                String path=System.getProperty("user.dir");
                //获取log4j.properties文件的所在路径
                String filePath=path+"/Configs/log4j.properties";
                //通过数据流读取文件里面的数据
                InputStream is=new FileInputStream(filePath);
                //读取文件
                props.load(is);
            }catch(IOException e){
                e.printStackTrace();
            }
            //通过configure方法输入数据
            PropertyConfigurator.configure(props);
            logger=Logger.getLogger(T);
            logg=new Log();
        }
        return logg;
        
    }
    
    //定义一个静态方法,可以打印自定义的某个测试用例开始执行的日志信息
    public static void startTestCase(String CaseName){

        logger.info("======================================================");
        logger.info("*********     "+CaseName+"用例开始执行"+"     *********");
    }
    //定义一个静态方法,可以打印自定义的某个测试用例结束执行的日志信息
    public static void endTestCase(String CaseName){
        logger.info("*********     "+CaseName+"用例执行结束"+"     *********");        
        logger.info("======================================================");
    }
    //定义一个静态info方法,打印自定义的info级别的日志信息
    public static void info(String message){
        logger.info(message);
        
    }
    //定义一个静态的warn方法,打印自定义的warn级别的日志信息
    public static void warn(String message){
        logger.warn(message);      
    }
    //定义一个静态的error方法,打印自定义的error级别的日志信息
    public static void error(String message){
        logger.error(message);     
    }
    //定义一个静态的fatal方法,打印自定义的fatal级别的日志信息
    public static void fatal(String message){
        logger.fatal(message);     
    }
    //定义一个静态的debug方法,打印自定义的debug级别的日志信息
    public static void debug(String message){
        logger.debug(message);     
    }


}

  Log4jTest类的代码如下:

package cn.Log4j;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class Log4jTest {
    WebDriver driver;
    final static Log log=Log.getlogger(Log4jTest.class);

    @BeforeMethod
    public void beforetest(){
        //打印搜索selenium测试用例开始执行的日志信息
        Log.startTestCase("搜索selenium");
        System.setProperty("webdriver.chrome.driver", "E://chromedriver.exe");
        driver=new ChromeDriver();
    }
        
    @Test
    public void test(){        
        //打开百度首页
        driver.get("https://www.baidu.com/");
        //打印“打开百度首页”的日志信息
        Log.info("打开百度首页");
        //在百度输入框中输入selenium
        driver.findElement(By.xpath("//*[@id='kw']")).sendKeys("java");
        //打印“在百度输入框中输入selenium”
        Log.info("在百度输入框中输入java");
        //点击百度一下按钮
        driver.findElement(By.xpath("//*[@id='su']")).click();
        //打印“点击百度一下按钮”
        Log.info("点击百度一下按钮");
        //等待页面元素加载
        WebDriverWait wait=new WebDriverWait(driver,5);
        wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(
                    By.xpath("//*[@id='content_left']")));
        Log.info("显示等待5秒");
        try{
            //断言页面是否存在“selenium Grid”,没有则触发catch语句的执行
            Assert.assertTrue(driver.getPageSource().contains("selenium"));
            Log.info("断言页面源码包含:selenium Grid");
        }catch(AssertionError e){
            log.info("没有selenium Grid");
        }
    }
    @AfterMethod
    public void aftertest(){
        driver.quit();
        Log.info("关闭浏览器");
        Log.endTestCase("搜索selenium");
    }


}

  执行Log4jTest类后,会在当前工程目录下生成一个日志文件夹logs里面会出现一个log4j.log文件。结果如下图

java-selenium 使用log4j在测试过程中打印执行日志

  方法二:使用xml文件存放配置

  一、配置xml文件,在工程根目录中新建Log4j.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

    <!-- 日志输出到控制台 -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <!-- 日志输出格式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p [%c{1}]  %m %n"/>
        </layout>
    </appender>

    <!--定义了log4j将日志信息打印到指定日志文件夹,每天生成一个log文件-->
    <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
    
        <!-- 定义日志信息级别为 info -->
        <param name="Threshold" value="INFO"/>
        
        <!-- 定义日志文件存放路径为logs/logs.log,存放在工程根目录下,若不存在则自动创建 -->
        <param name="File" value="logs/log4j.log"/>
        
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 定义日志格式 -->
            <param name= "ConversionPattern" value="%d %-5p [%c{1}]  %m %n"/>
        </layout>
    </appender>
    
    <!-- 输出到控制台和文件夹中的日志级别 -->
    <root>
        <priority value="info" />
        <appender-ref ref="console" />
        <appender-ref ref="fileAppender"/>
    </root>

</log4j:configuration>

  二、新建一个package,在此包下新建Log工具类和TestLog4j测试类

  Log类代码如下:

package cn.Log4j;

import org.apache.log4j.Logger;


public class Log {
        //初始化Logger对象
        private static Logger Log=Logger.getLogger(Log.class.getName());
        //定义一个静态方法,可以打印自定义的某个测试用例开始执行的日志信息
        public static void startTestCase(String CaseName){

            Log.info("======================================================");
            Log.info("*********   "+CaseName+"用例开始执行"+"   *********");
        }
        //定义一个静态方法,可以打印自定义的某个测试用例结束执行的日志信息
        public static void endTestCase(String CaseName){
            Log.info("*********   "+CaseName+"用例执行结束"+"   *********");        
            Log.info("======================================================");
        }
        //定义一个静态info方法,打印自定义的info级别的日志信息
        public static void info(String message){
            Log.info(message);
        }
        //定义一个静态的warn方法,打印自定义的warn级别的日志信息
        public static void warn(String message){
            Log.warn(message);      
        }
        //定义一个静态的error方法,打印自定义的error级别的日志信息
        public static void error(String message){
            Log.error(message);     
        }
        //定义一个静态的fatal方法,打印自定义的fatal级别的日志信息
        public static void fatal(String message){
            Log.fatal(message);     
        }
        //定义一个静态的debug方法,打印自定义的debug级别的日志信息
        public static void debug(String message){
            Log.debug(message);     
        }

}

  TestLog4j类代码如下:

package cn.Log4j;

import org.apache.log4j.xml.DOMConfigurator;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class TestLog4j {
    WebDriver driver;
    @BeforeClass
    public void beforeClass(){//读取log4j配置文件 Log4j.xml 的信息
        DOMConfigurator.configure("Log4j.xml");
    }
    @BeforeMethod
    public void before(){
        Log.startTestCase("百度搜索:selenium java");
        Log.info("设置浏览器驱动路径");
        System.setProperty("webdriver.chrome.driver","E://chromedriver.exe");
        Log.info("初始化Chrome浏览器");
        driver=new ChromeDriver();
        Log.info("访问百度首页");
        driver.get("http://www.baidu.com");
    }
    @Test
    public void test(){
        Log.info("百度首页输入框中输入:selenium java");
        driver.findElement(By.id("kw")).sendKeys("selenium java");
        Log.info("点击 百度一下 按钮");
        driver.findElement(By.id("su")).click();
        Log.info("断言页面Title值是否为:selenium java_百度搜索");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Assert.assertEquals("selenium java_百度搜索",driver.getTitle());
        
    }
    @AfterMethod
    public void after(){
        Log.info("退出Chrome浏览器");
        driver.quit();
        Log.endTestCase("搜索");
    }
}

  运行TestLog4j.java后刷新工程,目录会自动出现一个logs文件夹里面有一个log4j.log文件。如下图所示:

java-selenium 使用log4j在测试过程中打印执行日志