or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

alerts.mdconfiguration.mddrivers.mdelements.mdindex.mdinteractions.mdjavascript.mdlocators.mdpage-objects.mdwaits.mdwebdriver.md

locators.mddocs/

0

# Element Location Strategies

1

2

The By class provides various strategies for locating elements in the DOM, including ID-based, CSS selector, XPath, and text-based searches.

3

4

## Capabilities

5

6

### By Class

7

8

Abstract factory class providing static methods for creating element locator strategies.

9

10

```java { .api }

11

/**

12

* By abstract class for element location strategies

13

* Provides static factory methods for different locator types

14

*/

15

abstract class By {

16

/**

17

* Locate element by ID attribute

18

* @param id - Element ID value

19

* @return By locator for ID-based search

20

*/

21

static By id(String id);

22

23

/**

24

* Locate element by name attribute

25

* @param name - Element name value

26

* @return By locator for name-based search

27

*/

28

static By name(String name);

29

30

/**

31

* Locate element by CSS class name

32

* @param className - CSS class name (single class only)

33

* @return By locator for class-based search

34

*/

35

static By className(String className);

36

37

/**

38

* Locate element by HTML tag name

39

* @param tagName - HTML tag name (e.g., "div", "input", "button")

40

* @return By locator for tag-based search

41

*/

42

static By tagName(String tagName);

43

44

/**

45

* Locate element by XPath expression

46

* @param xpathExpression - XPath query string

47

* @return By locator for XPath-based search

48

*/

49

static By xpath(String xpathExpression);

50

51

/**

52

* Locate element by CSS selector

53

* @param cssSelector - CSS selector string

54

* @return By locator for CSS selector-based search

55

*/

56

static By cssSelector(String cssSelector);

57

58

/**

59

* Locate link element by exact link text

60

* @param linkText - Exact text content of the link

61

* @return By locator for link text search

62

*/

63

static By linkText(String linkText);

64

65

/**

66

* Locate link element by partial link text

67

* @param partialLinkText - Partial text content of the link

68

* @return By locator for partial link text search

69

*/

70

static By partialLinkText(String partialLinkText);

71

}

72

```

73

74

## Locator Strategy Examples

75

76

### ID-Based Location

77

78

Most reliable and fastest locator strategy when unique IDs are available.

79

80

```java

81

// Locate by ID attribute

82

WebElement loginButton = driver.findElement(By.id("loginBtn"));

83

WebElement usernameField = driver.findElement(By.id("username"));

84

WebElement errorMessage = driver.findElement(By.id("error-msg"));

85

86

// Multiple elements (rare with ID, but possible with invalid HTML)

87

List<WebElement> elementsWithSameId = driver.findElements(By.id("duplicateId"));

88

```

89

90

### Name-Based Location

91

92

Useful for form elements with name attributes.

93

94

```java

95

// Form elements by name

96

WebElement emailField = driver.findElement(By.name("email"));

97

WebElement passwordField = driver.findElement(By.name("password"));

98

WebElement newsletterCheckbox = driver.findElement(By.name("newsletter"));

99

100

// Radio button groups

101

List<WebElement> genderOptions = driver.findElements(By.name("gender"));

102

for (WebElement option : genderOptions) {

103

if (option.getAttribute("value").equals("female")) {

104

option.click();

105

break;

106

}

107

}

108

```

109

110

### CSS Class-Based Location

111

112

Locate elements by CSS class name (single class only).

113

114

```java

115

// Single class name

116

WebElement submitButton = driver.findElement(By.className("btn-primary"));

117

WebElement errorDiv = driver.findElement(By.className("error-message"));

118

119

// Find multiple elements with same class

120

List<WebElement> menuItems = driver.findElements(By.className("nav-item"));

121

List<WebElement> productCards = driver.findElements(By.className("product-card"));

122

```

123

124

### Tag Name-Based Location

125

126

Locate elements by HTML tag name, useful for finding all elements of a type.

127

128

