Bird
Raised Fist0
Selenium Javatesting~15 mins

findElements for multiple matches in Selenium Java - Build an Automation Script

Choose your learning style10 modes available
Verify multiple product items are displayed on the search results page
Preconditions (1)
Step 1: Enter 'laptop' in the search input field with id 'search-box'
Step 2: Click the search button with id 'search-button'
Step 3: Wait for the search results page to load
Step 4: Locate all product items displayed with the class name 'product-item'
✅ Expected Result: At least 3 product items are displayed on the search results page
Automation Requirements - Selenium WebDriver with Java
Assertions Needed:
Verify the number of elements found with class 'product-item' is 3 or more
Best Practices:
Use explicit waits to wait for search results to load
Use By.className locator for multiple elements
Avoid hardcoded Thread.sleep
Use assertions from a testing framework like TestNG or JUnit
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.List;

public class SearchResultsTest {
    WebDriver driver;
    WebDriverWait wait;

    @BeforeClass
    public void setUp() {
        // Set path to chromedriver executable if needed
        driver = new ChromeDriver();
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        driver.manage().window().maximize();
    }

    @Test
    public void testMultipleProductItemsDisplayed() {
        driver.get("https://example-ecommerce.com");

        // Enter 'laptop' in search box
        WebElement searchBox = wait.until(ExpectedConditions.elementToBeClickable(By.id("search-box")));
        searchBox.sendKeys("laptop");

        // Click search button
        WebElement searchButton = driver.findElement(By.id("search-button"));
        searchButton.click();

        // Wait for product items to be visible
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("product-item")));

        // Find all product items
        List<WebElement> productItems = driver.findElements(By.className("product-item"));

        // Assert at least 3 product items are displayed
        Assert.assertTrue(productItems.size() >= 3, "Expected at least 3 product items, but found " + productItems.size());
    }

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

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

Setup: The @BeforeClass method initializes the ChromeDriver and WebDriverWait for explicit waits.

Test steps: The test navigates to the homepage, enters 'laptop' in the search box identified by id='search-box', clicks the search button id='search-button', then waits explicitly until at least one product item with class product-item is visible.

It then collects all elements with class product-item using findElements, which returns a list of matching elements.

Assertion: The test asserts that the list size is 3 or more, ensuring multiple products are displayed.

Teardown: The @AfterClass method closes the browser.

This approach uses explicit waits to avoid flaky tests and uses proper locators and assertions for reliability.

Common Mistakes - 4 Pitfalls
Using Thread.sleep() instead of explicit waits
Using findElement instead of findElements to get multiple elements
Using hardcoded XPath that is brittle
Not checking the number of elements found before asserting
Bonus Challenge

Now add data-driven testing with 3 different search keywords: 'laptop', 'smartphone', 'headphones'

Show Hint

Practice

(1/5)
1. What does the Selenium method findElements return when multiple elements match the locator?
easy
A. A single WebElement or null if none found
B. Only the first matching WebElement
C. A list of all matching WebElements
D. An error if more than one element matches

Solution

  1. Step 1: Understand the purpose of findElements

    The method findElements is designed to find all elements matching a locator, not just one.
  2. Step 2: Check the return type

    It returns a list (java.util.List) of WebElements, which can be empty if no matches are found.
  3. Final Answer:

    A list of all matching WebElements -> Option C
  4. Quick Check:

    findElements returns list = D [OK]
Hint: Remember: findElements always returns a list, even if empty [OK]
Common Mistakes:
  • Confusing findElements with findElement which returns single element
  • Expecting an error when multiple matches occur
  • Assuming null is returned if no matches
2. Which of the following is the correct syntax to find all buttons on a page using Selenium Java?
easy
A. List<WebElement> buttons = driver.findElements(By.tagName("button"));
B. WebElement buttons = driver.findElements(By.tagName("button"));
C. List<WebElement> buttons = driver.findElement(By.tagName("button"));
D. WebElement buttons = driver.findElement(By.tagName("button"));

