当前位置: 首页 > 知识库问答 >
问题:

如何在selenium webdriver测试框架中更有效地使用log4j

卜高超
2023-03-14

我正在从事selenium webdriver的一个自学项目,并使用log4j进行日志记录。有一个测试类——包含所有测试用例作为方法;有一个页面类——包含测试类可以使用的所有web元素和方法

我应该如何使用log4j?测试等级:

public class ConfiguringPropertiesFile {
    private WebDriver driver;
    private String baseUrl;
    static Logger log = Logger.getLogger(ConfiguringPropertiesFile.class);

@Before
public void setUp() throws Exception {
    driver = new FirefoxDriver();
    baseUrl = "https://www.some-website.com/";

    // Maximize the browser's window
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

@Test
public void test() {
    PropertyConfigurator.configure("log4j.properties");
    driver.get(baseUrl);
    SearchPage.navigateToFlightsTab(driver);
    log.info("Navigate to flights tab");
    SearchPage.fillOriginTextBox(driver, "New York");
    SearchPage.destinationTextBox(driver).sendKeys("Chicago");
    log.info("Enter destination city");
    SearchPage.departureDateTextBox(driver).sendKeys("12/25/2014");
    log.info("Enter departure date");
    SearchPage.returnDateTextBox(driver).sendKeys("12/31/2014");
    log.info("Enter return date");
}

}

页面类:

public class SearchPage {
public static WebElement element = null;
static Logger log1 = Logger.getLogger(SearchPage.class);

/**
 * Returns the flight origin text box element
 * @param driver
 * @return
 */
public static WebElement originTextBox(WebDriver driver) {
    element = driver.findElement(By.id("flight-origin"));
    return element;
}

public static void fillOriginTextBox(WebDriver driver, String origin) {
    PropertyConfigurator.configure("log4j.properties");
    element = originTextBox(driver);
    element.sendKeys(origin);
    log1.info("Entering the source city as " + origin);
}

/**
 * Returns the flight destination text box element
 * @param driver
 * @return
 */
public static WebElement destinationTextBox(WebDriver driver) {
    element = driver.findElement(By.id("flight-destination"));
    return element;
}

}

在这种情况下,我在两个类中初始化log4j,然后最大的问题是我必须在每个方法中调用属性配置器。

我怎样才能以更好的方式初始化它,而不必每次都调用Property tyConfigurator?

共有1个答案

钱照
2023-03-14

您可能希望有一个单独的类,可以在其中初始化log4j,并从该类中调用一个方法,以在其他每个类中获得log4j的实例。在下面的示例中,您可以从任何其他类调用createLogger()方法来获取Log4j的实例,例如use:private Logger log=Logg。createLogger();

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

public class Logg {

private static Logger _logger;
private static final String fileName = "defaultlog";
private static final String dateAndTimeFormat = "MM-dd-yyyy_hh.mm.ss";
private static final String logProperttFilePath = "./src/main/resources/com/framework/properties/log4j.properties";

static {
    /**
     * This is the static block which appends the log file name with the
     * timestamp to make it unique
     */
    try {
        String dateTime = DateAndTime
                .getFormattedCurrentDateAndTime(dateAndTimeFormat);
        String FileName = fileName + "-" + dateTime + ".log";
        File file = new File("logs/" + FileName);

        if (file.createNewFile()) {
            Properties props = new Properties();
            props.load(new FileInputStream(logProperttFilePath));
            props.setProperty("log4j.appender.File.File", "logs/"
                    + FileName);
            LogManager.resetConfiguration();
            PropertyConfigurator.configure(props);
            System.out.println("Property log4j.appender.File.File = logs/"
                    + FileName);
        }
    } catch (IOException ex) {
        ex.printStackTrace();
        System.out.print("IO Exception in static method of Logger Class. "
                + ex.getMessage());
        System.exit(-1);
    }

}

/**
 * This method creates instance of the Logger class coming from log4j jar by
 * implementing a singelton
 * 
 * @return _logger - new instance if no instance exist else an existing
 *         instance if the method is invoked previously
 */
public static Logger createLogger() {
    if (_logger == null) {
        _logger = LogManager.getLogger(Logg.class);
        return _logger;
    } else
        return _logger;
}
}
 类似资料:
  • 问题内容: 我使用绑定框架已有一段时间了,我想知道您如何处理这种情况。 您的报纸有一些属性,例如 (字符串)标题 (布尔值)已发布 (日期)发布日期 在您看来,您拥有一份报纸列表,可以同时对其进行全部编辑。这意味着您可以在单个请求中更改所有newspape的标题或“已发布”的所有状态。 问题在于,当我们使用绑定框架时,​​您将有点像编辑数据库中的数据一样编辑报纸的数据…将每个值彼此独立地绑定到字段

  • 我正在用Ionic framework开发移动应用程序。移动应用程序有一个登录页面。 登录页面后,转到另一个显示用户信息的页面。首先用户登录系统,之后用户可以看到自己的信息。但注销后,另一个用户登录到系统中,另一个用户看不到自己的信息,用户看到的是老用户的信息。如何重新加载用户信息页面? 我试图解决这样的问题; 注销时, 但这并不有效。 有其他解决方案吗?有人能帮我吗?我如何重新加载信息页面? 我

  • 我已经创建了一些mapstruct映射器,并用spring构造函数注入进行了注释。我知道在测试中,我可以用自动绘制映射器,但它看起来很重,加载速度很慢。我可以在不初始化spring上下文的情况下获取映射器吗?这是好的做法吗?

  • 测试框架工具 Karma Intern NightWatch.js

  • 问题内容: 我如何在seleniumwebdriver 3.0 beta版本中使用geckodriver。当我实例化Firefox时: 我得到错误: 线程“主”中的异常java.lang.IllegalStateException:驱动程序可执行文件的路径必须由webdriver.gecko.driver系统属性设置;否则,必须执行以下操作:有关更多信息,请参见 https://github.co

  • 问题内容: 我想使用Jenkins运行用TestNG框架编写的Selenium测试。 在jenkins job(Freestyle project)中配置的命令: 注意:对于,给定目录路径 当我运行作业(选项)时,它被Selenium的create session活动打中并给出错误。 注意: 同样的命令运行 成功地 从运行时 的命令行 。 控制台输出的错误日志: (jenkins) 以下是测试课程