Popular Searches
Popular Course Categories
Popular Courses

Logging

Screenshots & Reporting

Logging in Selenium Automation

Logging is the process of recording important information about the execution of an application or automated test. In Selenium automation, logging helps testers understand what happened during test execution, identify the step where a failure occurred, troubleshoot errors, monitor browser actions, and maintain useful execution history.

In a Selenium TestNG framework, logs can record events such as opening the browser, launching the application, entering test data, clicking buttons, navigating between pages, performing validations, passing a test, failing a test, and closing the browser.

A well-designed logging mechanism makes an automation framework easier to debug, maintain, monitor, and support, especially when a large number of tests are executed through Maven, CI/CD pipelines, Jenkins, or other automation environments.

Course Resource: Selenium Training | Register for Course Demo


1. What is Logging?

Logging is the practice of recording messages about the execution of a program or test. These messages provide information about what the application or automation script is doing at different stages.

For example, during a Selenium login test, useful logs may include:

  • Browser started.
  • Application opened.
  • Login page displayed.
  • Username entered.
  • Password entered.
  • Login button clicked.
  • Dashboard displayed.
  • Login validation completed.
  • Browser closed.

When a test fails, the logs can help identify the last successful step and provide context around the failure.


2. Why is Logging Important in Selenium?

Logging is especially important in Selenium automation because automated tests may execute many browser interactions without continuous human observation.

  • Helps identify where a test failed.
  • Provides a chronological execution history.
  • Makes debugging easier.
  • Helps understand browser and application behavior.
  • Provides useful information in CI/CD execution.
  • Helps analyze intermittent failures.
  • Supports maintenance of large automation frameworks.
  • Can provide additional context alongside screenshots and reports.
  • Helps developers and testers understand automation failures.
  • Provides a permanent execution record when logs are stored in files.


3. Logging Flow in Selenium Automation

Test Execution

      |

      v

Test Method Starts

      |

      v

Log Test Start

      |

      v

Open Browser

      |

      v

Log Browser Information

      |

      v

Open Application

      |

      v

Log Application Navigation

      |

      v

Perform Selenium Actions

      |

      v

Log Important Steps

      |

      v

Validate Expected Result

      |

      +------------------+

      |                  |

      v                  v

    PASS               FAIL

      |                  |

      v                  v

  Log PASS          Log ERROR

      |                  |

      +--------+---------+

               |

               v

          Test Report

               |

               v

          Log File


4. Logging vs Reporting

Logging and reporting are related but they serve different purposes.

FeatureLoggingReporting
Main PurposeRecord execution detailsPresent test execution results
FocusEvents and diagnostic informationPass, fail, skip and execution summary
Typical OutputConsole or log fileHTML, XML or other report
DebuggingVery usefulUseful for result analysis
Detailed StepsCan contain detailed stepsUsually contains summarized results
Failure InformationCan record detailed contextUsually displays failure status and details


5. Logging Levels

Logging frameworks generally provide different levels so that users can control how much information is recorded.

Common levels include:

LevelPurposeTypical Example
TRACEVery detailed execution informationLow-level diagnostic information
DEBUGDetailed debugging informationElement interaction details
INFONormal execution informationApplication opened
WARNPotential issue or unexpected conditionOptional element unavailable
ERRORAn error occurredLogin action failed
FATALCritical failureFramework cannot continue

The exact levels available depend on the logging framework being used.


6. INFO Logging

INFO logging is commonly used for normal and meaningful test execution events.

logger.info("Opening application");

logger.info("Entering username");

logger.info("Clicking login button");

logger.info("Login validation completed");

INFO messages should describe important milestones rather than every minor internal operation.


7. DEBUG Logging

DEBUG logging is useful when more detailed information is required to diagnose a problem.

logger.debug("Username field located");

logger.debug("Username value entered");

logger.debug("Login button located");

logger.debug("Current URL: " + driver.getCurrentUrl());

Debug logging is especially useful during framework development and troubleshooting.


8. WARN Logging

WARN indicates that something unexpected happened but the test may still be able to continue.

logger.warn("Optional banner was not displayed");

logger.warn("Search result count is lower than expected");

Warnings should not be used for every minor event. They should indicate conditions that deserve attention.


9. ERROR Logging

ERROR logging is used when an operation fails or an exception occurs.

logger.error("Login operation failed");

logger.error("Unable to locate username field");

In real frameworks, exception information should also be captured when appropriate.


10. Java Logging in Selenium

Java provides a built-in logging API through the java.util.logging package. Selenium Java projects can also use third-party logging frameworks such as Log4j2 or SLF4J with an appropriate logging implementation.

A simple Java logger can be created as follows:

import java.util.logging.Logger;

 

public class LoginTest {

 

    private static final Logger logger =

            Logger.getLogger(LoginTest.class.getName());

 

    public void executeTest() {

        logger.info("Starting login test");

    }

}


11. Using Logger in a Selenium Test

import java.util.logging.Logger;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

 

public class SeleniumLoggingExample {

 

    private static final Logger logger =

            Logger.getLogger(SeleniumLoggingExample.class.getName());

 

