XPath functions like contains and starts-with help find elements on a webpage when exact matches are hard to get. They make locating elements easier and more flexible.
XPath functions (contains, starts-with) in Selenium Java
//*[contains(@attribute, 'value')]
//*[starts-with(@attribute, 'value')]contains() checks if an attribute or text includes a substring anywhere.
starts-with() checks if an attribute or text begins with a substring.
id attribute contains the word 'user'.//input[contains(@id, 'user')]
//button[starts-with(text(), 'Log')]a) whose href attribute contains 'contact'.//a[contains(@href, 'contact')]This test opens a login page, finds the username input using contains() on the id, and finds the login button using starts-with() on the button text. It then types a username and clicks the button.
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class XPathFunctionsTest { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); WebDriver driver = new ChromeDriver(); try { driver.get("https://example.com/login"); // Using contains() to find username input WebElement username = driver.findElement(By.xpath("//input[contains(@id, 'user')]"); username.sendKeys("testuser"); // Using starts-with() to find login button WebElement loginButton = driver.findElement(By.xpath("//button[starts-with(text(), 'Log')]"); loginButton.click(); System.out.println("Test passed: Elements found and actions performed."); } catch (Exception e) { System.out.println("Test failed: " + e.getMessage()); } finally { driver.quit(); } } }
Always check the webpage source to find stable parts of attributes or text for these functions.
Using these functions makes tests less fragile when small changes happen in the UI.
Be careful: too broad use of contains() can match multiple elements, causing errors.
contains() finds elements with attribute or text containing a substring.
starts-with() finds elements with attribute or text starting with a substring.
These functions help write flexible and reliable element locators in Selenium tests.
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
