Bird
Raised Fist0
Selenium Javatesting~15 mins

Logging with Log4j in Selenium Java - Build an Automation Script

Choose your learning style10 modes available
Verify logging messages are generated during login test using Log4j
Preconditions (3)
Step 1: Open the browser and navigate to the login page URL
Step 2: Log info message: 'Navigated to login page'
Step 3: Enter 'admin@test.com' in the email input field with id 'email'
Step 4: Log debug message: 'Entered email address'
Step 5: Enter 'Pass123!' in the password input field with id 'password'
Step 6: Log debug message: 'Entered password'
Step 7: Click the login button with id 'loginBtn'
Step 8: Log info message: 'Clicked login button'
Step 9: Wait until the URL changes to the dashboard URL 'https://example.com/dashboard'
Step 10: Log info message: 'Login successful, dashboard loaded'
✅ Expected Result: The login process completes successfully and the log file contains the info and debug messages in the correct order.
Automation Requirements - Selenium WebDriver with TestNG and Log4j2
Assertions Needed:
Verify the current URL is 'https://example.com/dashboard' after login
Verify log messages are generated (info and debug) during the test execution
Best Practices:
Use explicit waits to wait for page load or URL change
Use Page Object Model to separate page actions
Use Log4j2 logger instance properly with correct log levels
Avoid Thread.sleep; use WebDriverWait
Keep locators stable and readable (use By.id)
Automated Solution
Selenium Java
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.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.time.Duration;

public class LoginTest {

    private WebDriver driver;
    private WebDriverWait wait;
    private static final Logger logger = LogManager.getLogger(LoginTest.class);

    @BeforeClass
    public void setUp() {
        // Setup ChromeDriver path if needed
        driver = new ChromeDriver();
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        logger.info("Browser launched");
    }

    @Test
    public void testLoginWithLogging() {
        driver.get("https://example.com/login");
        logger.info("Navigated to login page");

        driver.findElement(By.id("email")).sendKeys("admin@test.com");
        logger.debug("Entered email address");

        driver.findElement(By.id("password")).sendKeys("Pass123!");
        logger.debug("Entered password");

        driver.findElement(By.id("loginBtn")).click();
        logger.info("Clicked login button");

        // Wait until URL changes to dashboard
        wait.until(ExpectedConditions.urlToBe("https://example.com/dashboard"));
        logger.info("Login successful, dashboard loaded");

        Assert.assertEquals(driver.getCurrentUrl(), "https://example.com/dashboard", "Dashboard URL should be loaded after login");
    }

    @AfterClass
    public void tearDown() {
        if (driver != null) {
            driver.quit();
            logger.info("Browser closed");
        }
    }
}

This test class uses Selenium WebDriver with TestNG and Log4j2 for logging.

1. Logger setup: We create a static logger instance using LogManager.getLogger for this class.

2. Setup method: Launches Chrome browser and initializes explicit wait. Logs info message.

3. Test method: Navigates to login page and logs info. Enters email and password with debug logs after each input. Clicks login button and logs info. Waits explicitly for the dashboard URL to load and logs success info. Asserts the URL is correct.

4. Teardown method: Closes browser and logs info.

Explicit waits avoid flaky tests. Using By.id locators keeps selectors stable. Logging at info and debug levels helps track test flow and data entry.

Common Mistakes - 4 Pitfalls
Using Thread.sleep() instead of explicit waits
{'mistake': 'Not initializing or configuring Log4j properly', 'why_bad': "Without proper Log4j setup, logs won't be generated or saved, making debugging difficult.", 'correct_approach': 'Include a valid log4j2.xml configuration file in the resources and initialize logger with LogManager.getLogger.'}
Using hardcoded XPath locators instead of stable By.id
Logging sensitive information like passwords
Bonus Challenge

Now add data-driven testing with 3 different sets of login credentials (valid and invalid) using TestNG data provider.

Show Hint

Practice

(1/5)
1. What is the main purpose of using Log4j in Selenium Java tests?
easy
A. To create graphical user interfaces for tests
B. To speed up the execution of Selenium tests
C. To record messages about test execution for debugging and analysis
D. To manage database connections during tests

Solution

  1. Step 1: Understand Log4j's role

    Log4j is a logging tool used to record messages during program execution.
  2. Step 2: Relate to Selenium tests

    In Selenium tests, logging helps track what happens and find issues.
  3. Final Answer:

    To record messages about test execution for debugging and analysis -> Option C
  4. Quick Check:

    Logging = record messages [OK]
