Bird
Raised Fist0
Selenium Javatesting~15 mins

Logging test steps in Selenium Java - Build an Automation Script

Choose your learning style10 modes available
Verify login functionality with step logging
Preconditions (2)
Step 1: Open the login page URL
Step 2: Log step: 'Opened login page'
Step 3: Enter 'testuser@example.com' in the email input field
Step 4: Log step: 'Entered email address'
Step 5: Enter 'Test@1234' in the password input field
Step 6: Log step: 'Entered password'
Step 7: Click the login button
Step 8: Log step: 'Clicked login button'
Step 9: Verify that the user is redirected to the dashboard page
Step 10: Log step: 'Verified dashboard page is displayed'
✅ Expected Result: User successfully logs in and dashboard page is displayed with all steps logged
Automation Requirements - Selenium WebDriver with TestNG
Assertions Needed:
Verify current URL contains '/dashboard'
Verify page title is 'Dashboard'
Best Practices:
Use explicit waits to wait for elements
Use meaningful locators (By.id, By.name)
Log each test step clearly using a logger
Use TestNG assertions for validation
Automated Solution
Selenium Java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
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 java.time.Duration;
import java.util.logging.Logger;

public class LoginTestWithLogging {
    private WebDriver driver;
    private WebDriverWait wait;
    private final Logger logger = Logger.getLogger(LoginTestWithLogging.class.getName());

    @BeforeClass
    public void setUp() {
        // Set path to chromedriver if needed
        driver = new ChromeDriver();
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        logger.info("Starting test setup");
    }

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

        WebElement emailInput = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("email")));
        emailInput.sendKeys("testuser@example.com");
        logger.info("Entered email address");

        WebElement passwordInput = driver.findElement(By.id("password"));
        passwordInput.sendKeys("Test@1234");
        logger.info("Entered password");

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

        wait.until(ExpectedConditions.urlContains("/dashboard"));
        logger.info("Verified dashboard page is displayed");

        String currentUrl = driver.getCurrentUrl();
        Assert.assertTrue(currentUrl.contains("/dashboard"), "URL does not contain '/dashboard'");

        String pageTitle = driver.getTitle();
        Assert.assertEquals(pageTitle, "Dashboard", "Page title is not 'Dashboard'");
    }

    @AfterClass
    public void tearDown() {
        if (driver != null) {
            driver.quit();
            logger.info("Closed browser and ended test");
        }
    }
}

This test uses Selenium WebDriver with TestNG to automate the login process.

We start by opening the login page and log this step using logger.info.

We wait explicitly for the email input to be visible before entering the email, then log the step.

We locate the password input and enter the password, logging the step.

We click the login button and log that action.

We wait until the URL contains '/dashboard' to confirm navigation, then log the verification.

Assertions check that the URL and page title are correct to confirm successful login.

The @BeforeClass and @AfterClass methods set up and clean up the browser session.

Logging each step helps track test progress and makes debugging easier if something fails.

Common Mistakes - 4 Pitfalls
Using Thread.sleep() instead of explicit waits
Using brittle XPath locators like absolute paths
Not logging test steps
Mixing assertion styles or not asserting at all
Bonus Challenge

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

Show Hint

Practice

(1/5)
1. What is the main purpose of adding logging statements in Selenium Java tests?
easy
A. To make the test run faster
B. To show what the test is doing step-by-step
C. To change the test results
D. To hide errors from the user

Solution

  1. Step 1: Understand logging purpose

    Logging records actions during test execution to track progress.
  2. Step 2: Identify correct purpose

    Logging helps see what the test does, not speed or hide errors.
  3. Final Answer:

    To show what the test is doing step-by-step -> Option B
  4. Quick Check:

    Logging = Show test steps [OK]
Hint: Logging tells what happens during tests [OK]
Common Mistakes:
  • Thinking logging speeds up tests
  • Believing logging changes test results
  • Assuming logging hides errors
2. Which of the following is the correct way to create a Logger instance in Selenium Java?
easy
A. Logger logger = Logger.createLogger();
B. Logger logger = new Logger();
C. Logger logger = Logger.getLogger("TestLogger");
D. Logger logger = Logger();

Solution

  1. Step 1: Recall Logger creation syntax

    In Java, Logger is created using getLogger with a name string.
  2. Step 2: Check options for correct syntax

    Only Logger logger = Logger.getLogger("TestLogger"); uses Logger.getLogger with a string, which is correct.
  3. Final Answer:

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

    Logger creation = getLogger("name") [OK]
Hint: Use Logger.getLogger("name") to create logger [OK]
Common Mistakes:
  • Trying to instantiate Logger with new
  • Using wrong method names like createLogger
  • Calling Logger as a function
3. What will be the output in the console after running this code snippet?
Logger logger = Logger.getLogger("TestLogger");
logger.info("Starting test");
logger.warning("Element not found");
medium
A. Error: Logger not initialized
B. Starting test\nElement not found
C. No output
D. INFO: Starting test\nWARNING: Element not found

Solution

  1. Step 1: Understand logger methods

    logger.info prints info level messages; logger.warning prints warning level messages.
  2. Step 2: Predict console output format

    Output includes level labels INFO and WARNING before messages.
  3. Final Answer:

    INFO: Starting test\nWARNING: Element not found -> Option D
  4. Quick Check:

    Logger output = Level + message [OK]
Hint: Logger prints level name before message [OK]
Common Mistakes:
  • Expecting messages without level labels
  • Thinking logger prints nothing by default
  • Confusing info and warning outputs
4. Identify the error in this Selenium Java logging code:
Logger logger = Logger.getLogger("TestLogger")
logger.info("Test started");
medium
A. Missing semicolon after getLogger statement
B. Logger cannot be used without import
C. logger.info should be logger.log
D. Logger name must be a class, not a string

Solution

  1. Step 1: Check Java syntax

    Java statements must end with a semicolon (;).
  2. Step 2: Find missing semicolon

    The first line lacks a semicolon after getLogger call.
  3. Final Answer:

    Missing semicolon after getLogger statement -> Option A
  4. Quick Check:

    Java lines end with ; [OK]
Hint: Check for missing semicolons in Java code [OK]
Common Mistakes:
  • Ignoring missing semicolon errors
  • Confusing logger.info with logger.log
  • Thinking Logger name must be a class
5. You want to log each step of a Selenium test to help debug failures. Which approach is best to add logging for multiple steps?
hard
A. Create one Logger instance and call logger.info() before each test action
B. Create a new Logger instance before every test step
C. Use System.out.println() instead of Logger for all steps
D. Add logging only after test finishes

Solution

  1. Step 1: Understand efficient logging practice

    One Logger instance reused for all steps is efficient and clear.
  2. Step 2: Evaluate other options

    Creating many Logger instances wastes resources; System.out.println lacks levels; logging only after test misses step details.
  3. Final Answer:

    Create one Logger instance and call logger.info() before each test action -> Option A
  4. Quick Check:

    Reuse one Logger, log each step [OK]
Hint: Use one Logger, log before each action [OK]
Common Mistakes:
  • Creating multiple Logger instances unnecessarily
  • Using print statements instead of Logger
  • Logging only at test end
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