findElements for multiple matches 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.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.
Now add data-driven testing with 3 different search keywords: 'laptop', 'smartphone', 'headphones'
Practice
findElements return when multiple elements match the locator?Solution
Step 1: Understand the purpose of findElements
The methodfindElementsis designed to find all elements matching a locator, not just one.Step 2: Check the return type
It returns a list (java.util.List) of WebElements, which can be empty if no matches are found.Final Answer:
A list of all matching WebElements -> Option CQuick Check:
findElements returns list = D [OK]
- Confusing findElements with findElement which returns single element
- Expecting an error when multiple matches occur
- Assuming null is returned if no matches
Solution
Step 1: Identify correct method and return type
To get multiple elements, usefindElementswhich returns a List<WebElement>.Step 2: Check syntax correctness
List<WebElement> buttons = driver.findElements(By.tagName("button")); correctly uses List<WebElement> and findElements with By.tagName("button").Final Answer:
List<WebElement> buttons = driver.findElements(By.tagName("button")); -> Option AQuick Check:
Multiple elements need findElements + List [OK]
- Using findElement instead of findElements for multiple elements
- Assigning findElements result to a single WebElement variable
- Mixing findElement with List type
List<WebElement> items = driver.findElements(By.className("item"));
System.out.println(items.size());Assuming the page has 4 elements with class "item".
Solution
Step 1: Understand findElements behavior
findElements returns a list of all matching elements. Here, 4 elements have class "item".Step 2: Check the size of the list
Callingitems.size()returns the number of elements found, which is 4.Final Answer:
4 -> Option BQuick Check:
items.size() = 4 [OK]
- Expecting findElements to throw exception if multiple matches
- Confusing findElements with findElement which throws exception if none
- Assuming size() returns 1 always
List<WebElement> links = driver.findElements(By.cssSelector("a.link"));
System.out.println(links.get(5).getText());Assuming the page has only 3 matching elements.
Solution
Step 1: Check findElements result size
findElements returns a list with 3 elements because only 3 match the selector.Step 2: Accessing index 5 causes error
Trying to get element at index 5 (6th element) causes IndexOutOfBoundsException because list size is 3.Final Answer:
IndexOutOfBoundsException at links.get(5) -> Option DQuick Check:
Accessing invalid index = IndexOutOfBoundsException [OK]
- 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)
findElements?Solution
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".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.Final Answer:
List<WebElement> buttons = driver.findElements(By.className("submit-btn")); for(WebElement btn : buttons) { btn.click(); } -> Option AQuick Check:
findElements + loop to click all = B [OK]
- Using findElement which returns only one element
- Trying to call click() directly on list
- Assigning findElements result to single WebElement
Ready to prove it?
Pass the test and this pattern moves unknown
