Bird
Raised Fist0
Selenium Javatesting~15 mins

findElement by className in Selenium Java - Build an Automation Script

Choose your learning style10 modes available
Verify login button is clickable using className locator
Preconditions (2)
Step 1: Locate the login button using its class name 'btn-login'
Step 2: Click the login button
Step 3: Verify that the URL changes to 'https://example.com/dashboard'
✅ Expected Result: After clicking the login button located by class name, the user is redirected to the dashboard page with URL 'https://example.com/dashboard'
Automation Requirements - Selenium WebDriver with Java
Assertions Needed:
Verify the login button is found using By.className
Verify the login button is clickable
Verify the URL after clicking is 'https://example.com/dashboard'
Best Practices:
Use explicit waits to wait for the login button to be clickable
Use By.className locator only for single class names, not multiple classes
Use assertions from a testing framework like TestNG or JUnit
Close the browser after test execution
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;

public class LoginButtonTest {
    private WebDriver driver;
    private WebDriverWait wait;

    @BeforeClass
    public void setUp() {
        // Set path to chromedriver if needed
        driver = new ChromeDriver();
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        driver.get("https://example.com/login");
    }

    @Test
    public void testLoginButtonClickableByClassName() {
        // Wait until the login button is clickable
        WebElement loginButton = wait.until(
            ExpectedConditions.elementToBeClickable(By.className("btn-login"))
        );

        // Assert the button is displayed
        Assert.assertTrue(loginButton.isDisplayed(), "Login button should be visible");

        // Click the login button
        loginButton.click();

        // Wait until URL changes to dashboard
        wait.until(ExpectedConditions.urlToBe("https://example.com/dashboard"));

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

    @AfterClass
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}

This test class uses Selenium WebDriver with Java and TestNG for assertions.

setUp() opens the browser and navigates to the login page.

The test testLoginButtonClickableByClassName waits explicitly for the login button located by By.className("btn-login") to be clickable. This avoids timing issues.

It asserts the button is visible, then clicks it.

After clicking, it waits for the URL to change to the dashboard URL and asserts the URL is exactly as expected.

tearDown() closes the browser to clean up.

This structure follows best practices: explicit waits, proper locator usage, and clean test lifecycle.

Common Mistakes - 3 Pitfalls
{'mistake': 'Using By.className with multiple class names separated by spaces', 'why_bad': 'By.className only accepts a single class name, not multiple classes separated by spaces. This causes NoSuchElementException.', 'correct_approach': 'Use a single class name with By.className or use By.cssSelector with multiple classes, e.g. By.cssSelector(".class1.class2")'}
Not using explicit waits before interacting with elements
Hardcoding URLs without waiting for page load or URL change
Bonus Challenge

Now add data-driven testing with 3 different class names for buttons to verify each is clickable and leads to correct URLs

Show Hint

Practice

(1/5)
1. What does the Selenium method findElement(By.className("btn-primary")) do in a test script?
easy
A. It finds an element by its HTML tag name "btn-primary".
B. It finds all web elements with the CSS class "btn-primary" on the page.
C. It finds the first web element with the CSS class "btn-primary" on the page.
D. It finds an element by its ID "btn-primary".

Solution

  1. Step 1: Understand the method purpose

    The method findElement locates a single element on the page.
  2. Step 2: Analyze the locator type

    Using By.className("btn-primary") targets elements with the CSS class "btn-primary".
  3. Final Answer:

    It finds the first web element with the CSS class "btn-primary" on the page. -> Option C
  4. Quick Check:

    findElement + className = first matching element [OK]
Hint: findElement with className returns first matching element [OK]
Common Mistakes:
  • Confusing findElement with findElements (plural)
  • Using className to find by ID or tag
  • Expecting multiple elements returned
2. Which of the following is the correct syntax to find an element by class name "login-button" in Selenium Java?
easy
A. driver.findElement(By.classname("login-button"));
B. driver.findElement(By.className("login-button"));
C. driver.findElement(By.class_name("login-button"));
D. driver.findElement(By.class("login-button"));

Solution

  1. Step 1: Recall correct method usage

    The correct method to locate by class name is By.className() with capital N.
  2. Step 2: Check syntax correctness

    driver.findElement(By.className("login-button")); uses the exact correct syntax: By.className("login-button").
  3. Final Answer:

    driver.findElement(By.className("login-button")); -> Option B
  4. Quick Check:

    Correct method name is className with capital N [OK]
Hint: Use By.className with capital N for correct syntax [OK]
Common Mistakes:
  • Using By.class instead of By.className
  • Wrong method casing like class_name or classname
  • Missing quotes around class name
3. Given the HTML snippet:
<button class="submit-btn primary">Submit</button>

What will the following code return?
WebElement btn = driver.findElement(By.className("primary"));
System.out.println(btn.getText());
medium
A. Submit
B. primary
C. submit-btn
D. NoSuchElementException

Solution

  1. Step 1: Locate element by class name "primary"

    The button has class "primary" among others, so it matches.
  2. Step 2: Get the text of the found element

    The getText() method returns the visible text inside the button, which is "Submit".
  3. Final Answer:

    Submit -> Option A
  4. Quick Check:

    findElement by className finds element, getText returns inner text [OK]
Hint: getText() returns visible text inside found element [OK]
Common Mistakes:
  • Expecting class name as text output
  • Confusing class attribute with element text
  • Assuming exception if multiple classes present
4. What is wrong with this Selenium Java code snippet?
WebElement element = driver.findElement(By.className("btn primary"));

It tries to find an element with classes "btn" and "primary".
medium
A. The syntax is correct; it finds elements with both classes.
B. It should use findElements instead of findElement.
C. It should use By.id instead of By.className.
D. className locator cannot contain spaces; it matches only one class.

Solution

  1. Step 1: Understand className locator rules

    The By.className locator accepts only a single class name without spaces.
  2. Step 2: Identify the error in locator usage

    Using "btn primary" with space is invalid and causes an error; it cannot find elements with multiple classes this way.
  3. Final Answer:

    className locator cannot contain spaces; it matches only one class. -> Option D
  4. Quick Check:

    className accepts single class only, no spaces [OK]
Hint: Use single class name without spaces in className locator [OK]
Common Mistakes:
  • Trying to find multiple classes with space-separated string
  • Expecting findElement to accept compound class selectors
  • Confusing className with CSS selector syntax
5. You want to click the first button with class "nav-item active" on a page. Which is the best way to do this using Selenium Java?
hard
A. driver.findElement(By.cssSelector(".nav-item.active")).click();
B. driver.findElement(By.className("nav-item active")).click();
C. driver.findElement(By.className("nav-item")).click();
D. driver.findElement(By.xpath("//button[@class='nav-item active']")).click();

Solution

  1. Step 1: Understand limitation of className locator

    The By.className locator cannot handle multiple classes separated by spaces.
  2. Step 2: Use CSS selector for multiple classes

    The CSS selector .nav-item.active matches elements with both classes and works correctly.
  3. Step 3: Compare other options

    driver.findElement(By.className("nav-item active")).click(); is invalid due to space in className; driver.findElement(By.className("nav-item")).click(); matches only one class; driver.findElement(By.xpath("//button[@class='nav-item active']")).click(); uses XPath but is less concise.
  4. Final Answer:

    driver.findElement(By.cssSelector(".nav-item.active")).click(); -> Option A
  5. Quick Check:

    Use CSS selector for multiple classes, not className [OK]
Hint: Use CSS selector for multiple classes, not className [OK]
Common Mistakes:
  • Using className with multiple classes separated by space
  • Using only one class when both are needed
  • Ignoring CSS selectors as a better alternative
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