How can I filter elements that have the same class?
<html> <body> <p>Link1.</p> </body>
</html>
<html> <body> <p>Link2.</p> </body>
</html> 3 5 Answers
You can try to get the list of all elements with class = "content" by using find_elements_by_class_name:
a = driver.find_elements_by_class_name("content")Then you can click on the link that you are looking for.
5As per the HTML:
<html> <body> <p>Link1.</p> </body>
<html>
<html> <body> <p>Link2.</p> </body>
<html>Two(2) <p> elements are having the same class content.
So to filter the elements having the same class i.e. content and create a list you can use either of the following Locator Strategies:
Using
class_name:elements = driver.find_elements_by_class_name("content")Using
css_selector:elements = driver.find_elements_by_css_selector(".content")Using
xpath:elements = driver.find_elements_by_xpath("//*[@class='content']")
Ideally, to click on the element you need to induce WebDriverWait for the visibility_of_all_elements_located() and you can use either of the following Locator Strategies:
Using
CLASS_NAME:elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "content")))Using
CSS_SELECTOR:elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".content")))Using
XPATH:elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//*[@class='content']")))Note : You have to add the following imports :
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
References
You can find a couple of relevant discussions in:
- How to identify an element through classname even though there are multiple elements with the same classnames using Selenium and Python
- Unable to locate element using className in Selenium and Java
- What are properties of find_element_by_class_name in selenium python?
- How to locate the last web element using classname attribute through Selenium and Python
By.CLASS_NAME was not yet mentioned:
from selenium.webdriver.common.by import By
driver.find_element(By.CLASS_NAME, "content")This is the list of attributes which can be used as locators in By:
CLASS_NAME
CSS_SELECTOR
ID
LINK_TEXT
NAME
PARTIAL_LINK_TEXT
TAG_NAME
XPATH
Use nth-child, for example:
driver.find_element(By.CSS_SELECTOR, 'p.content:nth-child(1)')or
driver.find_element(By.CSS_SELECTOR, 'p.content:first-child') The most simple way is to use find_element_by_class_name('class_name')