    public void openApplication() {

 

        logger.info("Starting browser");

 

        WebDriver driver = new ChromeDriver();

 

        logger.info("Browser started successfully");

 

        driver.get("https://example.com");

 

        logger.info("Application opened");

 

        driver.quit();

 

        logger.info("Browser closed");

    }

}


12. Logging with TestNG

Logging can be integrated with TestNG test methods and configuration methods.

import java.util.logging.Logger;

import org.testng.annotations.Test;

 

public class LoginTest {

 

    private static final Logger logger =

            Logger.getLogger(LoginTest.class.getName());

 

    @Test

    public void loginTest() {

 

        logger.info("Login test started");

 

        logger.info("Opening login page");

 

        logger.info("Entering username");

 

        logger.info("Entering password");

 

        logger.info("Clicking login button");

 

        logger.info("Login test completed");

    }

}


13. Logging in @BeforeMethod and @AfterMethod

TestNG configuration methods are useful locations for logging browser setup and cleanup activities.

import java.util.logging.Logger;

import org.testng.annotations.AfterMethod;

import org.testng.annotations.BeforeMethod;

import org.testng.annotations.Test;

 

public class LoginTest {

 

    private static final Logger logger =

            Logger.getLogger(LoginTest.class.getName());

 

    @BeforeMethod

    public void setup() {

        logger.info("Starting test setup");

        logger.info("Launching browser");

    }

 

    @Test

    public void loginTest() {

        logger.info("Executing login test");

    }

 

    @AfterMethod

    public void tearDown() {

        logger.info("Starting test cleanup");

        logger.info("Closing browser");

    }

}


14. Logging Selenium WebDriver Actions

Important WebDriver actions should be logged at meaningful points in the test.

logger.info("Opening login page");

driver.get("https://example.com/login");

 

logger.info("Entering username");

driver.findElement(By.id("username")).sendKeys("admin");

 

logger.info("Entering password");

driver.findElement(By.id("password")).sendKeys("admin123");

 

logger.info("Clicking login button");

driver.findElement(By.id("loginButton")).click();

Logging every single WebDriver operation may create excessive logs. It is generally better to log meaningful business or test steps.


15. Logging Test Start and Completion

A useful automation framework records when an important test starts and when it finishes.

logger.info("=================================");

logger.info("Login Test Started");

 

logger.info("Executing login workflow");

 

logger.info("Login Test Completed");

logger.info("=================================");


16. Logging Test Data

Test data can be logged when it helps identify the test execution, but sensitive information should not be exposed.

logger.info("Executing login for user: " + username);

Avoid logging passwords, authentication tokens, API keys, session cookies, or other secrets.

// Avoid

logger.info("Password: " + password);

 

// Better

logger.info("Login password supplied securely for user: " + username);


17. Logging Current URL

When debugging navigation problems, recording the current URL can be useful.

logger.info("Current URL: " + driver.getCurrentUrl());

This can help identify unexpected redirects, navigation failures, or incorrect application environments.


18. Logging Page Title

The current page title can also be recorded.

logger.info("Current page title: " + driver.getTitle());

This is particularly useful when validating that the expected page has been opened.


19. Logging Browser Information

Browser information can be useful when tests are executed across multiple browsers.

logger.info("Starting Chrome browser");

logger.info("Executing login test on Chrome");

For a larger framework, browser information can be captured from configuration or driver capabilities.


20. Logging Exceptions

Exceptions should be logged with enough context to understand what operation failed.

try {

    driver.findElement(By.id("loginButton")).click();

    logger.info("Login button clicked successfully");

} catch (Exception e) {

    logger.severe("Unable to click login button: " + e.getMessage());

    throw e;

}

Re-throwing the exception after logging allows the test framework to correctly identify the test as failed.


21. Logging with try-catch

try {

    logger.info("Opening application");

    driver.get("https://example.com");

 

    logger.info("Application opened successfully");

 

} catch (Exception e) {

 

    logger.severe(

        "Application opening failed: " + e.getMessage()

    );

 

    throw e;

}


22. Logging Element Interaction

Important element interactions can be recorded before or after the action.

logger.info("Locating username field");

 

WebElement usernameField =

        driver.findElement(By.id("username"));

 

logger.info("Entering username");

 

usernameField.sendKeys(username);

 

logger.info("Username entered successfully");


23. Logging Assertions

Assertions can also be surrounded by meaningful log messages.

logger.info("Validating dashboard title");

 

Assert.assertTrue(

    driver.getTitle().contains("Dashboard")

);

 

logger.info("Dashboard title validation passed");

For failed assertions, the test framework will normally provide failure information, while logging provides additional context around what was being validated.


24. Logging Test Failures

When a test fails, the log should help answer three questions:

  • What test was running?
  • What step was being executed?
  • What error occurred?

logger.info("Starting login validation");

logger.info("Clicking login button");

 

try {

    driver.findElement(By.id("loginButton")).click();

} catch (Exception e) {

    logger.severe(

        "Login button click failed: " + e.getMessage()

    );

    throw e;

}


25. Logging Screenshots

