PracticeQAAutomation logoPracticeQAAutomation
Se

Java ยท TestNG

Element handling with Selenium

23 copy-ready Selenium recipes in Java, Python, C# (.NET), JavaScript and TypeScript, each linked to a live challenge page to run them against.

Language
Conventions ยท Java
// Helpers used below (plus static imports of ExpectedConditions.* and org.testng.Assert.*):
By tid(String id) { return By.cssSelector("[data-testid='" + id + "']"); }
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

1Type into inputs & read output

Practice on /elements/text-box โ†’
Java
driver.findElement(tid("full-name-input")).sendKeys("Ada Lovelace");
driver.findElement(tid("submit-text-box")).click();
assertEquals(wait.until(visibilityOfElementLocated(tid("output-name"))).getText(),
    "Name: Ada Lovelace");
Java
driver.findElement(tid("checkbox-select-all")).click();
assertTrue(driver.findElement(tid("checkbox-documents")).isSelected());
Java
new Select(driver.findElement(tid("native-select"))).selectByVisibleText("Mumbai");
assertEquals(driver.findElement(tid("native-select-result")).getText(), "Selected: Mumbai");
Java
driver.findElement(tid("autocomplete-input")).sendKeys("Ben");
wait.until(elementToBeClickable(tid("autocomplete-option-bengaluru"))).click();
assertEquals(driver.findElement(tid("autocomplete-result")).getText(), "Picked: Bengaluru");

5Find a table row by its text

Practice on /elements/web-tables โ†’
Java
driver.findElement(By.xpath(
    "//tr[@data-testid='table-row'][contains(., 'Priya')]"
  + "//*[starts-with(@data-testid, 'delete-row-')]")).click();
assertEquals(driver.findElements(tid("table-row")).size(), 2);

6Double-click & right-click

Practice on /elements/buttons โ†’
Java
Actions actions = new Actions(driver);
actions.doubleClick(driver.findElement(tid("double-click-me"))).perform();
actions.contextClick(driver.findElement(tid("right-click-me"))).perform();
assertTrue(driver.findElement(tid("right-click-result")).isDisplayed());

7JS alert, confirm & prompt

Practice on /alerts โ†’
Java
driver.findElement(tid("prompt-button")).click();
Alert prompt = wait.until(alertIsPresent());
prompt.sendKeys("Ada");
prompt.accept();
assertEquals(driver.findElement(tid("prompt-result")).getText(), "You entered Ada");

driver.findElement(tid("confirm-button")).click();
wait.until(alertIsPresent()).dismiss();

8Iframes & nested iframes

Practice on /frames โ†’
Java
driver.switchTo().frame(driver.findElement(tid("single-frame")));
driver.findElement(tid("single-frame-button")).click();
assertEquals(driver.findElement(tid("single-frame-result")).getText(), "Clicked inside iframe");
driver.switchTo().defaultContent();

driver.switchTo().frame(driver.findElement(tid("outer-frame")))
      .switchTo().frame(driver.findElement(tid("innermost-frame")));

9New tabs & windows

Practice on /windows โ†’
Java
String original = driver.getWindowHandle();
driver.findElement(tid("new-tab-button")).click();
wait.until(numberOfWindowsToBe(2));
for (String h : driver.getWindowHandles())
  if (!h.equals(original)) driver.switchTo().window(h);
assertTrue(wait.until(visibilityOfElementLocated(tid("new-tab-heading"))).isDisplayed());
Java
// Actions.dragAndDrop can't fire HTML5 drag events in Chrome โ€” dispatch them with JS.
((JavascriptExecutor) driver).executeScript(
    "const [s, t] = arguments, dt = new DataTransfer();"
  + "s.dispatchEvent(new DragEvent('dragstart', {bubbles: true, dataTransfer: dt}));"
  + "t.dispatchEvent(new DragEvent('drop', {bubbles: true, dataTransfer: dt}));",
    driver.findElement(tid("draggable-box")), driver.findElement(tid("accept-zone")));
Java
String path = new java.io.File("src/test/resources/sample.txt").getAbsolutePath();
driver.findElement(tid("file-input")).sendKeys(path);
assertTrue(driver.findElement(tid("uploaded-file-info")).getText().contains("sample.txt"));
Java
new Actions(driver).moveToElement(driver.findElement(tid("tooltip-trigger"))).perform();
wait.until(visibilityOfElementLocated(tid("tooltip")));

13Wait for dynamically loaded content

Practice on /dynamic/dynamic-loading โ†’
Java
driver.findElement(tid("loading-1-start")).click();
WebElement result = wait.until(visibilityOfElementLocated(tid("loading-1-result")));
assertTrue(result.getText().contains("Hello World!"));
Java
SearchContext root = driver.findElement(By.cssSelector("shadow-counter")).getShadowRoot();
root.findElement(By.cssSelector("#inc")).click();
assertEquals(root.findElement(By.cssSelector("#count")).getText(), "Count: 1");

