Selenium Cơ Bản Cho Người Mới (WebDriver)

Selenium là gì & các thành phần

Selenium là một bộ công cụ mã nguồn mở để tự động hóa trình duyệt web, trong đó Selenium WebDriver là thành phần lõi: nó điều khiển trình duyệt thật (Chrome, Firefox, Edge) bằng code, mô phỏng đúng thao tác của người dùng như mở trang, nhập liệu, click và đọc nội dung màn hình. Nói cách khác, WebDriver là "cánh tay robot" giúp bạn kiểm thử giao diện mà không phải click tay.

Selenium không chỉ có một thứ. Ba mảnh bạn sẽ nghe tới:

Thành phần | Vai trò
Selenium WebDriver | Thư viện điều khiển trình duyệt bằng code — phần bạn dùng nhiều nhất
Selenium IDE | Bản ghi-phát (record & playback) chạy trên trình duyệt, hợp để làm quen nhanh
Selenium Grid | Chạy test song song trên nhiều máy/trình duyệt, dùng cho quy mô lớn

Về kiến trúc, WebDriver hoạt động theo chuỗi: code của bạn (client library) gửi lệnh qua giao thức W3C WebDriver (chuẩn HTTP/JSON) tới browser driver (như ChromeDriver), rồi driver này điều khiển trình duyệt thật. Hiểu chuỗi này giúp bạn đỡ hoảng khi gặp lỗi: thường vấn đề nằm ở khâu driver không khớp phiên bản trình duyệt. Đây cũng là nền tảng để sau này bạn học sâu hơn về khóa Automation Playwright hay so sánh các công cụ.

Cài đặt Selenium WebDriver

Với người mới, tin vui là cài đặt Selenium giờ đơn giản hơn xưa nhiều. Từ Selenium 4.6 trở đi có Selenium Manager tự động tải và ghép đúng browser driver cho bạn — không còn cảnh tay chân tải ChromeDriver rồi thêm vào PATH, cũng không cần thư viện phụ như WebDriverManager thủ công nữa.

Các bước tối thiểu để bắt đầu học selenium bằng Python:

Cài Python 3.8+ và một trình duyệt (ví dụ Chrome).

Cài thư viện Selenium: pip install selenium

Kiểm tra nhanh bằng đoạn code mở trình duyệt (ở mục dưới).

```python

kiem_tra_cai_dat.py

from selenium import webdriver

driver = webdriver.Chrome() # Selenium Manager tự lo driver driver.get("https://itlearn.edu.vn") print(driver.title) driver.quit() ```

Nếu chạy thấy Chrome bật lên rồi in ra tiêu đề trang là bạn đã sẵn sàng. Trường hợp gặp lỗi phiên bản driver, hãy đảm bảo Chrome và thư viện selenium đều được cập nhật — Selenium Manager sẽ tự khớp lại.

Mở trình duyệt & điều hướng

Sau khi cài xong, ba thao tác nền bạn dùng ở mọi bài test là: khởi tạo trình duyệt, điều hướng tới URL, và đóng trình duyệt. Việc quit() ở cuối rất quan trọng — nó đóng trình duyệt và giải phóng tiến trình driver, tránh để lại "rác" chạy ngầm sau mỗi lần test.

```python from selenium import webdriver

driver = webdriver.Chrome() driver.get("https://itlearn.edu.vn/dat-phong") # mở trang print(driver.current_url) # URL hiện tại driver.back() # quay lại driver.refresh() # tải lại driver.quit() # đóng & dọn dẹp ```

Một vài lệnh điều hướng hay dùng: driver.get(url) để mở trang, driver.back() / driver.forward() để đi lại lịch sử, driver.refresh() để tải lại, và driver.maximize_window() để phóng to cửa sổ cho ổn định khi test giao diện. Xong phần "lái xe", giờ tới phần quan trọng nhất: tìm đúng phần tử để thao tác.

Locator (id, css, xpath) & thao tác element

Muốn click hay nhập liệu, trước tiên bạn phải định vị (locate) được phần tử trên trang. Trong Selenium, bạn tìm phần tử qua driver.find_element(By.<chiến lược>, "<giá trị>"). Ba chiến lược locator phổ biến nhất là ID, CSS selector và XPath.

Locator | Ví dụ | Khi nào dùng
By.ID | By.ID, "username" | Nhanh & ổn định nhất, ưu tiên khi phần tử có id
By.CSS_SELECTOR | By.CSS_SELECTOR, "#login-form input[name='email']" | Gọn, mạnh, được khuyến nghị cho đa số trường hợp
By.XPATH | By.XPATH, "//button[text()='Đăng nhập']" | Linh hoạt nhất — tìm theo text, đi ngược cây DOM

Quy tắc tôi hay dặn học viên: ưu tiên By.ID, kế đến By.CSS_SELECTOR, chỉ dùng By.XPATH khi thật cần (ví dụ phải chọn phần tử theo nội dung chữ). Locator càng đơn giản và ít phụ thuộc bố cục thì test càng bền.

Giờ ta ghép lại thành bài test đăng nhập đầu tiên — vẫn dùng bối cảnh quen thuộc trong loạt bài của tôi là hệ thống đặt phòng họp nội bộ. Kịch bản: mở trang đăng nhập, nhập tài khoản, bấm nút, rồi kiểm tra vào được trang chính.

```python from selenium import webdriver from selenium.webdriver.common.by import By

driver = webdriver.Chrome() driver.get("https://itlearn.edu.vn/dat-phong/login")

driver.find_element(By.ID, "username").send_keys("nhanvien_a") driver.find_element(By.ID, "password").send_keys("MatKhau@123") driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()

kiểm tra: sau đăng nhập thấy lời chào trên trang

assert "Xin chào" in driver.page_source driver.quit() ```

send_keys() để nhập liệu, click() để bấm, text để đọc nội dung phần tử — đó là bộ thao tác cơ bản bạn sẽ lặp đi lặp lại. Khi kịch bản phức tạp dần, bạn sẽ muốn gom locator lại một chỗ cho dễ bảo trì; đó là lúc học Page Object Model.

Wait (implicit/explicit) tránh flaky

Đây là bài học "xương máu" của mọi người mới: trang web tải bất đồng bộ, phần tử có thể chưa xuất hiện ngay khi code chạy tới. Nếu không chờ đúng cách, test sẽ flaky — lúc pass lúc fail dù chẳng có lỗi thật. Selenium cho bạn hai kiểu chờ.

Implicit wait đặt một khoảng chờ chung: mỗi lần tìm phần tử, Selenium sẽ thử lại trong tối đa X giây trước khi báo lỗi. Đặt một lần, áp dụng cho cả phiên:

python driver.implicitly_wait(10) # chờ tối đa 10 giây cho mọi find_element

Explicit wait chờ một điều kiện cụ thể xảy ra — chính xác và đáng tin hơn nhiều. Bạn dùng WebDriverWait kết hợp expected_conditions để nói rõ "chờ đến khi nút này bấm được":

python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By

wait = WebDriverWait(driver, 10) nut_dat_phong = wait.until( EC.element_to_be_clickable((By.ID, "btn-dat-phong")) ) nut_dat_phong.click()

Lời khuyên thực dụng: ưu tiên explicit wait cho các bước quan trọng (chờ nút bấm được, chờ thông báo hiện ra), và tránh trộn lẫn implicit với explicit wait vì có thể cộng dồn thời gian chờ khó lường. Tuyệt đối đừng dùng time.sleep() cứng — nó vừa chậm vừa không đáng tin. Xử lý wait tốt là ranh giới giữa một bộ test ổn định và một bộ test "đỏ oan" khiến cả nhóm mất niềm tin.

Selenium vs Playwright (khi nào chọn Selenium)

Người mới hay hỏi tôi: học Selenium hay Playwright? Câu trả lời ngắn: Selenium mạnh ở độ trưởng thành, cộng đồng và độ phủ trình duyệt/ngôn ngữ; Playwright mới hơn, nhanh và có auto-wait tích hợp sẵn nên đỡ flaky hơn khi mới học. Không có lựa chọn "sai", tùy bối cảnh dự án.

Tiêu chí | Selenium | Playwright
Tuổi đời & cộng đồng | Lâu năm, cực nhiều tài liệu/việc làm | Mới hơn, cộng đồng đang lớn nhanh
Ngôn ngữ hỗ trợ | Rất rộng (Java, Python, C#, JS, Ruby…) | Chủ yếu JS/TS, Python, .NET, Java
Cơ chế chờ | Phải tự quản implicit/explicit wait | Auto-wait sẵn, ít flaky hơn
Chuẩn nền | W3C WebDriver | Giao thức riêng qua CDP

Chọn Selenium khi: dự án/đội đã dùng sẵn, cần độ phủ ngôn ngữ rộng, hoặc yêu cầu công việc ghi rõ Selenium (rất phổ biến ở thị trường VN). Còn nếu bắt đầu một dự án mới và ưu tiên tốc độ viết test, Playwright đáng cân nhắc. Muốn xem bảng so sánh đầy đủ cả Cypress, mời bạn đọc Selenium vs Playwright vs Cypress. Dù chọn tool nào, việc chọn đúng ngôn ngữ cho automation cũng ảnh hưởng lớn tới trải nghiệm học của bạn.