Logging and screenshots can work together. When an important failure occurs, a framework can capture a screenshot and log its location.

String screenshotPath =

        "screenshots/login_failure.png";

 

logger.severe(

    "Login test failed. Screenshot saved at: "

    + screenshotPath

);

The actual screenshot capture is normally implemented through a reusable utility or TestNG listener.


26. Logging Test Status

A framework can maintain meaningful status messages for successful and unsuccessful executions.

logger.info("TEST STARTED: Login Test");

logger.info("STEP: Open login page");

logger.info("STEP: Enter username");

logger.info("STEP: Enter password");

logger.info("STEP: Click login");

logger.info("STEP: Validate dashboard");

logger.info("TEST PASSED: Login Test");


27. Logging to Console

Console logging displays messages directly in the IDE or terminal during test execution.

logger.info("Starting Selenium test");

logger.info("Opening application");

logger.info("Test execution completed");

Console logs are useful during local development because the tester can immediately observe execution progress.


28. Logging to a File

For larger frameworks, logs are often stored in files so they can be reviewed after execution.

Java's built-in logging API can use a file handler:

import java.io.IOException;

import java.util.logging.FileHandler;

import java.util.logging.Logger;

 

public class FileLoggingExample {

 

    private static final Logger logger =

            Logger.getLogger(FileLoggingExample.class.getName());

 

    public static void main(String[] args)

            throws IOException {

 

        FileHandler handler =

                new FileHandler("automation.log");

 

        logger.addHandler(handler);

 

        logger.info("Automation execution started");

    }

}


29. Log File Example

A simple log file might contain entries such as:

INFO: Automation execution started

INFO: Browser launched

INFO: Application opened

INFO: Login page displayed

INFO: Username entered

INFO: Password entered

INFO: Login button clicked

INFO: Dashboard validation started

INFO: Dashboard validation passed

INFO: Browser closed

INFO: Test completed


30. Log4j2 in Selenium Frameworks

Log4j2 is a commonly used logging framework in Java applications and automation frameworks. It provides configurable log levels, appenders, formatting, file output, console output, and other logging capabilities.

A typical Selenium framework can use Log4j2 to centralize logging instead of creating logging configuration independently inside every test class.


31. Basic Log4j2 Logger Example

import org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;

 

public class LoginTest {

 

    private static final Logger logger =

            LogManager.getLogger(LoginTest.class);

 

    public void login() {

 

        logger.info("Login test started");

 

        logger.debug("Opening login page");

 

        logger.info("Entering username");

 

        logger.info("Clicking login button");

 

        logger.info("Login test completed");

    }

}


32. Log4j2 Configuration Concept

A logging framework normally has two important parts:

  • Logger: Generates log messages.
  • Appender: Determines where logs are written.

Common destinations include:

  • Console.
  • File.
  • Rolling file.
  • Other application-specific destinations.


33. Logging with SLF4J

SLF4J provides a logging abstraction that allows application code to work with a consistent logging API while the underlying logging implementation can be configured separately.

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

public class LoginTest {

 

    private static final Logger logger =

            LoggerFactory.getLogger(LoginTest.class);

 

    public void loginTest() {

 

        logger.info("Login test started");

        logger.debug("Preparing login data");

        logger.info("Login test completed");

    }

}


34. Logging with Page Object Model

Logging works very well with the Page Object Model. Page classes can log important actions while test classes focus on business scenarios and validations.

public class LoginPage {

 

    private WebDriver driver;

 

    private By username =

            By.id("username");

 

    private By password =

            By.id("password");

 

    private By loginButton =

            By.id("loginButton");

 

    private static final Logger logger =

            Logger.getLogger(LoginPage.class.getName());

 

    public LoginPage(WebDriver driver) {

        this.driver = driver;

    }

 

    public void login(String user, String pass) {

 

        logger.info("Entering username");

        driver.findElement(username).sendKeys(user);

 

        logger.info("Entering password");

        driver.findElement(password).sendKeys(pass);

 

        logger.info("Clicking login button");

        driver.findElement(loginButton).click();

    }

}


35. Logging in Utility Classes

Reusable utility classes can also use logging.

public class ScreenshotUtility {

 

    private static final Logger logger =

            Logger.getLogger(

                ScreenshotUtility.class.getName()

            );

 

    public static void saveScreenshot() {

        logger.info("Capturing screenshot");

    }

}

This makes framework-level operations easier to trace.


36. Logging in Driver Factory

A Driver Factory is responsible for creating WebDriver instances. Logging can record browser initialization.

public class DriverFactory {

 

    private static final Logger logger =

            Logger.getLogger(DriverFactory.class.getName());

 

    public static WebDriver createDriver(

            String browser) {

 

        logger.info(

            "Creating WebDriver for: " + browser

        );

 

        if (browser.equalsIgnoreCase("chrome")) {

            return new ChromeDriver();

        }

 

        if (browser.equalsIgnoreCase("firefox")) {

            return new FirefoxDriver();

        }

 

        throw new IllegalArgumentException(

            "Unsupported browser: " + browser

        );

    }

}


