Finding multiple elements in Selenium Python - Build an Automation Script
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class ProductsPage: def __init__(self, driver): self.driver = driver self.product_items_locator = (By.CLASS_NAME, 'product-item') def wait_for_products(self): WebDriverWait(self.driver, 10).until( EC.presence_of_all_elements_located(self.product_items_locator) ) def get_product_items(self): return self.driver.find_elements(*self.product_items_locator) def test_multiple_product_items_displayed(): driver = webdriver.Chrome() try: driver.get('https://example.com/products') products_page = ProductsPage(driver) products_page.wait_for_products() items = products_page.get_product_items() assert len(items) >= 3, f'Expected at least 3 product items, found {len(items)}' for item in items: assert item.is_displayed(), 'Product item is not visible' finally: driver.quit()
The ProductsPage class uses the Page Object Model to keep locators and actions organized.
We use WebDriverWait with presence_of_all_elements_located to wait until product items appear on the page, avoiding fixed delays.
The test opens the products page URL, waits for product items, then finds all elements with the class product-item.
We assert that there are at least 3 such elements, matching the manual test case expectation.
We also check each product item is visible using is_displayed().
Finally, the browser is closed in a finally block to ensure cleanup.
Now add data-driven testing with 3 different product pages URLs to verify multiple product items on each page.
Practice
find_elements method in Selenium Python return when used to locate multiple elements?Solution
Step 1: Understand the purpose of
This method is designed to find all elements matching a locator, not just one.find_elementsStep 2: Identify the return type
It returns a list of WebElement objects, even if the list is empty when no elements match.Final Answer:
A list of WebElement objects matching the locator -> Option AQuick Check:
find_elementsreturns list [OK]
- Confusing find_element (single) with find_elements (multiple)
- Expecting a single WebElement instead of a list
- Thinking it returns a count or boolean
Solution
Step 1: Use the correct method for multiple elements
To find all buttons, usefind_elements, notfind_element.Step 2: Use the correct locator syntax
The method requires two arguments: locator strategy and locator value, e.g.,By.TAG_NAMEand 'button'.Final Answer:
driver.find_elements(By.TAG_NAME, 'button') -> Option AQuick Check:
Correct method and locator = B [OK]
- Using find_element instead of find_elements
- Passing only one argument instead of two
- Using string locator without By class
<li> elements?items = driver.find_elements(By.TAG_NAME, 'li')
print(len(items))
Solution
Step 1: Understand what find_elements returns
It returns a list of all matching elements. Here, it finds all<li>tags.Step 2: Use len() to count elements
Since there are 3<li>elements,len(items)returns 3.Final Answer:
3 -> Option DQuick Check:
Count of found elements = 3 [OK]
- Expecting find_elements to return a single element
- Confusing find_element with find_elements
- Assuming print outputs elements instead of count
elements = driver.find_elements(By.CLASS_NAME)
for el in elements:
print(el.text)
Solution
Step 1: Check find_elements method arguments
find_elements requires two arguments: locator strategy and locator value. Here only one is given.Step 2: Understand the error cause
Missing the second argument (the class name string) causes a TypeError.Final Answer:
Missing locator value argument in find_elements -> Option CQuick Check:
Two arguments needed for find_elements [OK]
- Passing only locator type without value
- Confusing find_element and find_elements usage
- Assuming loop syntax is wrong
<div> with id 'menu'. Which code correctly finds and clicks all these links?Solution
Step 1: Use correct locator for links inside #menu
The CSS selector '#menu a' selects all<a>tags inside the element with id 'menu'.Step 2: Use find_elements to get all matching links
find_elements returns a list of all matching elements, allowing iteration.Step 3: Loop through each link and click
Iterate over the list and callclick()on each WebElement.Final Answer:
links = driver.find_elements(By.CSS_SELECTOR, '#menu a') for link in links: link.click() -> Option BQuick Check:
Correct locator and method = A [OK]
- Using find_element instead of find_elements
- Wrong locator syntax for nested elements
- Using By.ID with compound selector string
Ready to prove it?
Pass the test and this pattern moves unknown
