Discover how a few smart XPath tricks can save you hours of tedious clicking!
Why XPath functions (contains, starts-with) in Selenium Java? - Purpose & Use Cases
Imagine you are testing a website with hundreds of buttons and links. You need to find a button that has a label starting with 'Submit' or contains the word 'Next'. Doing this by clicking and checking each element manually is like searching for a needle in a haystack.
Manually checking each element is slow and tiring. You might miss some buttons or click the wrong ones. It's easy to make mistakes, and repeating this every time the page changes wastes a lot of time.
XPath functions like contains() and starts-with() let you write smart queries to find elements by partial text or attributes. This means you can quickly and accurately select the right elements without checking each one manually.
driver.findElement(By.xpath("//button[text()='Submit Form']"));driver.findElement(By.xpath("//button[starts-with(text(),'Submit')]"); driver.findElement(By.xpath("//a[contains(text(),'Next')]");
With these XPath functions, you can easily find elements even if their text changes slightly, making your tests more flexible and reliable.
On a shopping site, the 'Add to Cart' button might say 'Add to Cart Now' or 'Add to Cart - Limited Offer'. Using starts-with() or contains() helps your test find the button no matter the exact text.
Manual element search is slow and error-prone.
XPath functions contains() and starts-with() simplify locating elements by partial text.
These functions make tests more flexible and easier to maintain.
Practice
Solution
Step 1: Understand the purpose of
Thecontains()contains()function checks if an attribute or text contains a given substring anywhere inside it.Step 2: Compare with other functions
starts-with()checks only the beginning,ends-with()is not standard XPath 1.0, andequals()is not an XPath function.Final Answer:
contains() -> Option CQuick Check:
Substring anywhere = contains() [OK]
- Confusing contains() with starts-with()
- Using ends-with() which is not standard XPath 1.0
- Trying to use equals() as XPath function
id attribute starts with "submit"?Solution
Step 1: Identify the correct XPath function for 'starts with'
The functionstarts-with()is used to check if an attribute starts with a substring.Step 2: Check syntax correctness
//button[starts-with(@id, 'submit')]is correct XPath syntax. Options B and C use invalid XPath operators.Final Answer:
//button[starts-with(@id, 'submit')] -> Option DQuick Check:
Starts with = starts-with() [OK]
- Using contains() instead of starts-with() for prefix
- Using CSS selector syntax like ^= in XPath
- Incorrect function syntax or missing parentheses
<input type="text" id="user_email" value="test@example.com"/>
What is the result of this XPath query?
//*[@id[contains(., 'user')]]Solution
Step 1: Analyze the XPath syntax
The XPath//*[@id[contains(., 'user')]]is syntactically incorrect because@idis an attribute node and cannot be used as a function or have predicates applied directly like this.Step 2: Correct XPath syntax
To check if theidattribute contains 'user', the correct XPath is//*[@id[contains(., 'user')]]is invalid; instead use//*[contains(@id, 'user')].Final Answer:
Syntax error due to incorrect XPath function usage -> Option AQuick Check:
Attribute predicates must be correctly formed [OK]
- Using predicates directly on attribute nodes
- Assuming . refers to attribute value in this context
- Incorrect predicate syntax
//a[contains(starts-with(@href, 'http'))]Why does this XPath fail to find any elements?
Solution
Step 1: Understand function nesting rules in XPath
Thecontains()function expects two string arguments, but here it wrapsstarts-with()which returns a boolean, causing a syntax error.Step 2: Correct usage
Use eitherstarts-with(@href, 'http')alone orcontains(@href, 'http'), but not nested.Final Answer:
Because contains() cannot wrap starts-with() function -> Option BQuick Check:
Do not nest contains() and starts-with() [OK]
- Nesting contains() and starts-with() incorrectly
- Assuming starts-with() returns string for contains()
- Ignoring function argument requirements
<div> elements whose class attribute starts with "alert" but excludes those that contain "dismiss" anywhere in the class. Which XPath expression correctly achieves this?Solution
Step 1: Use starts-with() to match class beginning
The expressionstarts-with(@class, 'alert')selects elements whose class attribute begins with "alert".Step 2: Exclude elements containing 'dismiss'
Thenot(contains(@class, 'dismiss'))excludes elements whose class contains "dismiss" anywhere.Step 3: Combine conditions with and
Both conditions must be true, so useandto combine them.Final Answer:
//div[starts-with(@class, 'alert') and not(contains(@class, 'dismiss'))] -> Option AQuick Check:
Starts with alert AND no dismiss = //div[starts-with(@class, 'alert') and not(contains(@class, 'dismiss'))] [OK]
- Using or instead of and causing wrong matches
- Mixing contains() and starts-with() incorrectly
- Forgetting to negate contains() for exclusion
Ready to prove it?
Pass the test and this pattern moves unknown