37. Logging with Data Providers

When TestNG Data Providers execute the same test with multiple data sets, logging can help identify which data set is currently being processed.

@DataProvider(name = "users")

public Object[][] users() {

    return new Object[][] {

        {"admin"},

        {"manager"},

        {"employee"}

    };

}

 

@Test(dataProvider = "users")

public void loginTest(String username) {

 

    logger.info(

        "Executing login test for user: " + username

    );

}

Sensitive values such as passwords should not be written into logs.


38. Logging Parallel Tests

When tests execute in parallel, logs should contain enough information to identify the test or thread that generated the message.

logger.info(

    "Thread: "

    + Thread.currentThread().getId()

    + " - Login test started"

);

This becomes particularly useful when several browser sessions are running at the same time.


39. Logging TestNG Listeners

TestNG listeners can be used to observe test execution events such as test start, success, failure, and skip events.

A listener can centralize logging instead of adding the same status-handling code to every test class.

import org.testng.ITestListener;

import org.testng.ITestResult;

 

public class TestListener implements ITestListener {

 

    @Override

    public void onTestStart(ITestResult result) {

        System.out.println(

            "TEST STARTED: "

            + result.getName()

        );

    }

 

    @Override

    public void onTestSuccess(ITestResult result) {

        System.out.println(

            "TEST PASSED: "

            + result.getName()

        );

    }

 

    @Override

    public void onTestFailure(ITestResult result) {

        System.out.println(

            "TEST FAILED: "

            + result.getName()

        );

    }

 

    @Override

    public void onTestSkipped(ITestResult result) {

        System.out.println(

            "TEST SKIPPED: "

            + result.getName()

        );

    }

}


40. Registering a TestNG Listener

A listener can be registered using the @Listeners annotation.

import org.testng.annotations.Listeners;

 

@Listeners(TestListener.class)

public class LoginTest {

 

    @Test

    public void loginTest() {

        System.out.println("Executing login test");

    }

}


41. Logging Before and After Test Execution

public class TestListener

        implements ITestListener {

 

    @Override

    public void onTestStart(ITestResult result) {

        System.out.println(

            "Starting: " + result.getName()

        );

    }

 

    @Override

    public void onTestSuccess(ITestResult result) {

        System.out.println(

            "Passed: " + result.getName()

        );

    }

 

    @Override

    public void onTestFailure(ITestResult result) {

        System.out.println(

            "Failed: " + result.getName()

        );

    }

}


42. Logging Test Exceptions

Listeners can also access exceptions associated with failed tests.

@Override

public void onTestFailure(ITestResult result) {

 

    Throwable error =

            result.getThrowable();

 

    System.out.println(

        "Test failed: " + result.getName()

    );

 

    if (error != null) {

        System.out.println(

            "Error: " + error.getMessage()

        );

    }

}


43. Logging with Test Reports

Logging and reporting complement each other. A test report can show the final result while logs provide additional execution details.

Test Report

    |

    +-- Login Test - PASS

    |

    +-- Search Test - FAIL

             |

             +-- Log File

             |

             +-- Screenshot

             |

             +-- Exception

             |

             +-- Current URL

This structure provides multiple sources of information when diagnosing failures.


44. Logging and Screenshots on Failure

A professional automation framework can combine a failure listener, screenshot utility, and logger.

@Override

public void onTestFailure(ITestResult result) {

 

    logger.severe(

        "Test failed: " + result.getName()

    );

 

    logger.severe(

        "Capturing failure screenshot"

    );

 

    // Screenshot utility can be called here.

}


45. Logging Current Test Name

When many tests are running, recording the test name makes logs easier to analyze.

logger.info(

    "Executing test: " + result.getName()

);

Test names are especially useful in CI/CD pipelines where several test classes may execute together.


46. Logging Environment Information

Environment information can be recorded at the beginning of a test suite.

logger.info("Environment: QA");

logger.info("Browser: Chrome");

logger.info("Application URL: https://qa.example.com");

Environment logging can help determine whether a failure occurred in QA, staging, or another test environment.


47. Logging Browser and Environment Combination

logger.info(

    "Browser: Chrome | Environment: QA"

);

 

logger.info(

    "Browser: Firefox | Environment: Stage"

);

This is useful when the same test suite runs across multiple browsers and environments.


48. Logging Search Automation

logger.info("Starting search test");

 

logger.info(

    "Searching for product: " + searchText

);

 

driver.findElement(By.id("search"))

        .sendKeys(searchText);

 

logger.info("Clicking search button");

 

driver.findElement(By.id("searchButton"))

        .click();

 

logger.info("Search results displayed");


49. Logging E-Commerce Test Execution

logger.info("Opening product page");

logger.info("Selecting product");

logger.info("Adding product to cart");

logger.info("Opening cart");

logger.info("Proceeding to checkout");

logger.info("Selecting payment method");

logger.info("Submitting order");

logger.info("Validating order confirmation");

These business-level logs make a long workflow easier to understand.


50. Logging API and UI Test Execution

In hybrid automation frameworks, logging can be used for both API and UI actions.