```java

129

// Find elements by tag

130

List<WebElement> allInputs = driver.findElements(By.tagName("input"));

131

List<WebElement> allLinks = driver.findElements(By.tagName("a"));

132

List<WebElement> allImages = driver.findElements(By.tagName("img"));

133

WebElement firstHeading = driver.findElement(By.tagName("h1"));

134

135

// Within a specific parent

136

WebElement form = driver.findElement(By.id("contactForm"));

137

List<WebElement> formInputs = form.findElements(By.tagName("input"));

138

```

139

140

### XPath-Based Location

141

142

Powerful but potentially slow locator using XPath expressions.

143

144

```java

145

// Simple XPath

146

WebElement button = driver.findElement(By.xpath("//button[@type='submit']"));

147

WebElement input = driver.findElement(By.xpath("//input[@name='username']"));

148

149

// XPath with text content

150

WebElement link = driver.findElement(By.xpath("//a[text()='Click Here']"));

151

WebElement header = driver.findElement(By.xpath("//h1[contains(text(), 'Welcome')]"));

152

153

// XPath with parent/child relationships

154

WebElement tableCell = driver.findElement(By.xpath("//table[@id='data']/tbody/tr[2]/td[3]"));

155

WebElement lastListItem = driver.findElement(By.xpath("//ul[@class='menu']/li[last()]"));

156

157

// XPath with multiple conditions

158

WebElement complexElement = driver.findElement(

159

By.xpath("//div[@class='product' and @data-price > '100']//button[text()='Buy Now']")

160

);

161

162

// XPath with following/preceding siblings

163

WebElement nextSibling = driver.findElement(By.xpath("//label[text()='Email:']/following-sibling::input"));

164

WebElement previousElement = driver.findElement(By.xpath("//button[@id='submit']/preceding-sibling::input"));

165

166

// XPath with contains and attributes

167

List<WebElement> elements = driver.findElements(

168

By.xpath("//div[contains(@class, 'product') and contains(@data-category, 'electronics')]")

169

);

170

```

171

172

### CSS Selector-Based Location

173

174

Modern and efficient locator using CSS selector syntax.

175

176

```java

177

// Basic CSS selectors

178

WebElement elementById = driver.findElement(By.cssSelector("#loginForm"));

179

WebElement elementByClass = driver.findElement(By.cssSelector(".btn-primary"));

180

WebElement elementByTag = driver.findElement(By.cssSelector("input"));

181

182

// Attribute selectors

183

WebElement inputByType = driver.findElement(By.cssSelector("input[type='email']"));

184

WebElement linkByHref = driver.findElement(By.cssSelector("a[href='https://example.com']"));

185

WebElement elementByDataAttr = driver.findElement(By.cssSelector("div[data-testid='user-profile']"));

186

187

// Descendant and child selectors

188

WebElement nestedElement = driver.findElement(By.cssSelector("form#login input[name='username']"));

189

WebElement directChild = driver.findElement(By.cssSelector("nav > ul > li:first-child"));

190

191

// Pseudo-selectors

192

WebElement firstChild = driver.findElement(By.cssSelector("ul li:first-child"));

193

WebElement lastChild = driver.findElement(By.cssSelector("ul li:last-child"));

194

WebElement nthChild = driver.findElement(By.cssSelector("tr:nth-child(3)"));

195

WebElement evenRows = driver.findElement(By.cssSelector("tr:nth-child(even)"));

196

197

// Partial attribute matching

198

WebElement partialClass = driver.findElement(By.cssSelector("div[class*='product']"));

199

WebElement startsWith = driver.findElement(By.cssSelector("input[id^='user']"));

200

WebElement endsWith = driver.findElement(By.cssSelector("img[src$='.png']"));

201

202

// Multiple selectors

203

List<WebElement> multipleSelectors = driver.findElements(

204

By.cssSelector("input[type='text'], input[type='email'], textarea")

205

);

206

```

207

208

### Link Text-Based Location

209

210

Specialized locators for anchor elements based on their text content.

211

212

