我目前正在尝试使用Selenium。为此,我开始使用log4j2来记录进展顺利,什么不是。 一切都运转良好,只要一切都在同一个班级。我可以在控制台中看到我的日志,并且我的日志文件写得很好。但是一旦我尝试编写一个单独的类来为我的代码提供结构,一切都出错了。就像我的自定义XML属性文件不再存在一样。
以下是我的XML属性文件的代码:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
<Properties>
<Property name="log-path">log</Property>
</Properties>
<Appenders>
<RollingFile name="file-log" fileName="${log-path}/logfile.log"
filePattern="${log-path}/logfile-%d{yyyy-MM-dd_HH}.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd_HH} [%t] %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="phptravels" level="info" additivity="false">
<appender-ref ref="file-log" level="info"/>
</Logger>
<Root level="info" additivity="false">
<appender-ref ref="console"/>
</Root>
</Loggers>
</Configuration>
以下是我的“初始”代码示例,该代码正常工作:
package phptravels;
import static org.junit.Assert.fail;
import java.io.File;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import outils.Log;
public class PhpTravelsJunit {
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
private static WebDriver driver;
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\scointe\\Documents\\Selenium\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize() ;
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
System.setProperty("log4j2.configuration", "C:\\Users\\scointe\\Documents\\Eclipse\\SeleniumPractice\\properties\\log4j2.xml");
}
@Test
public void PhpTravelsJunit() throws Exception {
Logger log = Logger.getLogger(PhpTravelsJunit.class);
startTestCase(log, "PhpTravels - Parcours articles");
driver.navigate().to("http://automationpractice.com/");
log.info("Redirection sur l'url du site");
//on remplit le champ de recherche avec le texte "dress" et on clique sur le bouton de recherche
driver.findElement(By.id("search_query_top")).sendKeys("dress");
driver.findElement(By.name("submit_search")).click();
log.info("Recherche des articles comportant le texte \"dress\"");
//on trie les résultats pas prix croissant
Select order = new Select(driver.findElement(By.id("selectProductSort")));
order.selectByValue("price:asc");
log.info("Tri des résultats par prix croissant");
//On se place sur le menu flottant "Women" pour sélectionner la catégorie "Tops" qui apparaît
Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.className("sf-with-ul"))).perform();
WebDriverWait wait = new WebDriverWait(driver, 15);
WebElement tops = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='block_top_menu']/ul/li[1]/ul/li[1]/a")));
actions.moveToElement(tops).perform();
tops.click();
log.info("Clic sur la catégorie \"Tops\" dans le menu flottant \"Women\"");
//On applique un filtre sur la couleur, pour n'avoir que des articles noirs
driver.findElement(By.id("layered_id_attribute_group_11")).click();
log.info("Filtre sur la couleur. Noir uniquement");
endTestCase(log);
//...
}
public static void startTestCase(Logger log, String caseName) {
log.info("****************************************************************************************");
log.info("------------------------- "+caseName+ " -------------------------");
log.info("****************************************************************************************");
}
public static void endTestCase(Logger log) {
log.info("XXXXXXXXXXXXXXXXXXXXXXX "+"-E---N---D-"+" XXXXXXXXXXXXXXXXXXXXXX");
log.info("X");
log.info("X");
log.info("");
log.info("");
}
}
然后,我决定编写一个名为“Log”的新类,它应该管理所有Logger任务,如下所示:
package outils;
import org.apache.log4j.Logger;
public class Log {
private static Logger Log = Logger.getLogger(Log.class.getName());
//private static Logger Log = Logger.getLogger("devpinoyLogger");
public static void startTestCase(String caseName) {
Log.info("****************************************************************************************");
Log.info("------------------------- "+caseName+ " -------------------------");
Log.info("****************************************************************************************");
}
public static void endTestCase() {
Log.info("XXXXXXXXXXXXXXXXXXXXXXX "+"-E---N---D-"+" XXXXXXXXXXXXXXXXXXXXXX");
Log.info("X");
Log.info("X");
Log.info("");
Log.info("");
}
public static void info(String msg) {
Log.info(msg);
}
public static void warn(String msg) {
Log.warn(msg);
}
public static void error(String msg) {
Log.error(msg);
}
public static void fatal(String msg) {
Log.fatal(msg);
}
public static void debug(String msg) {
Log.debug(msg);
}
}
最后,这是我的新类的代码,它只执行上面代码示例中显示的测试用例:
public class PhpTravelsNavigation {
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
private static WebDriver driver;
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\scointe\\Documents\\Selenium\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize() ;
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
System.setProperty("log4j2.configuration", "C:\\Users\\scointe\\Documents\\Eclipse\\SeleniumPractice\\properties\\log4j2.xml");
}
@Test
public void PhpTravelsNavigation() throws Exception {
Log.startTestCase("PhpTravels - Parcours articles");
driver.navigate().to("http://automationpractice.com/");
Log.info("Redirection sur l'url du site");
//on remplit le champ de recherche avec le texte "dress" et on clique sur le bouton de recherche
driver.findElement(By.id("search_query_top")).sendKeys("dress");
driver.findElement(By.name("submit_search")).click();
Log.info("Recherche des articles comportant le texte \"dress\"");
//on trie les résultats pas prix croissant
Select order = new Select(driver.findElement(By.id("selectProductSort")));
order.selectByValue("price:asc");
Log.info("Tri des résultats par prix croissant");
//On se place sur le menu flottant "Women" pour sélectionner la catégorie "Tops" qui apparaît
Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.className("sf-with-ul"))).perform();
WebDriverWait wait = new WebDriverWait(driver, 15);
WebElement tops = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='block_top_menu']/ul/li[1]/ul/li[1]/a")));
actions.moveToElement(tops).perform();
tops.click();
Log.info("Clic sur la catégorie \"Tops\" dans le menu flottant \"Women\"");
//On applique un filtre sur la couleur, pour n'avoir que des articles noirs
driver.findElement(By.id("layered_id_attribute_group_11")).click();
Log.info("Filtre sur la couleur. Noir uniquement");
Log.endTestCase();
}
@After
public void tearDown() throws Exception {
//driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
}
正如我所说,使用新代码,我只能在控制台中看到日志,而且我的日志文件中没有任何写入了。该文件已创建,但保持为空。实际上,当我的工作代码只创建一个新文件时,它甚至会覆盖具有相同名称的现有文件。
您是否知道可能导致这种情况的原因? 我不是Java的专家,也不是一般的编码,但欢迎所有答案。
如果您需要任何额外信息,请问我!
提前致谢:)
编辑:经过几次测试后,我可以确认我的Log类没有使用我的配置文件。我该如何解决这个问题?我甚至将它转换为非静态类,并使用构造函数进行实例化。但它似乎没有改变任何东西
答案 0 :(得分:0)
查看导入org.apache.log4j.Logger
和代码Logger log = Logger.getLogger(PhpTravelsJunit.class);
,您似乎正在使用Log4j 1,但您的配置文件是Log4j 2样式。
您应该使用Log4j 2 org.apache.logging.log4j.Logger
和org.apache.logging.log4j.LogManager
以及LogManager.getLogger(PhpTravelsJunit.class)
或切换到Log4j 1(不是最佳选项)。
当然,你需要适当的依赖/ jars。
PS:抱歉,写错LogManager.getRootLogger
代替LogManager.getLogger
我犯了一个错误。