Bird
Raised Fist0
Selenium Pythontesting~5 mins

CSS attribute selectors in Selenium Python

Choose your learning style10 modes available
Introduction

CSS attribute selectors help find web elements by matching their attributes. This makes tests more flexible and reliable.

When you want to find an element with a specific attribute value, like a button with a certain name.
When elements don't have unique IDs but have unique attributes like data-test or aria-label.
When you want to select elements that contain a part of an attribute value.
When you want to test different states of elements by their attributes, like checked or disabled.
When you want to avoid brittle tests that break if element positions or classes change.
Syntax
Selenium Python
driver.find_element(By.CSS_SELECTOR, '[attribute="value"]')

Use square brackets [] to specify the attribute and its value.

You can match exact values or use special operators for partial matches.

Examples
Selects element with attribute type exactly equal to 'submit'.
Selenium Python
driver.find_element(By.CSS_SELECTOR, '[type="submit"]')
Selects element with attribute name starting with 'user'.
Selenium Python
driver.find_element(By.CSS_SELECTOR, '[name^="user"]')
Selects element with class attribute containing 'btn-primary' anywhere.
Selenium Python
driver.find_element(By.CSS_SELECTOR, '[class*="btn-primary"]')
Selects element with data-test attribute ending with '-button'.
Selenium Python
driver.find_element(By.CSS_SELECTOR, '[data-test$="-button"]')
Sample Program

This script opens a webpage with a custom checkbox. It uses CSS attribute selectors to find the label and checkbox input by their attributes. It prints the label text and checkbox state before and after clicking.

Selenium Python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_argument('--headless')
service = Service()
driver = webdriver.Chrome(service=service, options=options)

try:
    driver.get('https://www.w3schools.com/howto/howto_css_custom_checkbox.asp')
    
    # Find checkbox label using attribute selector for 'for' attribute
    checkbox_label = driver.find_element(By.CSS_SELECTOR, 'label[for="myCheck"]')
    print('Label text:', checkbox_label.text)
    
    # Find checkbox input using attribute selector for type
    checkbox_input = driver.find_element(By.CSS_SELECTOR, 'input[type="checkbox"]')
    print('Checkbox is selected:', checkbox_input.is_selected())

    # Click checkbox to change state
    checkbox_input.click()
    print('Checkbox is selected after click:', checkbox_input.is_selected())

finally:
    driver.quit()
OutputSuccess
Important Notes

Attribute selectors are case-sensitive in HTML.

Use quotes around attribute values in selectors for best practice.

Combine attribute selectors with other selectors for precise targeting.

Summary

CSS attribute selectors help find elements by their attributes.

They make tests more stable and easier to maintain.

Use them to match exact or partial attribute values.

Practice

(1/5)
1. What does the CSS selector input[type='text'] select in Selenium?
easy
A. All input elements regardless of type
B. All elements with any attribute containing 'text'
C. All elements with class 'text'
D. All input elements with type attribute exactly equal to 'text'

Solution

  1. Step 1: Understand the attribute selector syntax

    The selector input[type='text'] targets input tags with an attribute type exactly equal to 'text'.
  2. Step 2: Match the selector meaning to options

    All input elements with type attribute exactly equal to 'text' correctly describes this exact match. Other options describe different or incorrect matches.
  3. Final Answer:

    All input elements with type attribute exactly equal to 'text' -> Option D
  4. Quick Check:

    Exact attribute match = C [OK]
Hint: Exact match uses [attr='value'] syntax [OK]
Common Mistakes:
  • Confusing exact match with partial match
  • Selecting wrong tag type
  • Mixing class selectors with attribute selectors
2. Which of the following is the correct CSS selector to find elements with an attribute data-id that starts with 'user'?
easy
A. [data-id^='user']
B. [data-id*='user']
C. [data-id$='user']
D. [data-id='user']

Solution

  1. Step 1: Recall CSS attribute selectors for matching start of value

    The caret symbol ^= means 'starts with' in CSS attribute selectors.
  2. Step 2: Match the selector to the question

    [data-id^='user'] uses [data-id^='user'], which selects elements whose data-id attribute starts with 'user'.
  3. Final Answer:

    [data-id^='user'] -> Option A
  4. Quick Check:

    Starts with selector = B [OK]
Hint: Use ^= for 'starts with' attribute matching [OK]
Common Mistakes:
  • Using *= instead of ^= for starts with
  • Using $= which means ends with
  • Using exact match = instead of partial
3. What will the following Selenium Python code print if the page has three <input> elements with name attributes: 'user1', 'user2', and 'admin'?
elements = driver.find_elements(By.CSS_SELECTOR, "input[name*='user']")
print(len(elements))
medium
A. 2
B. 3
C. 1
D. 0

Solution

  1. Step 1: Understand the CSS selector input[name*='user']

    This selector finds input elements whose name attribute contains the substring 'user'.
  2. Step 2: Count matching elements

    Given names 'user1', 'user2', and 'admin', only 'user1' and 'user2' contain 'user'. So, 2 elements match.
  3. Final Answer:

    2 -> Option A
  4. Quick Check:

    Substring match count = 2 [OK]
Hint: Use *= to find attributes containing substring [OK]
Common Mistakes:
  • Counting all inputs instead of filtered ones
  • Confusing starts with (^) and contains (*) selectors
  • Assuming exact match instead of partial
4. You wrote this Selenium code but it throws an error:
element = driver.find_element(By.CSS_SELECTOR, "button[class^='submit']'")
What is the error and how to fix it?
medium
A. Wrong attribute selector; use *= instead of ^=
B. Extra single quote at the end; remove it to fix
C. Missing tag name before attribute selector
D. CSS selector cannot use ^ for attribute matching

Solution

  1. Step 1: Inspect the CSS selector string syntax

    The selector ends with an extra single quote after the closing double quote: "button[class^='submit']'". This causes a syntax error.
  2. Step 2: Correct the string by removing the extra quote

    Removing the extra single quote at the end fixes the syntax: "button[class^='submit']".
  3. Final Answer:

    Extra single quote at the end; remove it to fix -> Option B
  4. Quick Check:

    Check quotes balance = A [OK]
Hint: Check for balanced quotes in selectors [OK]
Common Mistakes:
  • Ignoring syntax errors caused by quotes
  • Changing correct attribute selectors unnecessarily
  • Assuming CSS does not support ^= selector
5. You want to select all <a> tags whose href attribute ends with '.pdf' or '.docx' using a single CSS selector in Selenium. Which selector is correct?
hard
A. a[href*='.pdf' or '.docx']
B. a[href$='.pdf' || href$='.docx']
C. a[href$='.pdf'], a[href$='.docx']
D. a[href$='.pdf'][href$='.docx']

Solution

  1. Step 1: Understand CSS selector for multiple attribute matches

    To select elements matching either condition, use a comma to separate selectors: a[href$='.pdf'], a[href$='.docx'].
  2. Step 2: Analyze other options for correctness

    a[href$='.pdf' || href$='.docx'] uses invalid syntax with || inside attribute selector. a[href$='.pdf'][href$='.docx'] requires both endings simultaneously, impossible. a[href*='.pdf' or '.docx'] uses invalid syntax with 'or'.
  3. Final Answer:

    a[href$='.pdf'], a[href$='.docx'] -> Option C
  4. Quick Check:

    Use comma to combine selectors = D [OK]
Hint: Combine selectors with comma for OR conditions [OK]
Common Mistakes:
  • Using logical operators inside attribute selectors
  • Trying to combine multiple attribute endings in one selector without comma
  • Assuming multiple attribute selectors mean OR instead of AND
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