```java

213

// Exact link text

214

WebElement homeLink = driver.findElement(By.linkText("Home"));

215

WebElement loginLink = driver.findElement(By.linkText("Login"));

216

WebElement logoutLink = driver.findElement(By.linkText("Logout"));

217

218

// Partial link text (useful for dynamic or long link text)

219

WebElement downloadLink = driver.findElement(By.partialLinkText("Download"));

220

WebElement readMoreLink = driver.findElement(By.partialLinkText("Read More"));

221

WebElement productLink = driver.findElement(By.partialLinkText("iPhone"));

222

223

// Case sensitivity considerations

224

try {

225

WebElement link1 = driver.findElement(By.linkText("CONTACT US"));

226

WebElement link2 = driver.findElement(By.linkText("Contact Us"));

227

// These may find different elements or throw NoSuchElementException

228

} catch (NoSuchElementException e) {

229

// Handle case where exact text doesn't match

230

}

231

232

// Finding all links with partial text

233

List<WebElement> productLinks = driver.findElements(By.partialLinkText("Product"));

234

```

235

236

## Best Practices and Strategy Selection

237

238

### Locator Priority and Recommendations

239

240

```java

241

// 1. ID - Most reliable and fastest (when available and unique)

242

WebElement element1 = driver.findElement(By.id("unique-id"));

243

244

// 2. Name - Good for form elements

245

WebElement element2 = driver.findElement(By.name("fieldName"));

246

247

// 3. CSS Selector - Modern, flexible, and readable

248

WebElement element3 = driver.findElement(By.cssSelector("input[data-testid='username']"));

249

250

// 4. Link Text - Good for navigation links

251

WebElement element4 = driver.findElement(By.linkText("Contact Us"));

252

253

// 5. Class Name - Use with caution (ensure uniqueness)

254

WebElement element5 = driver.findElement(By.className("unique-class"));

255

256

// 6. XPath - Powerful but can be fragile and slow

257

WebElement element6 = driver.findElement(By.xpath("//button[text()='Submit']"));

258

259

// 7. Tag Name - Usually for finding multiple elements

260

List<WebElement> elements7 = driver.findElements(By.tagName("input"));

261

```

262

263

### Robust Locator Patterns

264

265

```java

266

// Use data attributes for test automation

267

WebElement testElement = driver.findElement(By.cssSelector("[data-testid='submit-button']"));

268

269

// Combine multiple attributes for uniqueness

270

WebElement specificButton = driver.findElement(

271

By.cssSelector("button[type='submit'][class*='primary']")

272

);

273

274

// Use partial matching for dynamic content

275

WebElement dynamicElement = driver.findElement(

276

By.cssSelector("div[id^='generated-'][class$='-container']")

277

);

278

279

// Create reusable locator methods

280

public By buttonByText(String text) {

281

return By.xpath("//button[normalize-space(text())='" + text + "']");

282

}

283

284

public By inputByPlaceholder(String placeholder) {

285

return By.cssSelector("input[placeholder='" + placeholder + "']");

286

}

287

288

// Usage

289

WebElement submitBtn = driver.findElement(buttonByText("Submit"));

290

WebElement emailInput = driver.findElement(inputByPlaceholder("Enter your email"));

291

```

292

293

### Error Handling and Fallback Strategies

294

295

```java

296

// Try multiple locator strategies

297

public WebElement findElementWithFallback(WebDriver driver, String id, String className, String xpath) {

298

try {

299

return driver.findElement(By.id(id));

300

} catch (NoSuchElementException e1) {

301

try {

302

return driver.findElement(By.className(className));

303

} catch (NoSuchElementException e2) {

304

return driver.findElement(By.xpath(xpath));

305

}

306

}

307

}

308

309

// Check element existence before interaction

310

public boolean isElementPresent(WebDriver driver, By locator) {

311

try {

312

driver.findElement(locator);

313

return true;

314

} catch (NoSuchElementException e) {

315

return false;

316

}

317

}

318

319

// Wait for element with multiple locators

320

public WebElement waitForAnyElement(WebDriver driver, Duration timeout, By... locators) {

321

WebDriverWait wait = new WebDriverWait(driver, timeout);

322

for (By locator : locators) {

323

try {

324

return wait.until(ExpectedConditions.presenceOfElementLocated(locator));

325

} catch (TimeoutException e) {

326

// Continue to next locator

327

}

328

}

329

throw new NoSuchElementException("None of the provided locators found an element");

330

}

331

```

