XPath with contains and starts-with helps find elements when you only know part of their attribute or text. This makes tests more flexible and less fragile.
XPath with contains and starts-with in Selenium Python
//*[contains(@attribute, 'value')]
//*[starts-with(@attribute, 'value')]contains() checks if the attribute or text has the given substring anywhere.
starts-with() checks if the attribute or text begins exactly with the given substring.
<button> element whose id attribute contains 'submit' anywhere.//button[contains(@id, 'submit')]<a> link element whose visible text starts with 'Log'.//a[starts-with(text(), 'Log')]class attribute containing 'active'.//*[contains(@class, 'active')]<input> element whose name attribute starts with 'user'.//input[starts-with(@name, 'user')]
This script opens a simple HTML page with buttons and links. It uses XPath with contains and starts-with to find elements by partial attribute values and text. It prints the found elements' text or tag name to show the correct elements were found.
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options # Setup WebDriver (make sure chromedriver is in PATH) options = Options() options.add_argument('--headless') driver = webdriver.Chrome(options=options) # Open a simple test page with buttons html = ''' <html> <body> <button id="btn_submit_123">Submit</button> <button id="btn_cancel_456">Cancel</button> <a href="#" class="link active">Login</a> <a href="#" class="link">Logout</a> </body> </html> ''' # Use data URL to load HTML driver.get("data:text/html;charset=utf-8," + html) # Find button with id containing 'submit' submit_button = driver.find_element(By.XPATH, "//button[contains(@id, 'submit')]") print(submit_button.text) # Should print 'Submit' # Find link starting with text 'Log' link = driver.find_element(By.XPATH, "//a[starts-with(text(), 'Log')]") print(link.text) # Should print 'Login' # Find element with class containing 'active' active_link = driver.find_element(By.XPATH, "//*[contains(@class, 'active')]") print(active_link.tag_name) # Should print 'a' # Find button starting with id 'btn_cancel' cancel_button = driver.find_element(By.XPATH, "//button[starts-with(@id, 'btn_cancel')]") print(cancel_button.text) # Should print 'Cancel' # Close driver driver.quit()
Always prefer unique and stable attributes for locating elements.
Using contains and starts-with helps when attributes change dynamically.
Test your XPath expressions in browser DevTools before using them in code.
contains() finds elements with attribute or text containing a substring.
starts-with() finds elements with attribute or text starting with a substring.
These XPath functions make locating elements more flexible and reliable.