What if your test could find buttons by their words, not by guessing their hidden codes?
Why XPath with text() in Selenium Python? - Purpose & Use Cases
Imagine you need to find a button on a webpage that says "Submit". You try to click it by guessing its position or ID, but the page changes often, and your guesses fail.
Manually searching for elements by position or guessing IDs is slow and often breaks when the page layout changes. It's like trying to find a book in a messy library without a catalog.
Using XPath with text() lets you find elements by their visible text, like searching the library catalog by book title. This makes your tests more reliable and easier to maintain.
driver.find_element(By.ID, "btn1").click()driver.find_element(By.XPATH, "//button[text()='Submit']").click()You can precisely target elements by their displayed text, making tests stable even if page structure changes.
When a website changes button IDs but keeps the button text "Login", your test still finds and clicks the login button without breaking.
Manual element finding by ID or position is fragile.
XPath with text() targets elements by visible text.
This approach makes tests more reliable and easier to update.
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