332

333

### Relative Locators

334

335

Modern spatial locator strategy for finding elements relative to other elements.

336

337

```java { .api }

338

/**

339

* RelativeLocator class for spatial element location

340

* Allows finding elements based on their position relative to other elements

341

*/

342

class RelativeLocator {

343

/**

344

* Create relative locator starting with a base locator

345

* @param by - Base locator strategy

346

* @return RelativeBy instance for chaining spatial relationships

347

*/

348

static RelativeBy with(By by);

349

}

350

351

/**

352

* RelativeBy class for chaining spatial relationships

353

*/

354

class RelativeBy extends By {

355

/**

356

* Find element above the reference element

357

* @param element - Reference element

358

* @return RelativeBy for further chaining

359

*/

360

RelativeBy above(WebElement element);

361

362

/**

363

* Find element above the located reference element

364

* @param locator - Locator for reference element

365

* @return RelativeBy for further chaining

366

*/

367

RelativeBy above(By locator);

368

369

/**

370

* Find element below the reference element

371

* @param element - Reference element

372

* @return RelativeBy for further chaining

373

*/

374

RelativeBy below(WebElement element);

375

376

/**

377

* Find element below the located reference element

378

* @param locator - Locator for reference element

379

* @return RelativeBy for further chaining

380

*/

381

RelativeBy below(By locator);

382

383

/**

384

* Find element to the left of the reference element

385

* @param element - Reference element

386

* @return RelativeBy for further chaining

387

*/

388

RelativeBy toLeftOf(WebElement element);

389

390

/**

391

* Find element to the left of the located reference element

392

* @param locator - Locator for reference element

393

* @return RelativeBy for further chaining

394

*/

395

RelativeBy toLeftOf(By locator);

396

397

/**

398

* Find element to the right of the reference element

399

* @param element - Reference element

400

* @return RelativeBy for further chaining

401

*/

402

RelativeBy toRightOf(WebElement element);

403

404

/**

405

* Find element to the right of the located reference element

406

* @param locator - Locator for reference element

407

* @return RelativeBy for further chaining

408

*/

409

RelativeBy toRightOf(By locator);

410

411

/**

412

* Find element near the reference element (within 50 pixels)

413

* @param element - Reference element

414

* @return RelativeBy for further chaining

415

*/

416

RelativeBy near(WebElement element);

417

418

/**

419

* Find element near the located reference element

420

* @param locator - Locator for reference element

421

* @return RelativeBy for further chaining

422

*/

423

RelativeBy near(By locator);

424

}

425

```

426

427

**Usage Examples:**

428

429

```java

430

import static org.openqa.selenium.support.locators.RelativeLocator.with;

431

432

// Find element above another element

433

WebElement passwordField = driver.findElement(with(By.tagName("input"))

434

.above(By.id("login-button")));

435

436

// Find element to the right of another element

437

WebElement submitButton = driver.findElement(with(By.tagName("button"))

438

.toRightOf(By.id("cancel-button")));

439

440

// Find element below and to the right of another element (chaining)

441

WebElement errorMessage = driver.findElement(with(By.className("error"))

442

.below(By.id("email-field"))

443

.toRightOf(By.id("password-field")));

444

445

// Find element near another element

446

WebElement helpIcon = driver.findElement(with(By.className("help-icon"))

447

.near(By.id("complex-field")));

448

449

// Multiple spatial relationships

450

WebElement specificElement = driver.findElement(with(By.tagName("span"))

451

.above(driver.findElement(By.id("footer")))

452

.below(driver.findElement(By.id("header")))

453

.toRightOf(driver.findElement(By.className("sidebar"))));

454

```