Bird
Raised Fist0
Selenium Pythontesting~15 mins

Find element by XPath in Selenium Python - Build an Automation Script

Choose your learning style10 modes available
Verify login button is clickable using XPath locator
Preconditions (3)
Step 1: Open the browser and navigate to 'https://example.com/login'
Step 2: Locate the login button using XPath '//button[@id="loginBtn"]'
Step 3: Click the login button
Step 4: Verify that the URL changes to 'https://example.com/dashboard'
✅ Expected Result: The login button is found by XPath and clicked successfully, and the browser navigates to the dashboard page.
Automation Requirements - Selenium with Python
Assertions Needed:
Assert that the login button is found using XPath
Assert that after clicking, the current URL is 'https://example.com/dashboard'
Best Practices:
Use explicit waits to wait for the login button to be clickable
Use By.XPATH locator strategy
Close the browser after test execution
Automated Solution
Selenium Python
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

# Setup WebDriver
with webdriver.Chrome() as driver:
    driver.get('https://example.com/login')

    # Wait until the login button is clickable
    wait = WebDriverWait(driver, 10)
    login_button = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@id="loginBtn"]')))

    # Assert the login button is found
    assert login_button is not None, "Login button not found by XPath"

    # Click the login button
    login_button.click()

    # Wait until URL changes to dashboard
    wait.until(EC.url_to_be('https://example.com/dashboard'))

    # Assert the URL is correct
    assert driver.current_url == 'https://example.com/dashboard', f"Expected URL to be 'https://example.com/dashboard' but got {driver.current_url}"

This script uses Selenium WebDriver with Python to automate the manual test case.

First, it opens the Chrome browser and navigates to the login page URL.

It uses an explicit wait to wait up to 10 seconds for the login button to become clickable, locating it by XPath //button[@id="loginBtn"].

Then it asserts the button is found (not None), clicks it, and waits until the URL changes to the dashboard URL.

Finally, it asserts the current URL matches the expected dashboard URL.

The with statement ensures the browser closes automatically after the test.

Common Mistakes - 3 Pitfalls
{'mistake': 'Using time.sleep() instead of explicit waits', 'why_bad': 'Hardcoded sleeps can make tests slow and flaky if the element loads faster or slower than expected.', 'correct_approach': "Use Selenium's explicit waits like WebDriverWait with expected_conditions to wait only as long as needed."}
Using incorrect XPath syntax or absolute XPath
Not closing the browser after test
Bonus Challenge

Now add data-driven testing with 3 different XPath locators for login buttons on different pages

Show Hint

Practice

(1/5)
1. What does the following Selenium Python code do?
driver.find_element(By.XPATH, "//button[@id='submit']")
easy
A. Finds the button element by its class name 'submit'
B. Finds all button elements with id 'submit' on the page
C. Clicks the button with id 'submit'
D. Finds the first button element with id 'submit' on the page

Solution

  1. Step 1: Understand the method used

    The method find_element returns the first matching element found by the locator.
  2. Step 2: Analyze the XPath expression

    The XPath //button[@id='submit'] selects button elements with attribute id='submit'.
  3. Final Answer:

    Finds the first button element with id 'submit' on the page -> Option D
  4. Quick Check:

    find_element + XPath with id attribute = first matching element [OK]
Hint: find_element finds only the first matching element [OK]
Common Mistakes:
  • Confusing find_element with find_elements
  • Thinking XPath finds by class instead of id
  • Assuming it clicks the element automatically
2. Which of the following is the correct syntax to find an element by XPath in Selenium Python?
easy
A. driver.find_element(By.XPATH, "//div[@class='header']")
B. driver.find_element_by_xpath("//div[@class='header']")
C. driver.find_element(By.CSS_SELECTOR, "//div[@class='header']")
D. driver.find_element(By.ID, "//div[@class='header']")

Solution

  1. Step 1: Recall the modern Selenium syntax

    Since Selenium 4, the recommended way is driver.find_element(By.XPATH, xpath_string).
  2. Step 2: Check each option

    driver.find_element(By.XPATH, "//div[@class='header']") uses the correct syntax. driver.find_element_by_xpath("//div[@class='header']") is deprecated. Options C and D use wrong locator types for XPath.
  3. Final Answer:

    driver.find_element(By.XPATH, "//div[@class='header']") -> Option A
  4. Quick Check:

    Use By.XPATH with find_element [OK]
Hint: Use By.XPATH with find_element, not deprecated methods [OK]
Common Mistakes:
  • Using deprecated find_element_by_xpath method
  • Mixing locator types like CSS_SELECTOR with XPath
  • Passing XPath as ID locator
3. What will be the output of this code snippet if the page contains exactly one <input name='search'> element?
element = driver.find_element(By.XPATH, "//input[@name='search']")
print(element.tag_name)
medium
A. input
B. search
C. NoSuchElementException
D. button

Solution

  1. Step 1: Understand what find_element returns

    It returns the first matching WebElement for the XPath.
  2. Step 2: Check the tag_name property

    The element found is an input tag, so element.tag_name returns "input".
  3. Final Answer:

    input -> Option A
  4. Quick Check:

    XPath finds input element, tag_name returns 'input' [OK]
Hint: tag_name returns the HTML tag of the found element [OK]
Common Mistakes:
  • Confusing attribute value with tag name
  • Expecting exception when element exists
  • Assuming tag_name returns attribute value
4. What is wrong with this code snippet?
element = driver.find_element(By.XPATH, "//div[@class='content']")
print(element.text)

Assume the page has multiple <div class='content'> elements.
medium
A. It will raise NoSuchElementException
B. It only finds the first matching element, ignoring others
C. XPath syntax is incorrect
D. element.text will return None

Solution

  1. Step 1: Understand find_element behavior

    find_element returns only the first matching element, even if multiple exist.
  2. Step 2: Analyze the impact

    If multiple div.content exist, only the first is found and printed, others ignored.
  3. Final Answer:

    It only finds the first matching element, ignoring others -> Option B
  4. Quick Check:

    find_element returns first match only [OK]
Hint: Use find_elements to get all matches, find_element gets first only [OK]
Common Mistakes:
  • Expecting find_element to return all matches
  • Thinking XPath syntax is wrong
  • Assuming element.text returns None if multiple elements exist
5. You want to find a button element with text exactly 'Submit' using XPath in Selenium Python. Which XPath expression is correct to use with driver.find_element(By.XPATH, xpath)?
hard
A. //button[text()!='Submit']
B. //button[contains(text(), 'Submit')]
C. //button[text()='Submit']
D. //button[@text='Submit']

Solution

  1. Step 1: Understand XPath text() function

    XPath text()='Submit' matches elements whose text content is exactly 'Submit'.
  2. Step 2: Evaluate each option

    //button[text()='Submit'] matches exact text. //button[contains(text(), 'Submit')] matches partial text (not exact). //button[@text='Submit'] is invalid because text is not an attribute. //button[text()!='Submit'] matches elements whose text is not 'Submit'.
  3. Final Answer:

    //button[text()='Submit'] -> Option C
  4. Quick Check:

    Use text()='value' for exact text match in XPath [OK]
Hint: Use text()='value' for exact text match in XPath [OK]
Common Mistakes:
  • Using @text instead of text() function
  • Using contains() when exact match needed
  • Using != in XPath for positive match
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard