CYBERSOFT
Đăng nhập

Selenium WebDriver: kiến trúc, locator, wait và Page Object Model

Chuyên công nghệSeleniumPOMNền tảng
🗓 1 tháng trước19 phút đọc·👁 410 lượt xem👤 489 người đọc

Đi sâu kiến trúc W3C ba tầng, cài đặt Python/Java, tám chiến lược By locator, explicit wait và POM để viết test end-to-end ổn định thay vì hay đỏ.

1. WebDriver là gì và giải quyết bài toán nào

Selenium WebDriver là bộ thư viện điều khiển trình duyệt thật (Chrome, Firefox, Edge, Safari) bằng code, giúp mô phỏng chính xác hành vi người dùng: mở trang, gõ chữ, click, submit form và đọc kết quả trên DOM. Khác với việc kiểm thử thủ công lặp đi lặp lại, WebDriver cho phép một QA viết kịch bản một lần rồi chạy hàng trăm lần trên nhiều trình duyệt. Trong một dự án SaaS quản lý hợp đồng có hơn 300 màn hình, đội kiểm thử không thể click tay mỗi lần release; họ cần một bộ test hồi quy tự động chạy sau mỗi lần merge. WebDriver chính là công cụ nền tảng cho lớp end-to-end đó. Bài viết này đi sâu vào kiến trúc, cách cài đặt, cách định vị phần tử và cách viết test ổn định thay vì test hay đỏ.

  • Điều khiển trình duyệt thật, không phải trình duyệt giả lập
  • Chuẩn hoá qua giao thức W3C nên đa nền tảng
  • Hỗ trợ nhiều ngôn ngữ: Java, Python, C#, JavaScript, Ruby
  • Nền tảng cho hồi quy end-to-end và cross-browser
WebDriver không phải framework kiểm thử. Nó chỉ điều khiển trình duyệt; bạn vẫn cần TestNG, JUnit hoặc pytest để tổ chức test, assertion và báo cáo.

2. Cơ chế bên trong: giao thức W3C WebDriver

Khi bạn gọi driver.findElement(By.id("user")).click() trong code, thực chất binding ngôn ngữ không trực tiếp chạm vào trình duyệt. Nó gửi một HTTP request theo chuẩn W3C WebDriver tới một tiến trình trung gian gọi là browser driver, ví dụ chromedriver cho Chrome hay geckodriver cho Firefox. Driver này là một máy chủ HTTP nhỏ: nó nhận lệnh dạng JSON, dịch sang thao tác gốc của trình duyệt (qua DevTools hoặc API native), rồi trả kết quả về. Mỗi lệnh Selenium tương ứng một endpoint, ví dụ POST /session để mở phiên, POST /session/{id}/element để tìm phần tử, POST /session/{id}/element/{el}/click để click. Hiểu mô hình ba tầng client-driver-browser giúp bạn gỡ lỗi tốt hơn khi test treo hoặc báo lỗi phiên bản driver không khớp trình duyệt.

Selenium WebDriver — kiến trúc client / driver / browser Test code Java / Python binding driver.findElement(...) Browser Driver chromedriver / geckodriver HTTP server nội bộ Browser Chrome / Firefox DOM · render engine W3C JSON HTTP /session DevTools/native Giao thức W3C WebDriver: mỗi lệnh = 1 HTTP request có command + params → driver dịch sang thao tác thật POST /session · POST /session/{id}/element · POST /session/{id}/element/{el}/click
Kiến trúc ba tầng và luồng lệnh W3C

Từ Selenium 4, giao thức W3C là mặc định duy nhất, thay cho JSON Wire Protocol cũ. Điều này loại bỏ nhiều khác biệt hành vi giữa các trình duyệt và mở đường cho tích hợp DevTools như bắt log console hay giả lập vị trí địa lý. Selenium Manager, ra mắt cũng trong dòng 4, tự động tải đúng phiên bản driver khớp với trình duyệt trên máy, nên bạn không còn phải tay tải chromedriver và cập nhật đường dẫn mỗi khi Chrome tự nâng cấp. Đây là một trong những nguyên nhân phổ biến nhất gây gãy pipeline trước đây.

3. Cài đặt và khởi động phiên đầu tiên

Với Python, bạn chỉ cần cài selenium qua pip; từ phiên bản 4.6 trở đi Selenium Manager tự lo phần driver. Đoạn code dưới mở Chrome, truy cập trang đăng nhập, và in tiêu đề. Với Java, bạn thêm dependency selenium-java vào Maven hoặc Gradle. Điểm mấu chốt cho người mới: luôn gọi driver.quit() trong khối finally hoặc teardown để đóng phiên và giải phóng tiến trình driver, nếu không bạn sẽ tích tụ hàng chục tiến trình chromedriver treo trên máy CI và làm cạn RAM.

python
# pip install selenium
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()          # Selenium Manager tự tải driver
try:
    driver.get("https://example.com/login")
    print(driver.title)
    driver.find_element(By.ID, "username").send_keys("qa_user")
    driver.find_element(By.ID, "password").send_keys("secret")
    driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
finally:
    driver.quit()                    # LUÔN đóng phiên
java
// Maven: org.seleniumhq.selenium:selenium-java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class FirstTest {
  public static void main(String[] args) {
    WebDriver driver = new ChromeDriver();      // Selenium Manager resolves driver
    try {
      driver.get("https://example.com/login");
      System.out.println(driver.getTitle());
      driver.findElement(By.id("username")).sendKeys("qa_user");
      driver.findElement(By.id("password")).sendKeys("secret");
      driver.findElement(By.cssSelector("button[type='submit']")).click();
    } finally {
      driver.quit();
    }
  }
}
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 24% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!