15Nested & closed shadow roots

Practice on /shadow-dom โ†’
Java
SearchContext outer = driver.findElement(tid("nested-outer-host")).getShadowRoot();
SearchContext inner = outer.findElement(By.cssSelector("qa-nested-inner")).getShadowRoot();
inner.findElement(By.cssSelector("[data-testid='nested-input']")).sendKeys("Ada");
inner.findElement(By.cssSelector("[data-testid='nested-submit']")).click();

// Closed root: getShadowRoot() fails โ€” use the keyboard instead.
WebElement host = driver.findElement(tid("closed-host"));
host.click();
new Actions(driver).sendKeys("Ada").sendKeys(Keys.TAB).sendKeys(Keys.ENTER).perform();
wait.until(attributeToBe(host, "data-result", "Hello, Ada!"));

16Shadow DOM inside an iframe

Practice on /shadow-dom โ†’
Java
driver.switchTo().frame(driver.findElement(tid("shadow-in-iframe")));
SearchContext outer = driver.findElement(By.cssSelector("frame-shadow")).getShadowRoot();
SearchContext inner = outer.findElement(By.cssSelector("frame-shadow-inner")).getShadowRoot();
inner.findElement(By.cssSelector("[data-testid='frame-nested-input']")).sendKeys("Ada");
inner.findElement(By.cssSelector("[data-testid='frame-nested-submit']")).click();
driver.switchTo().defaultContent();

17Cross-origin iframe

Practice on /frames โ†’
Java
// WebDriver can switch into cross-origin frames.
driver.switchTo().frame(driver.findElement(tid("cross-origin-frame")));
driver.findElement(tid("xorigin-input")).sendKeys("Ada");
driver.findElement(tid("xorigin-submit")).click();
assertEquals(driver.findElement(tid("xorigin-result")).getText(), "Hello, Ada!");
driver.switchTo().defaultContent();

18Element covered by an overlay

Practice on /elements/hidden-elements โ†’
Java
// click() throws ElementClickInterceptedException while the overlay is there.
driver.findElement(tid("remove-overlay")).click();
wait.until(invisibilityOfElementLocated(tid("click-overlay")));
driver.findElement(tid("covered-button")).click();
assertTrue(driver.findElement(tid("covered-result")).isDisplayed());

19Tick a table row by another cell's text

Practice on /elements/web-tables โ†’
Java
// XPath axes: from the name cell back to the checkbox cell in the same row.
driver.findElement(By.xpath(
    "//td[normalize-space()='Farah Siddiqui']/preceding-sibling::td/input[@type='checkbox']")).click();
assertTrue(driver.findElement(tid("selected-users")).getText().contains("EMP-1043"));

20Verify a column sorts correctly (numbers, not text)

Practice on /elements/web-tables โ†’
Java
driver.findElement(tid("sort-amount")).click();
assertEquals(driver.findElement(tid("sort-th-amount")).getAttribute("aria-sort"), "ascending");
List<Double> nums = driver.findElements(By.cssSelector("[data-testid='sort-row'] [data-col='amount']")).stream()
    .map(WebElement::getText).filter(t -> !t.equals("โ€”"))
    .map(t -> Double.parseDouble(t.replaceAll("[^\\d.]", ""))).toList();
List<Double> sorted = new ArrayList<>(nums);
Collections.sort(sorted);
assertEquals(nums, sorted);

21normalize-space(), pseudo-elements & DOM comments

Practice on /elements/xpath-functions โ†’
Java
driver.findElement(By.xpath("//label[normalize-space()='Delivery Address']/following::input[1]"))
    .sendKeys("12 MG Road");

JavascriptExecutor js = (JavascriptExecutor) driver;
String before = (String) js.executeScript(
    "return getComputedStyle(arguments[0], '::before').content;", driver.findElement(tid("pseudo-price")));
assertTrue(before.contains("โ‚น"));

// findElement can't return comment nodes โ€” read them with JavaScript.
String code = ((String) js.executeScript("return document.evaluate(arguments[0], document, null, "
    + "XPathResult.STRING_TYPE, null).stringValue;",
    "//span[@data-testid='comment-target']/following-sibling::comment()")).trim();
assertEquals(code, "secret-code: QA-2026");
Java
By row = By.cssSelector("[data-order-id='ORD-1042']");
while (driver.findElements(row).isEmpty()) {
  WebElement next = driver.findElement(tid("orders-next"));
  if (!next.isEnabled()) throw new AssertionError("ORD-1042 not found on any page");
  next.click();
}
assertTrue(driver.findElement(row).isDisplayed());
Java
driver.findElement(tid("key-input")).sendKeys(Keys.ENTER);
assertEquals(driver.findElement(tid("key-result")).getText(), "You entered: Enter");

Practicing another tool?