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 文件
二、在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文件。结果如下图
方法二:使用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文件。如下图所示: