XPath with attributes in Selenium Python - Build an Automation Script
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.
Now add data-driven testing with 3 different login button IDs to verify the button is clickable for each.
Practice
//input[@type='submit'] select on a web page?Solution
Step 1: Understand XPath syntax
The expression//inputselects all <input> elements anywhere in the document.Step 2: Apply attribute filter
The part[@type='submit']filters those <input> elements to only those whose 'type' attribute equals 'submit'.Final Answer:
All <input> elements with attribute type equal to 'submit' -> Option AQuick Check:
XPath //tag[@attr='value'] selects elements by attribute [OK]
- Confusing tag name with attribute name
- Ignoring the attribute filter
- Assuming it selects elements by text content
Solution
Step 1: Recall correct attribute syntax in XPath
Attributes are selected using@attribute='value'inside square brackets.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.Final Answer:
//button[@id='loginBtn'] -> Option AQuick Check:
Use @ before attribute name in XPath filters [OK]
- Omitting @ before attribute name
- Using parentheses instead of square brackets
- Incorrect quoting of attribute values
<input type='checkbox' name='subscribe' checked>What will the XPath
//input[@checked] select?Solution
Step 1: Understand attribute presence in XPath
The XPath[@checked]selects elements where the 'checked' attribute exists, regardless of its value.Step 2: Apply to given HTML
The input element has 'checked' attribute present (even without value), so it matches.Final Answer:
All <input> elements with attribute 'checked' present -> Option DQuick Check:
XPath [@attr] checks attribute presence, not value [OK]
- Assuming attribute must have a value
- Confusing attribute presence with attribute value
- Thinking empty attributes are ignored
//a[@href='https://example.com'] but it fails to find the element. What is the likely error?Solution
Step 1: Verify XPath syntax correctness
The XPath//a[@href='https://example.com']is syntactically correct with proper attribute filter.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).Final Answer:
The href attribute value is incorrect or incomplete -> Option CQuick Check:
Check exact attribute values when XPath finds no elements [OK]
- Assuming XPath syntax error without checking value
- Using wrong tag name for links
- Believing XPath cannot filter by attributes
<input> elements that have a name attribute starting with 'user' and a type attribute exactly equal to 'text'. Which XPath expression is correct?Solution
Step 1: Identify XPath function for 'starts with'
XPath usesstarts-with(@attr, 'value')to check if attribute starts with a string.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 usesandto combine.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'] usescontains()which matches anywhere, not just start.Final Answer:
//input[starts-with(@name, 'user') and @type='text'] -> Option BQuick Check:
Use starts-with() for prefix match in XPath [OK]
- Using CSS-like ^= or *= operators in XPath
- Confusing contains() with starts-with()
- Not combining multiple conditions properly
Ready to prove it?
Pass the test and this pattern moves unknown
