Logging test steps in Selenium Java - Build an Automation Script
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.
Now add data-driven testing with 3 different sets of login credentials (valid and invalid).
Practice
Solution
Step 1: Understand logging purpose
Logging records actions during test execution to track progress.Step 2: Identify correct purpose
Logging helps see what the test does, not speed or hide errors.Final Answer:
To show what the test is doing step-by-step -> Option BQuick Check:
Logging = Show test steps [OK]
- Thinking logging speeds up tests
- Believing logging changes test results
- Assuming logging hides errors
Solution
Step 1: Recall Logger creation syntax
In Java, Logger is created using getLogger with a name string.Step 2: Check options for correct syntax
Only Logger logger = Logger.getLogger("TestLogger"); uses Logger.getLogger with a string, which is correct.Final Answer:
Logger logger = Logger.getLogger("TestLogger"); -> Option CQuick Check:
Logger creation = getLogger("name") [OK]
- Trying to instantiate Logger with new
- Using wrong method names like createLogger
- Calling Logger as a function
Logger logger = Logger.getLogger("TestLogger");
logger.info("Starting test");
logger.warning("Element not found");Solution
Step 1: Understand logger methods
logger.info prints info level messages; logger.warning prints warning level messages.Step 2: Predict console output format
Output includes level labels INFO and WARNING before messages.Final Answer:
INFO: Starting test\nWARNING: Element not found -> Option DQuick Check:
Logger output = Level + message [OK]
- Expecting messages without level labels
- Thinking logger prints nothing by default
- Confusing info and warning outputs
Logger logger = Logger.getLogger("TestLogger")
logger.info("Test started");Solution
Step 1: Check Java syntax
Java statements must end with a semicolon (;).Step 2: Find missing semicolon
The first line lacks a semicolon after getLogger call.Final Answer:
Missing semicolon after getLogger statement -> Option AQuick Check:
Java lines end with ; [OK]
- Ignoring missing semicolon errors
- Confusing logger.info with logger.log
- Thinking Logger name must be a class
Solution
Step 1: Understand efficient logging practice
One Logger instance reused for all steps is efficient and clear.Step 2: Evaluate other options
Creating many Logger instances wastes resources; System.out.println lacks levels; logging only after test misses step details.Final Answer:
Create one Logger instance and call logger.info() before each test action -> Option AQuick Check:
Reuse one Logger, log each step [OK]
- Creating multiple Logger instances unnecessarily
- Using print statements instead of Logger
- Logging only at test end
Ready to prove it?
Pass the test and this pattern moves unknown