logger.info("Sending API request");

logger.info("Validating API response");

logger.info("Opening browser");

logger.info("Launching application");

logger.info("Validating UI result");


51. Logging Maven Test Execution

When Selenium TestNG tests are executed through Maven, console and file logs can help identify build-level and test-level problems.

mvn test

A typical execution flow is:

Maven

  |

  v

TestNG

  |

  v

Test Classes

  |

  v

Selenium WebDriver

  |

  v

Application

  |

  v

Logs + Reports


52. Logging in CI/CD Pipelines

CI/CD environments execute tests without continuous manual observation. Logs therefore become especially important for diagnosing failed builds.

Developer Commit

      |

      v

CI/CD Pipeline

      |

      v

Build

      |

      v

Maven Test

      |

      v

TestNG

      |

      v

Selenium Tests

      |

      v

Logging

      |

      v

Reports

      |

      v

Build Result


53. Logging in Jenkins

When Selenium tests execute through Jenkins, logs can help identify failures that occur on the build server but cannot be reproduced immediately on a local machine.

Useful information can include:

  • Build number.
  • Test class.
  • Test method.
  • Browser.
  • Environment.
  • Application URL.
  • Execution step.
  • Exception.
  • Screenshot location.
  • Test completion status.


54. Logging with Thread Information

Thread information becomes important when TestNG runs tests in parallel.

long threadId =

        Thread.currentThread().getId();

 

logger.info(

    "Thread " + threadId

    + " started test execution"

);


55. Logging and Thread-Safe Framework Design

Parallel Selenium tests should maintain isolated browser sessions and test data. Logging should also make concurrent execution distinguishable.

Thread 12 -> Chrome -> Login Test

Thread 13 -> Firefox -> Search Test

Thread 14 -> Edge -> Checkout Test

Using thread identifiers, test names, browser names, or other contextual information can make parallel logs easier to understand.


56. Structured Logging Concept

Structured logging means organizing log information in a consistent format so it can be searched and analyzed easily.

TIME | LEVEL | TEST | BROWSER | MESSAGE

 

10:15 | INFO  | LoginTest | Chrome | Test started

10:16 | INFO  | LoginTest | Chrome | Login page opened

10:16 | INFO  | LoginTest | Chrome | Username entered

10:16 | ERROR | LoginTest | Chrome | Login validation failed


57. Logging Business-Level Steps

Automation logs should focus on meaningful business actions rather than producing unnecessary low-level noise.

For example:

logger.info("User navigated to checkout");

logger.info("Product added to cart");

logger.info("Shipping information submitted");

logger.info("Payment validation completed");

These messages are generally more useful than logging every internal Java operation.


58. Logging Locator Failures

When an element cannot be located, logging the relevant action can make the problem easier to diagnose.

try {

 

    logger.info("Locating login button");

 

    driver.findElement(

        By.id("loginButton")

    ).click();

 

} catch (Exception e) {

 

    logger.severe(

        "Unable to locate or click login button: "

        + e.getMessage()

    );

 

    throw e;

}


59. Logging Wait Operations

Explicit waits can also be associated with meaningful logs.

logger.info("Waiting for dashboard element");

 

WebDriverWait wait =

        new WebDriverWait(

            driver,

            Duration.ofSeconds(10)

        );

 

wait.until(

    ExpectedConditions.visibilityOfElementLocated(

        By.id("dashboard")

    )

);

 

logger.info("Dashboard element is visible");


60. Logging Navigation

logger.info("Navigating to login page");

driver.get("https://example.com/login");

 

logger.info(

    "Navigation completed. Current URL: "

    + driver.getCurrentUrl()

);


61. Logging Navigation Failures

try {

 

    logger.info("Opening application");

 

    driver.get("https://example.com");

 

    logger.info("Application opened successfully");

 

} catch (Exception e) {

 

    logger.severe(

        "Application navigation failed: "

        + e.getMessage()

    );

 

    throw e;

}


62. Logging with Page Classes

Page classes should generally log important user-facing actions rather than exposing unnecessary implementation details.

public void clickLogin() {

 

    logger.info("Clicking Login button");

 

    driver.findElement(loginButton).click();

 

    logger.info("Login button clicked");

}


63. Logging in Base Test Class

A Base Test class can centralize common logging configuration and browser lifecycle operations.

public class BaseTest {

 

    protected WebDriver driver;

 

    protected final Logger logger =

            Logger.getLogger(

                BaseTest.class.getName()

            );

 

    @BeforeMethod

    public void setup() {

 

        logger.info("Starting browser");

 

        driver = new ChromeDriver();

 

        logger.info("Browser started");

    }

 

    @AfterMethod

    public void tearDown() {

 

        logger.info("Closing browser");

 

        if (driver != null) {

            driver.quit();

        }

 

        logger.info("Browser closed");

    }

}


64. Logging Utility Class

A reusable logging utility can provide common logging methods.

public class LogUtility {

 

    private static final Logger logger =

            Logger.getLogger(

                LogUtility.class.getName()

            );

 

    public static void info(String message) {

        logger.info(message);

    }

 

