How to find element by text in Selenium?

Discover how to efficiently locate elements by text using Selenium in this concise tutorial. Master the techniques to enhance your data extraction tasks with step-by-step guidance and expert insights.

Best practices

  • Use explicit waits (like `WebDriverWait`) to handle scenarios where elements might take time to appear due to dynamic content loading.

  • Always validate the correctness of the XPath by checking it in the browser's developer tools before using it in your script.

  • When using `contains()`, be aware of potential matches to unexpected elements and refine your XPath to be as specific as possible.

  • Regularly update your Selenium WebDriver and browser to ensure compatibility and access to the latest features and fixes.

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 WebDriver
driver = webdriver.Chrome()

# Navigate to the page
driver.get("https://sandbox.oxylabs.io/products")

# Method 1: Using XPath to find element by exact text
element = driver.find_element(By.XPATH, "//tagname[text()='Exact Text']")

# Method 2: Using XPath with contains() for partial text match
partial_element = driver.find_element(By.XPATH, "//tagname[contains(text(), 'Part of Text')]")

# Method 3: Using WebDriverWait to find element by text with timeout
wait_element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "//tagname[contains(text(), 'Timely Text')]"))
)

# Close the browser
driver.quit()

Common issues

  • Ensure that the text used in XPath expressions is not dynamically generated, as this can lead to element not found errors.

  • Avoid using absolute XPaths; instead, opt for relative paths to increase the robustness and maintainability of your tests.

  • Consider using `text()` in XPath only when necessary, as searching by attributes or class names might be more efficient and less prone to changes.

  • Be mindful of case sensitivity when searching for text in web elements, and use functions like `translate()` in XPath to handle varying text cases if needed.


# Incorrect: Using dynamically generated text in XPath
element = driver.find_element(By.XPATH, "//div[text()='Session ID: 12345']")

# Correct: Use static parts of the text or attributes
element = driver.find_element(By.XPATH, "//div[contains(text(), 'Session ID:')]")

# Incorrect: Using absolute XPath
element = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[3]/div")

# Correct: Using relative XPath
element = driver.find_element(By.XPATH, "//div[@class='specific-class']")

# Incorrect: Overusing text() where attributes could be used
element = driver.find_element(By.XPATH, "//button[text()='Click me']")

# Correct: Targeting attributes
element = driver.find_element(By.XPATH, "//button[@id='submit-button']")

# Incorrect: Ignoring case sensitivity in text searches
element = driver.find_element(By.XPATH, "//div[text()='welcome']")

# Correct: Using translate() to handle case variations
element = driver.find_element(By.XPATH, "//*[translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='welcome']")

Try Oyxlabs' Proxies & Scraper API

Residential Proxies

Self-Service

Human-like scraping without IP blocking

From

8

Datacenter Proxies

Self-Service

Fast and reliable proxies for cost-efficient scraping

From

1.2

Web scraper API

Self-Service

Public data delivery from a majority of websites

From

49

Useful resources

Get the latest news from data gathering world

I'm interested