XPath Examples Library
Copy-ready XPath examples grouped by use case: basic selection, attributes, text, axes, functions, Selenium patterns, and web scraping scenarios. Click “Try it” to load each pattern in the playground with its HTML snippet.
Basic Selection
6 examplesBasic Selection
//div
Selects every div element.
Preview: <div class="container">…</div>
HTML snippet
<div class="container"> <p>First paragraph</p> <p>Second paragraph</p> </div>
Basic Selection
//div/p
Only paragraphs that are direct children of div.
Preview: <p>First paragraph</p>
HTML snippet
<div class="container"> <p>First paragraph</p> <p>Second paragraph</p> </div>
Basic Selection
//div//p
Paragraphs under div at any depth.
Preview: <p>Second paragraph</p>
HTML snippet
<div class="container"> <p>First paragraph</p> <p>Second paragraph</p> </div>
Basic Selection
/html/body/div[1]
The first div in the body.
Preview: <div id="one"></div>
HTML snippet
<body><div id="one"></div><div id="two"></div></body>
Basic Selection
//div[@id='main']
Matches a div whose id is main.
Preview: <div id="main"></div>
HTML snippet
<div id="main"></div><div id="secondary"></div>
Basic Selection
//div[@class='item']
Class equals item (not contains).
Preview: <div class="item"></div>
HTML snippet
<div class="item"></div><div class="item active"></div>
Attributes
8 examplesAttributes
//input[@type='text']
Attribute equals text.
Preview: <input type="text" />
HTML snippet
<input type="text" /><input type="email" />
Attributes
//div[contains(@class, 'btn')]
Substring check for class values.
Preview: <div class="btn primary"></div>
HTML snippet
<div class="btn primary"></div><div class="card"></div>
Attributes
//a[starts-with(@href, 'https')]
Secure links only.
Preview: <a href="https://site.com">Secure</a>
HTML snippet
<a href="https://site.com">Secure</a><a href="/home">Home</a>
Attributes
//img[@alt and @src]
Images with both alt and src.
Preview: <img alt="logo" src="logo.png" />
HTML snippet
<img alt="logo" src="logo.png" /><img src="missing.png" />
Attributes
//div[@data-id='123']
Custom data attributes.
Preview: <div data-id="123"></div>
HTML snippet
<div data-id="123"></div><div data-id="456"></div>
Attributes
//*[@*]
Nodes that have at least one attribute.
Preview: <div class="box"></div>
HTML snippet
<div class="box"></div><span>No attr</span>
Attributes
//div[not(@class)]
Div elements lacking class.
Preview: <div></div>
HTML snippet
<div></div><div class="has"></div>
Attributes
//input[@disabled]
Boolean attribute presence.
Preview: <input disabled />
HTML snippet
<input disabled /><input />
Text Selection
6 examplesText Selection
//p[text()='Login']
Match exact text in a <p> tag.
Preview: <p>Login</p>
HTML snippet
<p>Login</p><p>Logout</p>
Text Selection
//p[contains(text(), 'Welcome')]
Substring search on text nodes.
Preview: <p>Welcome back</p>
HTML snippet
<p>Welcome back</p><p>Hello</p>
Text Selection
//div[normalize-space()='Submit']
Ignore surrounding whitespace.
Preview: <div> Submit </div>
HTML snippet
<div> Submit </div><div>Cancel</div>
Text Selection
//*[text()]
Elements that contain text nodes.
Preview: <span>Label</span>
HTML snippet
<span>Label</span><div><b>Bold</b></div>
Text Selection
//div[not(text())]
Silent container divs.
Preview: <div></div>
HTML snippet
<div></div><div>Text</div>
Text Selection
//p[string-length(text()) > 10]
Text nodes longer than 10 chars.
Preview: <p>More than ten</p>
HTML snippet
<p>Short</p><p>More than ten</p>
Axes
10 examplesAxes
//div/parent::*
The parent of every div.
Preview: <section><div>Item</div></section>
HTML snippet
<section><div>Item</div></section>
Axes
//div/child::p
Child paragraphs of divs.
Preview: <p>One</p>
HTML snippet
<div><p>One</p><span>Two</span></div>
Axes
//div/following-sibling::p
Next paragraphs after divs.
Preview: <p>Next</p>
HTML snippet
<div></div><p>Next</p>
Axes
//div/preceding-sibling::p
Paragraphs before a div.
Preview: <p>Before</p>
HTML snippet
<p>Before</p><div></div>
Axes
//div/ancestor::section
Section ancestors of div.
Preview: <section><div></div></section>
HTML snippet
<section><div></div></section>
Axes
//div/descendant::span
Spans under div.
Preview: <span>Hi</span>
HTML snippet
<div><p><span>Hi</span></p></div>
Axes
//div/following::*[1]
Immediate following node.
Preview: <p>After</p>
HTML snippet
<div></div><p>After</p><p>Later</p>
Axes
//div/preceding::*[1]
Immediate node before div.
Preview: <p>Before</p>
HTML snippet
<p>Before</p><div></div>
Axes
//li/ancestor-or-self::ul
Lists that contain li or li itself.
Preview: <ul><li>Item</li></ul>
HTML snippet
<ul><li>Item</li></ul>
Axes
//input/parent::*/following-sibling::label
Labels next to input parents.
Preview: <label for="i">Email</label>
HTML snippet
<div><input id="i" /></div><label for="i">Email</label>
Functions
12 examplesFunctions
//div[count(p) > 2]
Div elements with more than 2 p children.
Preview: <div>…3 p elements…</div>
HTML snippet
<div><p>a</p><p>b</p><p>c</p></div>
Functions
//p[position() = 1]
First paragraph in each context.
Preview: <p>First</p>
HTML snippet
<p>First</p><p>Second</p>
Functions
//p[last()]
Last paragraph sibling.
Preview: <p>Last</p>
HTML snippet
<p>First</p><p>Last</p>
Functions
//div[name() = 'div']
Name() function usage.
Preview: <div></div>
HTML snippet
<div></div>
Functions
//div[local-name() = 'div']
Local-name demonstration.
Preview: <div></div>
HTML snippet
<div></div>
Functions
//p[string-length(text()) > 10]
Text longer than 10 characters.
Preview: <p>more than ten</p>
HTML snippet
<p>short</p><p>more than ten</p>
Functions
//div[concat(@class, '-suffix')]
Concat returns non-empty string so condition truthy.
Preview: <div class="box"></div>
HTML snippet
<div class="box"></div>
Functions
//p[substring(text(), 1, 5) = 'Hello']
Substring match at start.
Preview: <p>Hello world</p>
HTML snippet
<p>Hello world</p><p>Welcome</p>
Functions
//div[translate(@class, 'ABC', 'abc')]
Normalize class casing.
Preview: <div class="ABC"></div>
HTML snippet
<div class="ABC"></div>
Functions
//input[number(@value) > 100]
Numeric comparison on attribute.
Preview: <input value="120" />
HTML snippet
<input value="120" /><input value="50" />
Functions
//div[boolean(@data-active)]
Truthy data-active attribute.
Preview: <div data-active="true"></div>
HTML snippet
<div data-active="true"></div><div></div>
Functions
//p[normalize-space(text())]
Paragraphs with non-empty text after trimming.
Preview: <p> hi </p>
HTML snippet
<p> hi </p><p> </p>
Selenium Common Patterns
15 examplesSelenium Common Patterns
//button[text()='Submit']
Exact text button.
Preview: <button>Submit</button>
HTML snippet
<button>Submit</button><button>Cancel</button>
Selenium Common Patterns
//a[@href='/login']
Target login link.
Preview: <a href="/login">Login</a>
HTML snippet
<a href="/login">Login</a>
Selenium Common Patterns
//input[@name='username']
Form field by name.
Preview: <input name="username" />
HTML snippet
<input name="username" /><input name="password" />
Selenium Common Patterns
//table//tr[2]//td[3]
Second row, third cell.
Preview: <td>B3</td>
HTML snippet
<table><tr><td>A1</td></tr><tr><td>B1</td><td>B2</td><td>B3</td></tr></table>
Selenium Common Patterns
//ul[@class='menu']/li[last()]
Last list item.
Preview: <li>Three</li>
HTML snippet
<ul class="menu"><li>One</li><li>Two</li><li>Three</li></ul>
Selenium Common Patterns
//div[contains(@class, 'error') and contains(@class, 'visible')]
Error and visible flags.
Preview: <div class="error visible"></div>
HTML snippet
<div class="error visible"></div>
Selenium Common Patterns
//button[@type='submit' or @class='submit-btn']
Match either submit type or class.
Preview: <button class="submit-btn">Go</button>
HTML snippet
<button class="submit-btn">Go</button>
Selenium Common Patterns
//*[@id='main']//p[not(@class)]
Paragraphs inside main without class.
Preview: <p>Clean</p>
HTML snippet
<div id="main"><p>Clean</p><p class="muted">Muted</p></div>
Selenium Common Patterns
//div[@data-test-id='login-form']//input
Inputs inside login form container.
Preview: <input />
HTML snippet
<div data-test-id="login-form"><input /><input /></div>
Selenium Common Patterns
//iframe[@name='content']//*
Any node inside iframe.
Preview: <p>Hi</p>
HTML snippet
<iframe name="content"><html><body><p>Hi</p></body></html></iframe>
Selenium Common Patterns
//select[@name='country']/option[@selected]
Currently selected option.
Preview: <option selected>CA</option>
HTML snippet
<select name="country"><option>US</option><option selected>CA</option></select>
Selenium Common Patterns
//input[@type='checkbox' and @checked]
Checked boxes.
Preview: <input type="checkbox" checked />
HTML snippet
<input type="checkbox" checked /><input type="checkbox" />
Selenium Common Patterns
//div[starts-with(@id, 'dynamic-')]
IDs generated dynamically.
Preview: <div id="dynamic-123"></div>
HTML snippet
<div id="dynamic-123"></div><div id="static"></div>
Selenium Common Patterns
//span[contains(text(), 'Error') and @class='msg']
Error messages with class msg.
Preview: <span class="msg">Error occurred</span>
HTML snippet
<span class="msg">Error occurred</span>
Selenium Common Patterns
//*[text()='Next']/parent::button
Locate a parent button from text.
Preview: <button><span>Next</span></button>
HTML snippet
<button><span>Next</span></button>
Web Scraping
5 examplesWeb Scraping
//article//h2/text()
Extract article titles without tags.
Preview: Text nodes are handy when scraping.
HTML snippet
<article><h2>Headline</h2><p>Story</p></article>
Web Scraping
//a[@rel='nofollow']/@href
Grab outbound or promo links.
Preview: Attributes can be returned directly.
HTML snippet
<a href="/promo" rel="nofollow">Promo</a>
Web Scraping
//div[not(contains(@class,'ad'))]//img/@src
Skip ad slots while collecting images.
Preview: Combine not() with contains().
HTML snippet
<div class="ad"><img src="ad.png"></div><div class="post"><img src="hero.jpg"></div>
Web Scraping
//ul[@class='products']/li[position()<=3]
Top 3 items only.
Preview: Position filtering keeps results small.
HTML snippet
<ul class="products"><li>A</li><li>B</li><li>C</li><li>D</li></ul>
Web Scraping
//meta[@property='og:title']/@content
Grab Open Graph title for previews.
Preview: Meta tags are attributes only.
HTML snippet
<meta property="og:title" content="Demo" />