Bird
Raised Fist0
Selenium Javatesting~8 mins

findElements for multiple matches in Selenium Java - Framework Patterns

Choose your learning style10 modes available
Framework Mode - findElements for multiple matches
Folder Structure
src/
└── test/
    └── java/
        └── com/
            └── example/
                ├── pages/
                │   └── SearchResultsPage.java
                ├── tests/
                │   └── SearchTests.java
                ├── utils/
                │   └── WebDriverFactory.java
                └── config/
                    └── TestConfig.java
  
Test Framework Layers
  • Driver Layer: Manages WebDriver setup and teardown (e.g., WebDriverFactory.java).
  • Page Objects: Classes representing web pages, encapsulating element locators and actions. For example, SearchResultsPage.java uses findElements to get multiple matching elements.
  • Tests: Test classes that use page objects to perform test scenarios, e.g., SearchTests.java.
  • Utilities: Helper classes for common functions like waits, logging, or data handling.
  • Configuration: Holds environment settings, browser types, URLs, and credentials.
Configuration Patterns

Use a TestConfig.java class or property files to manage:

  • Environment URLs (dev, staging, production)
  • Browser types (Chrome, Firefox, Edge)
  • Timeouts and waits
  • Credentials for login if needed

Load these settings before tests run, so tests and page objects use the right environment and browser.

Test Reporting and CI/CD Integration
  • Use TestNG or JUnit reports to show pass/fail results clearly.
  • Integrate with CI tools like Jenkins or GitHub Actions to run tests automatically on code changes.
  • Generate HTML or XML reports for easy review.
  • Include screenshots on failure for debugging.
Best Practices
  • Use findElements to get all matching elements: It returns a list, even if empty, so avoid exceptions when no matches.
  • Encapsulate element lists in page objects: Keep locators and element retrieval in one place for easy maintenance.
  • Use explicit waits before calling findElements: Ensure elements are present to avoid flaky tests.
  • Check list size before accessing elements: Prevent IndexOutOfBoundsException by verifying the list is not empty.
  • Write clear assertions on list contents: For example, assert the number of elements or their text values.
Self Check

Where in this folder structure would you add a new page object class to handle a page that shows multiple search results?

Key Result
Use page objects to encapsulate multiple element matches with findElements, supported by explicit waits and clear assertions.

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