Get all values dropdown selenium - lấy các giá trị của dropdown

Bài viết này cập nhật các kỹ thuật mới nhất để lấy danh sách giá trị từ Dropdown list, tối ưu hóa code với Java Streams và xử lý các loại dropdown phức tạp (Custom Dropdown) thường gặp trong năm 2026.

Phân loại Dropdown:
Trước khi code, bạn cần Inspect (F12) để xem dropdown thuộc loại nào:
  • Standard Dropdown: Dùng thẻ <select><option>.
  • Custom Dropdown: Dùng các thẻ <div>, <ul>, <li> kết hợp CSS/JS (React, Angular, Vue...).

1. Đối với Standard Dropdown (<select>)

Thay vì dùng vòng lặp for truyền thống, chúng ta sử dụng Java Streams API để code gọn gàng chỉ trong 1 dòng.

import org.openqa.selenium.support.ui.Select;
import java.util.List;
import java.util.stream.Collectors;

public List<String> getSelectDropdownValues(WebElement dropdownElement) {
    Select select = new Select(dropdownElement);
    
    // Cách 2026: Sử dụng Stream để map WebElement -> String
    return select.getOptions().stream()
            .map(WebElement::getText)
            .collect(Collectors.toList());
}

2. Đối với Custom Dropdown (Div/Ul/Li)

Loại này phổ biến hơn ở các UI hiện đại. Quy trình chuẩn:

  1. Click vào dropdown để mở danh sách.
  2. Chờ (Wait) cho các item hiển thị.
  3. Dùng findElements để lấy list item.
  4. Lấy text.
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;
import java.util.List;
import java.util.stream.Collectors;

public List<String> getCustomDropdownValues(WebDriver driver) {
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

    // 1. Mở Dropdown
    WebElement dropdownTrigger = driver.findElement(By.cssSelector(".dropdown-trigger"));
    dropdownTrigger.click();

    // 2. Chờ list option hiển thị (Quan trọng!)
    By itemLocator = By.cssSelector(".dropdown-menu .item");
    wait.until(ExpectedConditions.visibilityOfElementLocated(itemLocator));

    // 3. Lấy tất cả elements
    List<WebElement> options = driver.findElements(itemLocator);

    // 4. Convert sang List String bằng Stream
    return options.stream()
            .map(e -> e.getText().trim()) // Trim để loại bỏ khoảng trắng thừa
            .filter(text -> !text.isEmpty()) // Lọc bỏ các dòng rỗng nếu có
            .collect(Collectors.toList());
}

3. Lưu ý quan trọng (Best Practices)

  • StaleElementReferenceException: Nếu dropdown bị reload lại DOM khi scroll hoặc filter, hãy lấy lại list element trước khi get text.
  • Hidden Elements: Đôi khi dropdown chứa các option ẩn, hãy dùng hàm getAttribute("textContent") thay vì getText() nếu muốn lấy cả text ẩn.
  • Performance: Với các dropdown lớn (>1000 items), hạn chế in log (System.out.println) trong vòng lặp.

Hy vọng với cách xử lý mới này, code của bạn sẽ trở nên chuyên nghiệp và tối ưu hơn!

0 comments:

Post a Comment