1、在maven项目的pom.xml中添加依赖包信息,下载相关的jar包,注意这里刚开始只添加了log4j-api和log4j-core这两个包但是发现不能导入import org.apache.log4j.Logger这个类只能导入import.org.apache.log4j.logging.Logger这个类,后面查资源才知道是因为由于log4j在maven项目上不能自动识别log4j.properties这个资源文件,必须还要slf4j这个jar包,maven的pom.xml的依赖包配置如下:
log4j官网下载:http://logging.apache.org/log4j/2.x/maven-artifacts.html
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
2、新建一个Log4j.properties文件,文件内容如下:
log4j.rootLogger=INFO,CONSOLE,R,HTML,TTCC
#定义一个appender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.TTCC=org.apache.log4j.RollingFileAppender
log4j.appender.HTML=org.apache.log4j.FileAppender
#定义log文件保存路径,三种日志文件格式
log4j.appender.R.File=./Log/testlog.log
log4j.appender.TTCC.File=./Log/testlog1.log
log4j.appender.HTML.File=./Log/application.html
#定义layout和pattern
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= %5p [%t] (%F:%L)- %m%n
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d - %c -%p - %m%n
log4j.appender.TTCC.layout=org.apache.log4j.TTCCLayout
log4j.appender.TTCC.layout.DateFormat=ISO8601
log4j.appender.HTML.layout=org.apache.log4j.HTMLLayout
log4j.appender.HTML.layout.Title=Application log
log4j.appender.HTML.layout.LocationInfo=true
3、再新建一个Log目录放上面文件中设置的三种日志
4、新建一个Log.java类,代码内容如下:
package framework;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Log {
// 初始化log4j log
private static Logger Log = Logger.getLogger(Log.class.getName());
//这个方法没有调用成功我也不知道是为什么?
// 运行测试用例之前的日志输出
public static void startTestCase(String sTestCaseName){
Log.info("*******************************************************");
Log.info("$$$$$$$$$ "+sTestCaseName+ " $$$$$$$$$$");
Log.info("*******************************************************");
}
//这个方法没有调用成功我也不知道是为什么?
// 用例执行结束后日志输出
public static void endTestCase(String sTestCaseName){
Log.info("XXXXXXX "+"-E---N---D-"+" XXXXXXXXX");
Log.info("X");
Log.info("X");
}
// 以下是不同日志级别的方法,方便需要的时候调用,一般info和error用得最多
public static void info(String message) {
PropertyConfigurator.configure("E:\\Java_project\\XTPTest_selenium\\suites\\Log4j.properties");
Log.info(message);
}
public static void warn(String message) {
PropertyConfigurator.configure("E:\\Java_project\\XTPTest_selenium\\suites\\Log4j.properties");
Log.warn(message);
}
public static void error(String message) {
PropertyConfigurator.configure("E:\\Java_project\\XTPTest_selenium\\suites\\Log4j.properties");
Log.error(message);
}
public static void fatal(String message) {
PropertyConfigurator.configure("E:\\Java_project\\XTPTest_selenium\\suites\\Log4j.properties");
Log.fatal(message);
}
public static void debug(String message)
{
PropertyConfigurator.configure("E:\\Java_project\\XTPTest_selenium\\suites\\Log4j.properties");
Log.debug(message);
}
}
5、在上一篇中的代码中验证看是否能打印出日志:
package framework;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import framework.Log;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
public class BrowserEngine {
public String browserName;
public String serverURL;
public WebDriver driver;
public void initConfigData() throws IOException {
/*Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,在Java中,其配置文件常为.properties文件,格式为文本文件,文件的内容的格式是“键=值”的格式,
文本注释信息可以用"#"来注释。主要方法如下:
getProperty ( String key) 通过参数 key ,得到 key 所对应的 value
load ( InputStream inStream) 从输入流中读取属性列表(键和元素对),以供 getProperty ( String key) 来搜索
setProperty ( String key, String value) 调用 Hashtable 的方法 put 。他通过调用基类的put方法来设置 键 - 值对
store ( OutputStream out, String comments) 与 load 方法相反,该方法将键 - 值对写入到指定的文件中去。
clear (),清除所有装载的 键 - 值对
*/
Properties p=new Properties();
//加载配置文件
InputStream ips=new FileInputStream("E:\\Java_project\\XTPTest_selenium\\suites\\config.properties");
//InputStream是抽象类,FileInputStream是InputStream的子类
p.load(ips);
//日志
Log.info("加载配置文件");
browserName=p.getProperty("browserName");
Log.info("获取配置文件中的浏览器名称");
serverURL=p.getProperty("URL");
Log.info("获取配置文件中的URL名称");
ips.close();
}
public WebDriver getBrowser(){
if(browserName.equalsIgnoreCase("chrome")){
System.setProperty("webdriver.chrome.driver","E:\\Java_project\\XTPTest_selenium\\src\\main\\resources\\chromedriver.exe");
driver=new ChromeDriver();
Log.info("初始化chrome浏览器");
}
else if(browserName.equalsIgnoreCase("IE")){
System.setProperty("webdriver.ie.driver","E:\\Java_project\\XTPTest_selenium\\src\\main\\resources\\IEDriverServer.exe");
driver=new InternetExplorerDriver();
Log.info("初始化IE浏览器");
}
driver.get(serverURL);
Log.info("打开URL");
driver.manage().window().maximize();
Log.info("将网页窗口最大化");
callWait(5);
return driver;
}
public void tearDown() throws InterruptedException{
Log.info("退出driver");
driver.quit();
Thread.sleep(3000);
}
//隐式等待
public void callWait(int time){
driver.manage().timeouts().implicitlyWait(time,TimeUnit.SECONDS);
Log.info("隐式等待"+time+"秒");
}
}
运行结果如下:
注意事项:
1、目前为止项目的目录如下:
2、
参考博文:
https://blog.csdn.net/u011541946/article/details/80463228
https://blog.csdn.net/u011541946/article/details/76038697
https://blog.csdn.net/u011541946/article/details/79288339
解决一个问题的博文:
https://blog.csdn.net/john_f_lau/article/details/27098087