Solution

  1. Step 1: Identify correct method and return type

    To get multiple elements, use findElements which returns a List<WebElement>.
  2. Step 2: Check syntax correctness

    List<WebElement> buttons = driver.findElements(By.tagName("button")); correctly uses List<WebElement> and findElements with By.tagName("button").
  3. Final Answer:

    List<WebElement> buttons = driver.findElements(By.tagName("button")); -> Option A
  4. Quick Check:

    Multiple elements need findElements + List [OK]
Hint: Use findElements with List<WebElement> for multiple matches [OK]
Common Mistakes:
  • Using findElement instead of findElements for multiple elements
  • Assigning findElements result to a single WebElement variable
  • Mixing findElement with List type
3. What will be the output of the following code snippet?
List<WebElement> items = driver.findElements(By.className("item"));
System.out.println(items.size());

Assuming the page has 4 elements with class "item".
medium
A. 1
B. 4
C. 0
D. Throws NoSuchElementException

Solution

  1. Step 1: Understand findElements behavior

    findElements returns a list of all matching elements. Here, 4 elements have class "item".
  2. Step 2: Check the size of the list

    Calling items.size() returns the number of elements found, which is 4.
  3. Final Answer:

    4 -> Option B
  4. Quick Check:

    items.size() = 4 [OK]
Hint: items.size() gives count of all matched elements [OK]
Common Mistakes:
  • Expecting findElements to throw exception if multiple matches
  • Confusing findElements with findElement which throws exception if none
  • Assuming size() returns 1 always
4. Identify the error in the following code snippet:
List<WebElement> links = driver.findElements(By.cssSelector("a.link"));
System.out.println(links.get(5).getText());

Assuming the page has only 3 matching elements.
medium
A. Syntax error in CSS selector
B. NoSuchElementException thrown by findElements
C. NullPointerException because links is null
D. IndexOutOfBoundsException at links.get(5)

Solution

  1. Step 1: Check findElements result size

    findElements returns a list with 3 elements because only 3 match the selector.
  2. Step 2: Accessing index 5 causes error

    Trying to get element at index 5 (6th element) causes IndexOutOfBoundsException because list size is 3.
  3. Final Answer:

    IndexOutOfBoundsException at links.get(5) -> Option D
  4. Quick Check:

    Accessing invalid index = IndexOutOfBoundsException [OK]
Hint: Check list size before accessing by index to avoid errors [OK]
Common Mistakes:
  • Expecting NoSuchElementException from findElements when no matches
  • Assuming list is null if no matches (it's empty, not null)
  • Ignoring list size before get(index)
5. You want to click all buttons with class "submit-btn" on a page. Which code snippet correctly does this using findElements?
hard
A. List<WebElement> buttons = driver.findElements(By.className("submit-btn")); for(WebElement btn : buttons) { btn.click(); }
B. WebElement button = driver.findElement(By.className("submit-btn")); button.click();
C. List<WebElement> buttons = driver.findElement(By.className("submit-btn")); for(WebElement btn : buttons) { btn.click(); }
D. driver.findElements(By.className("submit-btn")).click();

Solution

  1. Step 1: Use findElements to get all matching buttons

    List<WebElement> buttons = driver.findElements(By.className("submit-btn")); for(WebElement btn : buttons) { btn.click(); } correctly uses findElements to get a List of all buttons with class "submit-btn".
  2. Step 2: Iterate over list and click each button

    The for-each loop clicks each button in the list, which is the correct way to handle multiple elements.
  3. Final Answer:

    List<WebElement> buttons = driver.findElements(By.className("submit-btn")); for(WebElement btn : buttons) { btn.click(); } -> Option A
  4. Quick Check:

    findElements + loop to click all = B [OK]
Hint: Use findElements + loop to act on multiple elements [OK]
Common Mistakes:
  • Using findElement which returns only one element
  • Trying to call click() directly on list
  • Assigning findElements result to single WebElement
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