XPath with text() 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 # Initialize the Chrome driver with webdriver.Chrome() as driver: driver.get('https://example.com/sample-form') wait = WebDriverWait(driver, 10) # Wait until the button with text 'Submit' is clickable submit_button = wait.until( EC.element_to_be_clickable((By.XPATH, "//button[text()='Submit']")) ) # Click the button submit_button.click() # Wait until URL changes to expected wait.until(EC.url_to_be('https://example.com/form-submitted')) # Assert the URL is correct assert driver.current_url == 'https://example.com/form-submitted', f"Expected URL to be 'https://example.com/form-submitted' but got {driver.current_url}"
This script uses Selenium WebDriver with Python to automate the test case.
First, it opens the sample web page.
Then it waits explicitly for the button with the exact text 'Submit' using XPath //button[text()='Submit']. This ensures the element is present and clickable.
After locating the button, it clicks it.
Then it waits until the URL changes to the expected URL https://example.com/form-submitted.
Finally, it asserts that the current URL matches the expected URL, confirming the navigation happened correctly.
Using explicit waits avoids timing issues and makes the test reliable.
Now add data-driven testing with 3 different button texts: 'Submit', 'Send', 'Confirm'. Verify each button click navigates to its respective URL.
Practice
//button[text()='Submit'] select in a web page?Solution
Step 1: Understand the XPath syntax
The expression//buttonselects all button elements in the page.Step 2: Analyze the
The predicatetext()condition[text()='Submit']filters buttons whose visible text exactly matches 'Submit'.Final Answer:
A button element with the exact visible text 'Submit' -> Option CQuick Check:
XPath with text() matches exact visible text [OK]
- Confusing attribute matching with text()
- Assuming partial text matches work
- Ignoring case sensitivity in text()
<a>) with the visible text exactly 'Home'?Solution
Step 1: Check the correct use of text() function
The correct syntax to match exact text istext()='Home'inside square brackets.Step 2: Identify syntax errors in other options
//a[contains(text(), 'Home')] usescontains()which matches partial text, not exact. //a[@text='Home'] incorrectly treats text as an attribute. //a[text() = Home] misses quotes around 'Home'.Final Answer:
//a[text()='Home'] -> Option BQuick Check:
Exact text match requires text()='value' with quotes [OK]
- Using contains() instead of text() for exact match
- Treating text as an attribute
- Missing quotes around text value
<div> <span>Login</span> <span>Logout</span> <span>Login</span> </div>
What will be the result of this Selenium Python code?
elements = driver.find_elements(By.XPATH, "//span[text()='Login']") print(len(elements))
Solution
Step 1: Identify elements matching XPath
The XPath//span[text()='Login']selects all<span>elements with exact text 'Login'. There are two such spans in the HTML.Step 2: Count the matched elements
Thefind_elementsmethod returns a list of matching elements. Its length is 2.Final Answer:
2 -> Option AQuick Check:
Count of spans with text 'Login' = 2 [OK]
- Assuming only one element matches
- Confusing find_element with find_elements
- Ignoring exact text match requirement
//button[text()='Cancel']. But your test fails to find the button. What is the most likely reason?Solution
Step 1: Check XPath syntax correctness
The XPath//button[text()='Cancel']is syntactically correct, so syntax error is unlikely.Step 2: Consider text matching behavior
Thetext()function matches exact visible text including spaces and case. If the button text has extra spaces or different case (e.g., ' cancel ' or 'CANCEL'), it won't match.Final Answer:
The button text has extra spaces or different case -> Option AQuick Check:
Exact text match fails if spaces or case differ [OK]
- Assuming text() matches partial or case-insensitive text
- Ignoring leading/trailing spaces in text
- Blaming XPath syntax without checking text content
<div> element that contains exactly the text 'Error: Invalid input' but the text may have leading or trailing spaces. Which XPath expression correctly handles this using text() and normalize-space()?Solution
Step 1: Understand the problem with spaces
Text may have extra spaces, so exacttext()='Error: Invalid input'won't match if spaces differ.Step 2: Use normalize-space() to trim spaces
normalize-space(text())removes leading and trailing spaces before comparison, ensuring correct match.Step 3: Evaluate options
//div[text()='Error: Invalid input'] fails if spaces differ. //div[contains(text(), 'Error: Invalid input')] matches partial text, not exact. //div[normalize-space()='Error: Invalid input'] usesnormalize-space()withouttext(), which may fail if element has multiple text nodes.Final Answer:
//div[normalize-space(text())='Error: Invalid input'] -> Option DQuick Check:
Use normalize-space(text()) for exact text ignoring spaces [OK]
- Not trimming spaces before text comparison
- Using contains() for exact match
- Applying normalize-space() incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