    public static void warn(String message) {

        logger.warning(message);

    }

 

    public static void error(String message) {

        logger.severe(message);

    }

}

Example usage:

LogUtility.info("Opening application");

LogUtility.warn("Optional element not available");

LogUtility.error("Login operation failed");


65. Logging Failed Test Data

When a data-driven test fails, the framework should make it possible to identify the data set without exposing sensitive information.

logger.info(

    "Executing login test for user: "

    + username

);

For passwords and tokens, log only safe identifiers or masked values when necessary.


66. Masking Sensitive Data

Sensitive information should not normally appear in plain text in logs.

String maskedPassword = "********";

 

logger.info(

    "Attempting login for user: "

    + username

);

 

logger.debug(

    "Password supplied: "

    + maskedPassword

);

Never use logs as a place to store secrets.


67. Logging Common Selenium Exceptions

Common Selenium failures can be accompanied by meaningful log messages.

ExceptionUseful Log Context
NoSuchElementExceptionElement locator and test step
TimeoutExceptionWait condition and target element
ElementClickInterceptedExceptionElement and click operation
StaleElementReferenceExceptionElement interaction and page state
WebDriverExceptionBrowser or driver operation


68. Logging a TimeoutException

try {

 

    logger.info("Waiting for dashboard");

 

    wait.until(

        ExpectedConditions.visibilityOfElementLocated(

            By.id("dashboard")

        )

    );

 

} catch (TimeoutException e) {

 

    logger.severe(

        "Dashboard did not appear within timeout"

    );

 

    throw e;

}


69. Logging an Element Not Found Error

try {

 

    logger.info("Locating username field");

 

    driver.findElement(

        By.id("username")

    ).sendKeys(username);

 

} catch (NoSuchElementException e) {

 

    logger.severe(

        "Username field was not found"

    );

 

    throw e;

}


70. Common Mistakes in Logging

  • Logging too much unnecessary information.
  • Logging too little information to diagnose failures.
  • Logging passwords or authentication tokens.
  • Using unclear messages such as "Something happened".
  • Not recording the test name.
  • Not identifying the browser during cross-browser testing.
  • Not recording important business steps.
  • Using ERROR for normal informational messages.
  • Writing logs without timestamps or useful context.
  • Creating one large uncontrolled log file.
  • Sharing unsafe logging state between parallel executions.
  • Ignoring log cleanup and retention requirements.


71. Good Logging Message vs Bad Logging Message

Bad MessageBetter Message
StartedLogin test started
ClickClicking Login button
ErrorUnable to locate Login button
DoneDashboard validation completed successfully
FailedLogin test failed while submitting credentials


72. Best Practices for Logging

  • Use meaningful log messages.
  • Use appropriate logging levels.
  • Log important business and test steps.
  • Include test and browser context when useful.
  • Capture exceptions with meaningful context.
  • Do not log passwords or secrets.
  • Use file logging for long-running automation where appropriate.
  • Use centralized logging configuration in large frameworks.
  • Use listeners for common TestNG execution events.
  • Combine logs with screenshots and reports for failure analysis.
  • Use thread information for parallel execution when required.
  • Keep log messages consistent across the framework.
  • Avoid excessive logging that makes troubleshooting harder.
  • Archive or rotate logs according to project requirements.


73. Logging Architecture in Selenium Framework

                Selenium Test Framework

                         |

          +--------------+--------------+

          |              |              |

          v              v              v

       TestNG          Page Object    Utilities

          |              |              |

          +--------------+--------------+

                         |

                         v

                      Logger

                         |

             +-----------+-----------+

             |                       |

             v                       v

          Console                  File

             |                       |

             +-----------+-----------+

                         |

                         v

                    Test Analysis

                         |

              +----------+----------+

              |                     |

              v                     v

           Reports              Debugging


74. Practical Selenium Logging Example

import java.util.logging.Logger;

 

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

 

import org.testng.Assert;

import org.testng.annotations.AfterMethod;

import org.testng.annotations.BeforeMethod;

import org.testng.annotations.Test;

 

public class LoginTest {

 

    private WebDriver driver;

 

    private static final Logger logger =

            Logger.getLogger(LoginTest.class.getName());

 

    @BeforeMethod

    public void setup() {

 

        logger.info("Starting browser");

 

        driver = new ChromeDriver();

 

        driver.manage().window().maximize();

 

        logger.info("Browser launched successfully");

 

        logger.info("Opening login page");

 

        driver.get("https://example.com/login");

 

        logger.info("Login page opened");

    }

 

    @Test

    public void loginTest() {

 

        logger.info("Login test started");

 

        logger.info("Entering username");

 

        driver.findElement(

            By.id("username")

        ).sendKeys("admin");

 

        logger.info("Entering password");

 

        driver.findElement(

            By.id("password")

        ).sendKeys("admin123");

 

        logger.info("Clicking login button");

 

        driver.findElement(

            By.id("loginButton")

        ).click();

 

        logger.info("Validating dashboard");

 

        Assert.assertTrue(

            driver.getTitle().contains("Dashboard")

        );

 

        logger.info("Dashboard validation passed");

 

        logger.info("Login test completed successfully");

    }

 

