CSS pseudo-classes help you pick specific elements on a webpage based on their state or position. This makes testing easier and more precise.
CSS pseudo-classes for selection in Selenium Python
driver.find_element(By.CSS_SELECTOR, 'selector:pseudo-class')Use By.CSS_SELECTOR with Selenium to apply CSS pseudo-classes.
Pseudo-classes start with a colon : after the normal CSS selector.
<li> item inside a <ul> list.driver.find_element(By.CSS_SELECTOR, 'ul li:first-child')driver.find_element(By.CSS_SELECTOR, 'button:hover')driver.find_element(By.CSS_SELECTOR, 'input:focus')driver.find_elements(By.CSS_SELECTOR, 'tr:nth-child(even)')This script opens a small HTML page with a list. It uses the :first-child pseudo-class to find the first list item and prints its text.
from selenium import webdriver from selenium.webdriver.common.by import By # Setup WebDriver (make sure driver executable is in PATH) # Open a simple test page html = ''' <html> <body> <ul> <li>First item</li> <li>Second item</li> <li>Third item</li> </ul> </body> </html> ''' # Load the HTML content from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--headless') driver = webdriver.Chrome(options=options) driver.get('data:text/html;charset=utf-8,' + html) # Find the first list item using CSS pseudo-class first_item = driver.find_element(By.CSS_SELECTOR, 'ul li:first-child') print(first_item.text) driver.quit()
Not all pseudo-classes work in Selenium because some depend on user interaction (like :hover), which may need special actions.
Use find_elements to get multiple elements matching a pseudo-class like :nth-child.
Always test your CSS selectors in browser DevTools first to make sure they select the right elements.
CSS pseudo-classes let you select elements based on position or state.
Use them in Selenium with By.CSS_SELECTOR for precise element selection.
They help make your tests more focused and reliable.
Practice
Solution
Step 1: Understand the meaning of :first-child
The :first-child pseudo-class selects the very first child element of its parent.Step 2: Compare with other options
:last-child selects the last child, :nth-child(2) selects the second child, and :hover is for mouse hover state, not position.Final Answer:
:first-child -> Option BQuick Check:
First child selector = :first-child [OK]
- Confusing :first-child with :nth-child(1)
- Using :hover for position selection
- Mixing :last-child with :first-child
Solution
Step 1: Understand nth-child(even)
The selector li:nth-child(even) selects all list items at even positions: 2, 4, 6, etc.Step 2: Check other options
li:nth-child(2n+1) and li:nth-child(odd) select odd positions, li:nth-of-type(odd) selects odd elements but by type, which may differ.Final Answer:
li:nth-child(even) -> Option DQuick Check:
Even items = nth-child(even) [OK]
- Using odd instead of even
- Confusing nth-child with nth-of-type
- Wrong formula like 2n+1 for even
<ul> <li>Apple</li> <li>Banana</li> <li>Cherry</li> <li>Date</li> </ul>
What text will be selected by the CSS selector
ul li:nth-child(3) in Selenium?Solution
Step 1: Understand nth-child(3) selector
The selector ul li:nth-child(3) selects the third child li element inside the ul.Step 2: Identify the third li element
The third li element is <li>Cherry</li> as it is the third item in the list.Final Answer:
Cherry -> Option AQuick Check:
Third child text = Cherry [OK]
- Counting from zero instead of one
- Selecting nth-of-type instead of nth-child
- Confusing order of list items
driver.find_element(By.CSS_SELECTOR, 'div:nth-child(0)'). Why does it fail and how to fix it?Solution
Step 1: Check nth-child index rules
nth-child indexes start at 1, so 0 is invalid and causes a syntax error.Step 2: Correct the selector
Replace 'div:nth-child(0)' with 'div:nth-child(1)' to select the first child div correctly.Final Answer:
nth-child index starts at 1, so 0 is invalid; use 'div:nth-child(1)' instead -> Option AQuick Check:
nth-child index ≥ 1 [OK]
- Using zero as nth-child index
- Assuming nth-child works like array index
- Thinking Selenium lacks nth-child support
Solution
Step 1: Understand the difference between nth-child and nth-of-type
nth-child counts all types of children, nth-of-type counts only elements of the specified type (button).Step 2: Select buttons except the first one
Using 'form button:nth-of-type(n+2)' selects all button elements starting from the second button, ignoring other element types.Step 3: Why other options fail
:not(:first-child) excludes elements that are the first child of their parent, but if the first child is not a button, it won't exclude the first button. Similarly, :nth-child(n+2) counts all children, not just buttons, so it may skip buttons if other elements are present.Final Answer:
form button:nth-of-type(n+2) -> Option CQuick Check:
Use nth-of-type for type-specific position [OK]
- Using nth-child instead of nth-of-type
- Using :not(:first-child) which may exclude wrong elements
- Assuming first-child always matches first button
Ready to prove it?
Pass the test and this pattern moves unknown
