Bird
Raised Fist0
Selenium Javatesting~8 mins

CSS attribute and pseudo-class selectors in Selenium Java - Framework Patterns

Choose your learning style10 modes available
Framework Mode - CSS attribute and pseudo-class selectors
Folder Structure
src/
└── test/
    └── java/
        └── com/
            └── example/
                ├── pages/
                │   └── LoginPage.java
                ├── tests/
                │   └── LoginTest.java
                ├── utils/
                │   └── CssSelectorHelper.java
                └── config/
                    └── TestConfig.java
Test Framework Layers
  • Driver Layer: Manages WebDriver setup and teardown for browsers.
  • Page Objects: Classes representing web pages, using CSS attribute and pseudo-class selectors to locate elements.
  • Tests: Test classes that use page objects to perform actions and assertions.
  • Utilities: Helper classes for building complex CSS selectors and reusable methods.
  • Configuration: Holds environment settings, browser options, and credentials.
Configuration Patterns
  • Environment Properties: Use TestConfig.java to load environment variables (e.g., dev, staging, prod) from property files.
  • Browser Settings: Configure browser type and options (headless, window size) in TestConfig.java.
  • Credentials: Store securely in environment variables or encrypted files, accessed via config classes.
  • Selector Management: Use constants or helper methods in page objects or utilities to keep CSS selectors maintainable.
Test Reporting and CI/CD Integration
  • Use TestNG built-in reports for test execution results (pass/fail).
  • Integrate with Allure or ExtentReports for detailed HTML reports showing which CSS selectors were used.
  • Configure CI/CD pipelines (e.g., Jenkins, GitHub Actions) to run tests on code push and publish reports.
  • Include screenshots on failure to help debug selector issues.
Best Practices
  1. Use Specific CSS Attribute Selectors: Target elements precisely, e.g., input[type='email'] to avoid flaky tests.
  2. Leverage Pseudo-classes: Use selectors like :nth-child() or :not() to handle dynamic elements.
  3. Keep Selectors Maintainable: Define selectors as constants or methods in page objects for easy updates.
  4. Prefer Explicit Waits: Wait for elements located by CSS selectors to be visible or clickable before interacting.
  5. Validate Selectors Regularly: Use browser DevTools to test CSS selectors before adding to code.
Self Check

Where in this folder structure would you add a new CSS selector for a button that uses a pseudo-class :hover effect on the Login page?

Key Result
Organize Selenium Java tests using page objects with CSS attribute and pseudo-class selectors for precise element targeting.

Practice

(1/5)
1. Which CSS selector correctly selects all <input> elements with a type attribute equal to "text"?
easy
A. input[type^='text']
B. input[type*='text']
C. input[type$='text']
D. input[type='text']

Solution

  1. Step 1: Understand attribute selectors

    The selector input[type='text'] matches input elements whose type attribute exactly equals text.
  2. Step 2: Differentiate other selectors

    ^= means starts with, $= means ends with, and *= means contains. These do not require exact match.
  3. Final Answer:

    input[type='text'] -> Option D
  4. Quick Check:

    Exact attribute match = input[type='text'] [OK]
Hint: Use '=' for exact attribute match in CSS selectors [OK]
Common Mistakes:
  • Confusing ^= (starts with) with = (exact match)
  • Using $= or *= when exact match is needed
  • Forgetting to quote attribute values
2. Which of the following is the correct CSS selector syntax to select all <a> elements with an href attribute containing the word "login"?
easy
A. a[href*='login']
B. a[href^='login']
C. a[href$='login']
D. a[href='login']

Solution

  1. Step 1: Understand the *= attribute selector

    The selector a[href*='login'] matches a elements whose href attribute contains the substring login anywhere.
  2. Step 2: Differentiate other selectors

    ^= matches start, $= matches end, and = matches exact. We want contains, so *= is correct.
  3. Final Answer:

    a[href*='login'] -> Option A
  4. Quick Check:

    Contains substring = *= [OK]
Hint: Use '*=' to select attributes containing a substring [OK]
Common Mistakes:
  • Using ^= or $= instead of *= for substring match
  • Forgetting quotes around attribute values
  • Using = which requires exact match
3. Given the following HTML snippet:
<ul>
  <li>Item 1</li>
  <li class="active">Item 2</li>
  <li>Item 3</li>
  <li class="active">Item 4</li>
</ul>

What will the CSS selector li.active:first-of-type select?
medium
A. All li elements with class active
B. The first li element with class active
C. No elements, because first-of-type ignores class
D. The first li element in the list regardless of class

Solution

  1. Step 1: Understand :first-of-type pseudo-class

    :first-of-type selects the first sibling of its type (here, the first li) regardless of class.
  2. Step 2: Combine with class selector

    The selector li.active:first-of-type looks for an li that is both .active and the first li. The first li has no class, so no match.
  3. Final Answer:

    No elements, because first-of-type ignores class -> Option C
  4. Quick Check:

    first-of-type ignores class, so no match [OK]
Hint: :first-of-type matches first element type ignoring classes [OK]
Common Mistakes:
  • Assuming :first-of-type matches first element with class
  • Confusing :first-child with :first-of-type
  • Ignoring that class must match too
4. You want to select all <button> elements that are disabled using a CSS selector in Selenium. Which selector is incorrect and will cause your test to fail?
medium
A. button:enable
B. button[disabled]
C. button[disabled='disabled']
D. button:disabled

Solution

  1. Step 1: Identify valid selectors for disabled buttons

    button:disabled and button[disabled] correctly select disabled buttons. button[disabled='disabled'] also works if attribute equals 'disabled'.
  2. Step 2: Spot invalid pseudo-class

    :enable is not a valid CSS pseudo-class. The correct one is :enabled.
  3. Final Answer:

    button:enable -> Option A
  4. Quick Check:

    Invalid pseudo-class = :enable [OK]
Hint: Use :disabled or [disabled], not :enable [OK]
Common Mistakes:
  • Using :enable instead of :enabled
  • Assuming [disabled='true'] works (it must match exact value)
  • Confusing attribute selector syntax
5. You have a list of <input> elements with various name attributes:
<input name="user_email">
<input name="user_password">
<input name="admin_email">
<input name="admin_password">

Which CSS selector will select only the input elements whose name attribute ends with "_email"?
hard
A. input[name*='_email']
B. input[name$='_email']
C. input[name^='_email']
D. input[name='_email']

Solution

  1. Step 1: Understand $= attribute selector

    The selector input[name$='_email'] matches input elements whose name attribute ends exactly with _email.
  2. Step 2: Differentiate other selectors

    *= matches contains anywhere, ^= matches starts with, and = matches exact. We want ends with, so $= is correct.
  3. Final Answer:

    input[name$='_email'] -> Option B
  4. Quick Check:

    Ends with substring = $= [OK]
Hint: Use $= to select attributes ending with a substring [OK]
Common Mistakes:
  • Using *= or ^= instead of $= for ends with
  • Forgetting quotes around attribute values
  • Using = which requires exact match
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