    @AfterMethod

    public void tearDown() {

 

        logger.info("Closing browser");

 

        if (driver != null) {

            driver.quit();

        }

 

        logger.info("Browser closed");

    }

}


75. Practical Logging with Failure Handling

@Test

public void loginTest() {

 

    logger.info("Login test started");

 

    try {

 

        logger.info("Opening login page");

 

        driver.get(

            "https://example.com/login"

        );

 

        logger.info("Entering username");

 

        driver.findElement(

            By.id("username")

        ).sendKeys("admin");

 

        logger.info("Entering password");

 

        driver.findElement(

            By.id("password")

        ).sendKeys("admin123");

 

        logger.info("Clicking Login");

 

        driver.findElement(

            By.id("loginButton")

        ).click();

 

        logger.info("Validating dashboard");

 

        Assert.assertTrue(

            driver.getTitle().contains("Dashboard")

        );

 

        logger.info("Login test passed");

 

    } catch (Exception e) {

 

        logger.severe(

            "Login test failed: "

            + e.getMessage()

        );

 

        throw e;

    }

}


76. Real-World Logging Flow

Test Suite Starts

      |

      v

Log Suite Information

      |

      v

Create Browser

      |

      v

Log Browser Information

      |

      v

Open Application

      |

      v

Log Navigation

      |

      v

Execute Page Actions

      |

      v

Log Important Steps

      |

      v

Perform Assertions

      |

      +-------------------+

      |                   |

      v                   v

   Success              Failure

      |                   |

      v                   v

 Log Success          Log Error

      |                   |

      |              Capture Screenshot

      |                   |

      +---------+---------+

                |

                v

           Test Report

                |

                v

            Log Archive


77. Logging and Test Reports

A mature Selenium automation framework generally uses logging and reporting together.

ComponentPurpose
TestNGControls test execution
LoggerRecords execution information
Screenshot UtilityCaptures visual evidence
ReportSummarizes test results
Page ObjectHandles page interactions
Driver FactoryCreates WebDriver instances
CI/CDAutomates test execution


78. Logging and Debugging Strategy

When a Selenium test fails, a useful debugging sequence is:

  1. Identify the failed test from the report.
  2. Check the log entries around the failure.
  3. Identify the last successful step.
  4. Review the exception message.
  5. Check the current URL and page state.
  6. Review the screenshot if available.
  7. Check browser and environment information.
  8. Reproduce the problem if necessary.
  9. Fix the automation or application issue.
  10. Run the test again and verify the result.


79. Logging Checklist

  • Is every important test flow logged?
  • Are test names identifiable?
  • Are browser and environment details available?
  • Are failures logged with useful context?
  • Are screenshots connected to failure logs?
  • Are sensitive values protected?
  • Are logging levels used correctly?
  • Are logs readable?
  • Can logs be accessed from CI/CD execution?
  • Are parallel executions distinguishable?


80. Interview Questions on Logging

1. What is logging in Selenium automation?

Logging is the process of recording important information about test execution, browser actions, application navigation, validations, warnings, and failures.

2. Why is logging important in automation?

Logging helps understand test execution, troubleshoot failures, identify failed steps, and analyze automation behavior.

3. What are common logging levels?

Common levels include TRACE, DEBUG, INFO, WARN, ERROR, and FATAL, depending on the logging framework.

4. What is INFO logging?

INFO is generally used for normal and meaningful execution events.

5. What is DEBUG logging?

DEBUG provides detailed information that is useful during troubleshooting.

6. What is ERROR logging?

ERROR is used when an operation fails or an error occurs.

7. Can Selenium logs be stored in a file?

Yes. Java logging APIs and logging frameworks can write log messages to files.

8. What is Log4j2?

Log4j2 is a Java logging framework that provides configurable logging capabilities for applications and automation frameworks.

9. What is SLF4J?

SLF4J is a logging abstraction that provides a common API for application code while allowing a logging implementation to be configured underneath it.

10. Can logging be integrated with TestNG?

Yes. Logging can be used directly in TestNG test methods and configuration methods, and TestNG listeners can be used for centralized execution-event logging.

11. What is a TestNG listener?

A TestNG listener is an interface-based mechanism that allows a framework to react to test execution events such as start, success, failure, and skip.

12. Should passwords be written to log files?

No. Sensitive credentials should be protected and should not normally be recorded in plain text logs.

13. How can logging help with parallel execution?

Logs can include test names, browser names, and thread information so that concurrent test executions can be distinguished.

14. What is the difference between logging and reporting?

Logging records execution details and diagnostic information, while reporting presents test results and execution summaries.

15. Can logging be used with Page Object Model?

Yes. Page classes can log important page actions while test classes handle test scenarios and assertions.

16. Can logs be used in Jenkins?

Yes. Logs are particularly useful for diagnosing automated tests executed on CI/CD servers.

17. What should be logged when a Selenium test fails?

Useful information can include the test name, current action, browser, environment, exception message, current URL, and screenshot location.

18. Why should logging messages be meaningful?