Hint: Log4j records messages, not speeds or creates UI [OK]
Common Mistakes:
  • Thinking Log4j speeds up tests
  • Confusing logging with UI creation
  • Assuming Log4j manages databases
2. Which of the following is the correct way to create a Logger instance using Log4j in Java?
easy
A. Logger logger = Logger.getLogger("MyLogger");
B. Logger logger = new Logger();
C. Logger logger = Logger.createLogger();
D. Logger logger = Logger.initLogger("MyLogger");

Solution

  1. Step 1: Recall Log4j Logger creation syntax

    Log4j uses Logger.getLogger(String name) to create or get a logger.
  2. Step 2: Check options

    Only Logger logger = Logger.getLogger("MyLogger"); uses the correct method Logger.getLogger("MyLogger").
  3. Final Answer:

    Logger logger = Logger.getLogger("MyLogger"); -> Option A
  4. Quick Check:

    Use getLogger() to create Logger [OK]
Hint: Use Logger.getLogger("name") to create logger [OK]
Common Mistakes:
  • Trying to instantiate Logger with new
  • Using non-existent methods like createLogger or initLogger
  • Missing the logger name string
3. Given the following Log4j code snippet, what will be the output if the log level is set to WARN?
Logger logger = Logger.getLogger("TestLogger");
logger.info("Info message");
logger.warn("Warning message");
logger.error("Error message");
medium
A. Info message, Warning message, Error message
B. Warning message, Error message
C. Error message only
D. No output

Solution

  1. Step 1: Understand log level filtering

    Log4j outputs messages at or above the set level. WARN level shows WARN and ERROR but not INFO.
  2. Step 2: Apply to given messages

    INFO is below WARN, so skipped. WARN and ERROR messages are shown.
  3. Final Answer:

    Warning message, Error message -> Option B
  4. Quick Check:

    Log level WARN shows WARN and ERROR [OK]
Hint: Log4j shows messages at or above set level [OK]
Common Mistakes:
  • Assuming all messages print regardless of level
  • Thinking INFO is shown at WARN level
  • Confusing ERROR with higher or lower level
4. You wrote this Log4j code but no logs appear when running your Selenium tests:
Logger logger = Logger.getLogger("MyTestLogger");
logger.debug("Debug message");
What is the most likely reason?
medium
A. The log level is set higher than DEBUG, so debug messages are ignored
B. The logger was not created correctly
C. You must call logger.start() before logging
D. Log4j does not support DEBUG level

Solution

  1. Step 1: Check logger creation

    The logger creation syntax is correct, so this is not the issue.
  2. Step 2: Understand log level filtering

    If the log level is set above DEBUG (like INFO or WARN), debug messages won't show.
  3. Final Answer:

    The log level is set higher than DEBUG, so debug messages are ignored -> Option A
  4. Quick Check:

    Higher log level hides lower level messages [OK]
Hint: Check log level; DEBUG hidden if level is INFO or higher [OK]
Common Mistakes:
  • Thinking logger needs start() method
  • Assuming DEBUG is unsupported
  • Believing logger creation failed silently
5. You want to log messages in your Selenium Java tests using Log4j so that only ERROR and FATAL messages appear in the console, but INFO and WARN messages are saved to a file. Which Log4j feature should you use to achieve this?
hard
A. Use only one appender and filter messages in code before logging
B. Set the global log level to ERROR and log INFO messages manually to file
C. Log4j cannot separate messages by level to different outputs
D. Use two appenders with different thresholds and configure them in log4j.properties

Solution

  1. Step 1: Understand Log4j appenders

    Appenders send log messages to different outputs like console or files.
  2. Step 2: Use multiple appenders with thresholds

    You can configure one appender for console with ERROR level, and another for file with INFO or WARN level.
  3. Step 3: Configure in log4j.properties

    This setup is done in the configuration file, not by manual code filtering.
  4. Final Answer:

    Use two appenders with different thresholds and configure them in log4j.properties -> Option D
  5. Quick Check:

    Multiple appenders + thresholds = selective logging [OK]
Hint: Use multiple appenders with level filters in config file [OK]
Common Mistakes:
  • Trying to filter messages manually in code
  • Setting global level only without appenders
  • Thinking Log4j can't split outputs by level
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard