from pathlib import Path from tempfile import TemporaryDirectory import shutil from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait HTML = """ Selenium XPath locator demo

Starter plan

$19 per month

Enterprise plan

Contact sales

nothing selected

""" CARD_XPATH = "//section[@data-testid='plan-card'][.//h2[normalize-space()='Starter plan']]" BUTTON_XPATH = ".//button[normalize-space()='Choose Starter']" options = Options() options.add_argument("--headless=new") options.add_argument("--window-size=1280,720") for browser_name in ("google-chrome", "chromium", "chromium-browser"): browser_path = shutil.which(browser_name) if browser_path: options.binary_location = browser_path break driver_path = shutil.which("chromedriver") service = Service(driver_path) if driver_path else Service() with TemporaryDirectory() as tmpdir: page = Path(tmpdir) / "xpath-locator.html" page.write_text(HTML, encoding="utf-8") driver = webdriver.Chrome(service=service, options=options) try: driver.get(page.as_uri()) wait = WebDriverWait(driver, 10) card = wait.until(EC.presence_of_element_located((By.XPATH, CARD_XPATH))) button = card.find_element(By.XPATH, BUTTON_XPATH) button.click() wait.until(EC.text_to_be_present_in_element((By.ID, "status"), "selected starter")) status = driver.find_element(By.ID, "status").text print(f"title: {driver.title}") print(f"plan: {card.find_element(By.TAG_NAME, 'h2').text}") print(f"button: {button.text}") print(f"tier: {card.get_dom_attribute('data-tier')}") print(f"status: {status}") finally: driver.quit()