Meaningful messages make it easier to understand exactly what happened during test execution.

19. What is excessive logging?

Excessive logging occurs when unnecessary details are recorded so frequently that the useful information becomes difficult to find.

20. What is a good logging practice?

Use appropriate log levels, meaningful messages, useful execution context, secure handling of sensitive information, and centralized configuration where appropriate.


81. Quick Reference Table

ConceptDescription
LoggingRecording execution information
LoggerComponent used to create log messages
INFONormal execution information
DEBUGDetailed troubleshooting information
WARNPotential or unexpected condition
ERRORFailure or error information
Appender/HandlerControls where logs are written
Console LogDisplays logs during execution
File LogStores logs for later analysis
TestNG ListenerCaptures test execution events
Log4j2Java logging framework
SLF4JLogging abstraction for Java
ScreenshotVisual evidence often captured during failures


82. Learning Roadmap for Logging

  1. Understand the purpose of logging.
  2. Learn common logging levels.
  3. Learn Java logging basics.
  4. Create console logs.
  5. Create file logs.
  6. Use logging with Selenium WebDriver.
  7. Use logging with TestNG.
  8. Log browser and application actions.
  9. Log exceptions and failures.
  10. Integrate logging with Page Object Model.
  11. Learn Log4j2 or another project-approved logging framework.
  12. Understand SLF4J and logging implementations.
  13. Use TestNG listeners for centralized logging.
  14. Combine logs with screenshots and reports.
  15. Implement logging for parallel execution.
  16. Integrate logging with Maven and CI/CD.
  17. Protect sensitive information.
  18. Build a reusable logging utility.


83. Practical Exercises

  1. Create a Selenium test that logs browser startup and shutdown.
  2. Add INFO logs to a login test.
  3. Add DEBUG logs for important Selenium interactions.
  4. Add ERROR logging around exception handling.
  5. Write logs to a file.
  6. Create a TestNG listener that logs test start and completion.
  7. Log failed test names and exception messages.
  8. Capture screenshots when a test fails.
  9. Add browser and environment information to logs.
  10. Create a reusable Logger Utility class.
  11. Integrate logging with Page Object Model.
  12. Execute tests in parallel and include thread information in logs.
  13. Integrate logs with Maven execution.
  14. Execute the logging framework through Jenkins or another CI/CD system.


84. Real-World Selenium Logging Example

Consider an e-commerce login and checkout workflow. A useful logging sequence could be:

INFO  - Test started: CheckoutTest

INFO  - Browser: Chrome

INFO  - Environment: QA

INFO  - Opening application

INFO  - Login page displayed

INFO  - Entering username

INFO  - Submitting login form

INFO  - Dashboard displayed

INFO  - Searching for product

INFO  - Product selected

INFO  - Product added to cart

INFO  - Opening cart

INFO  - Starting checkout

INFO  - Shipping information submitted

INFO  - Payment page displayed

INFO  - Order submitted

INFO  - Validating confirmation

INFO  - Checkout test passed

INFO  - Closing browser

If the checkout fails, the log can instead provide information such as:

INFO  - Starting checkout

INFO  - Shipping information submitted

INFO  - Clicking payment button

ERROR - Payment button could not be clicked

ERROR - Test failed: CheckoutTest

INFO  - Capturing failure screenshot

INFO  - Browser cleanup started


85. Recommended Logging Architecture

                 TestNG Test

                      |

                      v

                 Base Test

                      |

          +-----------+-----------+

          |                       |

          v                       v

     Page Objects            Utilities

          |                       |

          +-----------+-----------+

                      |

                      v

                   Logger

                      |

             +--------+--------+

             |                 |

             v                 v

          Console            File

             |                 |

             +--------+--------+

                      |

                      v

                Test Analysis

                      |

          +-----------+-----------+

          |           |           |

          v           v           v

       Report     Screenshot    Exception

          |           |           |

          +-----------+-----------+

                      |

                      v

                   CI/CD


86. Summary

Logging is an essential part of a professional Selenium automation framework. It records important information about test execution and provides valuable context when tests pass, fail, or behave unexpectedly.

Logging can be implemented using Java's built-in logging API or dedicated logging frameworks such as Log4j2, commonly used through a consistent application logging strategy. Selenium and TestNG actions can be logged at meaningful points throughout the framework.

TestNG listeners can be used to centralize logging for test start, success, failure, and skip events. Logging can also be integrated with Page Object Model, Driver Factory, utilities, Data Providers, screenshots, reports, Maven, Jenkins, and CI/CD pipelines.

A good logging strategy should provide enough information to understand and troubleshoot test execution without creating unnecessary noise or exposing sensitive information.


87. Final Takeaway

Logging makes Selenium automation easier to understand, debug, maintain, and monitor. A strong logging implementation records meaningful test steps, browser and environment context, exceptions, failures, and execution status. When combined with TestNG reports, screenshots, Page Object Model, listeners, and CI/CD tools, logging becomes an important part of a scalable Selenium automation framework.


88. Course Resources

Learn more about Selenium automation and professional testing frameworks:

whatsapp