Bird
Raised Fist0
Selenium Pythontesting~15 mins

XPath with attributes in Selenium Python - Build an Automation Script

Choose your learning style10 modes available
Verify login button is clickable using XPath with attributes
Preconditions (1)
Step 1: Locate the login button using XPath with attribute id='loginBtn'
Step 2: Click the login button
Step 3: Verify that the URL changes to 'https://example.com/dashboard'
✅ Expected Result: The login button is found using XPath with attribute, clicked successfully, and the page navigates to the dashboard URL
Automation Requirements - Selenium with Python
Assertions Needed:
Assert the login button is present and clickable
Assert the current URL is 'https://example.com/dashboard' after clicking
Best Practices:
Use explicit waits to wait for the login button to be clickable
Use By.XPATH locator with attribute selector
Avoid hardcoded sleeps
Use try-except to handle element not found exceptions gracefully
Automated Solution
Selenium Python
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
from selenium.common.exceptions import TimeoutException

# Setup WebDriver (assuming chromedriver is in PATH)
driver = webdriver.Chrome()

try:
    # Open login page
    driver.get('https://example.com/login')

    # Wait up to 10 seconds for login button to be clickable using XPath with attribute id='loginBtn'
    wait = WebDriverWait(driver, 10)
    login_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@id='loginBtn']")))

    # Click the login button
    login_button.click()

    # Wait for URL to change to dashboard
    wait.until(EC.url_to_be('https://example.com/dashboard'))

    # Assert current URL is dashboard
    assert driver.current_url == 'https://example.com/dashboard', f"Expected URL to be dashboard but got {driver.current_url}"

    print('Test Passed: Login button clicked and dashboard loaded')

except TimeoutException:
    print('Test Failed: Element not found or page did not load in time')

finally:
    driver.quit()

This script uses Selenium WebDriver with Python to automate the manual test case.

First, it opens the login page URL.

Then it waits explicitly (up to 10 seconds) for the login button to be clickable. The button is located using an XPath expression that selects a button element with the attribute id='loginBtn'. This shows how to use XPath with attributes.

After the button is found and clickable, the script clicks it.

Next, it waits until the URL changes to the expected dashboard URL, confirming navigation succeeded.

Finally, it asserts the current URL matches the expected dashboard URL. If all steps succeed, it prints a success message; otherwise, it catches timeout exceptions and prints a failure message.

The script uses best practices like explicit waits, proper locators, and exception handling to make the test reliable and clear.

Common Mistakes - 3 Pitfalls
Using time.sleep() instead of explicit waits
Using XPath without attributes or using absolute XPath
Not handling exceptions when element is not found
Bonus Challenge

Now add data-driven testing with 3 different login button IDs to verify the button is clickable for each.

Show Hint

Practice

(1/5)
1. What does the XPath expression //input[@type='submit'] select on a web page?
easy
A. All <input> elements with attribute type equal to 'submit'
B. All elements with tag name 'submit'
C. All elements with attribute 'input' and value 'submit'
D. All <submit> elements inside <input> tags

Solution

  1. Step 1: Understand XPath syntax

    The expression //input selects all <input> elements anywhere in the document.
  2. Step 2: Apply attribute filter

    The part [@type='submit'] filters those <input> elements to only those whose 'type' attribute equals 'submit'.
  3. Final Answer:

    All <input> elements with attribute type equal to 'submit' -> Option A
  4. Quick Check:

    XPath //tag[@attr='value'] selects elements by attribute [OK]
Hint: Look for tagname and attribute=value inside square brackets [OK]
Common Mistakes:
  • Confusing tag name with attribute name
  • Ignoring the attribute filter
  • Assuming it selects elements by text content
2. Which of the following is the correct XPath syntax to select a button element with id 'loginBtn'?
easy
A. //button[@id='loginBtn']
B. //button[id='loginBtn']
C. //button(#id='loginBtn')
D. //button[id="loginBtn"]

Solution

  1. Step 1: Recall correct attribute syntax in XPath

    Attributes are selected using @attribute='value' inside square brackets.
  2. Step 2: Check each option

    //button[@id='loginBtn'] uses @id='loginBtn' which is correct. //button[id='loginBtn'] misses '@'. //button(#id='loginBtn') uses invalid syntax. //button[id="loginBtn"] also misses '@' before the attribute name.
  3. Final Answer:

    //button[@id='loginBtn'] -> Option A
  4. Quick Check:

    Use @ before attribute name in XPath filters [OK]
Hint: Always prefix attribute with @ in XPath filters [OK]
Common Mistakes:
  • Omitting @ before attribute name
  • Using parentheses instead of square brackets
  • Incorrect quoting of attribute values
3. Given the HTML snippet:
<input type='checkbox' name='subscribe' checked>
What will the XPath //input[@checked] select?
medium
A. No elements, because 'checked' has no value
B. All <input> elements with attribute 'checked' equal to 'true'
C. All <input> elements with attribute 'checked' equal to 'checked'
D. All <input> elements with attribute 'checked' present

Solution

  1. Step 1: Understand attribute presence in XPath

    The XPath [@checked] selects elements where the 'checked' attribute exists, regardless of its value.
  2. Step 2: Apply to given HTML

    The input element has 'checked' attribute present (even without value), so it matches.
  3. Final Answer:

    All <input> elements with attribute 'checked' present -> Option D
  4. Quick Check:

    XPath [@attr] checks attribute presence, not value [OK]
Hint: Use [@attr] to check attribute exists, value not needed [OK]
Common Mistakes:
  • Assuming attribute must have a value
  • Confusing attribute presence with attribute value
  • Thinking empty attributes are ignored
4. You wrote this XPath to find a link: //a[@href='https://example.com'] but it fails to find the element. What is the likely error?
medium
A. The tag name 'a' is wrong, should be 'link'
B. XPath syntax is invalid because of missing @
C. The href attribute value is incorrect or incomplete
D. XPath cannot use attribute filters

Solution

  1. Step 1: Verify XPath syntax correctness

    The XPath //a[@href='https://example.com'] is syntactically correct with proper attribute filter.
  2. Step 2: Consider attribute value correctness

    If the element is not found, likely the href attribute value in the page differs (e.g., missing trailing slash, different protocol, or relative URL).
  3. Final Answer:

    The href attribute value is incorrect or incomplete -> Option C
  4. Quick Check:

    Check exact attribute values when XPath finds no elements [OK]
Hint: Verify exact attribute values match in XPath and page [OK]
Common Mistakes:
  • Assuming XPath syntax error without checking value
  • Using wrong tag name for links
  • Believing XPath cannot filter by attributes
5. You want to select all <input> elements that have a name attribute starting with 'user' and a type attribute exactly equal to 'text'. Which XPath expression is correct?
hard
A. //input[@name^='user' and @type='text']
B. //input[starts-with(@name, 'user') and @type='text']
C. //input[@name*='user' and @type='text']
D. //input[contains(@name, 'user') and @type='text']

Solution

  1. Step 1: Identify XPath function for 'starts with'

    XPath uses starts-with(@attr, 'value') to check if attribute starts with a string.
  2. Step 2: Combine conditions with 'and'

    Both conditions must be true: name starts with 'user' and type equals 'text'. //input[starts-with(@name, 'user') and @type='text'] correctly uses and to combine.
  3. Step 3: Evaluate other options

    //input[@name^='user' and @type='text'] uses invalid syntax @name^='user'. //input[@name*='user' and @type='text'] uses *= which is not valid XPath. //input[contains(@name, 'user') and @type='text'] uses contains() which matches anywhere, not just start.
  4. Final Answer:

    //input[starts-with(@name, 'user') and @type='text'] -> Option B
  5. Quick Check:

    Use starts-with() for prefix match in XPath [OK]
Hint: Use starts-with() for attribute prefix matching in XPath [OK]
Common Mistakes:
  • Using CSS-like ^= or *= operators in XPath
  • Confusing contains() with starts-with()
  • Not combining multiple conditions properly
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