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

> Nếu bạn vừa vững nền tảng manual và muốn bước chân vào automation, thì selenium cơ bản gần như luôn là ga đầu tiên. 🙂 Đây là công cụ tôi hay chọn để mở đầu cho học viên, vì nó dạy bạn đúng cái cốt lõi: điều khiển trình duyệt bằng code. Bài này tôi sẽ đi từ Selenium là gì, cài đặt, viết bài test đăng nhập đầu tiên, cho tới cách xử lý wait để test đỡ "đỏ oan". Toàn bộ ví dụ dùng Python cho ngắn gọn, nhưng tư duy áp dụng được cho mọi ngôn ngữ.

- **URL canonical**: https://itlearn.vn/blog/selenium-co-ban
- **Published**: 2026-07-19T11:00:00+07:00
- **Modified**: 2026-08-24T07:22:09+07:00
- **Author**: Anh Tuấn
- **Category**: Automation test (https://itlearn.vn/blog/cat/automation-test)
- **Reading time**: 11 phút
- **Source site**: IT LEARN — Học viện Software Testing tiếng Việt

---

## 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](/playwright.html) 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](/blog/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](/blog/selenium-vs-playwright-vs-cypress). Dù chọn tool nào, việc chọn đúng [ngôn ngữ cho automation](/blog/ngon-ngu-automation) cũng ảnh hưởng lớn tới trải nghiệm học của bạn.

## Câu hỏi thường gặp

### Selenium là gì?

Selenium là bộ công cụ mã nguồn mở để tự động hóa trình duyệt web. Thành phần lõi là Selenium WebDriver — thư viện điều khiển trình duyệt thật bằng code, mô phỏng thao tác người dùng như mở trang, nhập liệu, click. Ngoài ra còn có Selenium IDE (record & playback) và Selenium Grid (chạy test song song trên nhiều máy).

### Selenium dùng ngôn ngữ nào?

Selenium hỗ trợ nhiều ngôn ngữ lập trình: Java, Python, C#, JavaScript và Ruby là phổ biến nhất. Bạn viết cùng một tư duy WebDriver cho mọi ngôn ngữ, chỉ khác cú pháp. Ở Việt Nam, Java và Python được dùng nhiều nhất; người mới thường chọn Python vì cú pháp ngắn gọn, dễ đọc khi bắt đầu học selenium.

### XPath và CSS selector khác gì?

CSS selector gọn, nhanh và được khuyến nghị cho đa số trường hợp định vị phần tử. XPath linh hoạt hơn: nó tìm được phần tử theo nội dung chữ và đi ngược lên cây DOM (chọn phần tử cha), điều CSS không làm được. Nguyên tắc chung là ưu tiên ID, rồi CSS, và chỉ dùng XPath khi thật sự cần.

### Flaky test là gì?

Flaky test là bài test lúc pass lúc fail dù mã nguồn không đổi, thường do trang tải bất đồng bộ khiến phần tử chưa xuất hiện kịp lúc code chạy tới. Nguyên nhân phổ biến nhất là xử lý wait chưa đúng. Dùng explicit wait (WebDriverWait và expected_conditions) thay cho time.sleep giúp giảm mạnh tình trạng này.

### Selenium có lỗi thời không?

Không. Selenium vẫn được cập nhật đều (bản 4.x theo chuẩn W3C WebDriver, có Selenium Manager tự lo driver) và tiếp tục là kỹ năng được yêu cầu nhiều trong tin tuyển dụng tester tại Việt Nam. Playwright hay Cypress là lựa chọn thay thế hiện đại, nhưng chúng bổ sung chứ chưa thay thế hoàn toàn Selenium. Tóm lại, nắm vững selenium cơ bản — kiến trúc WebDriver, locator và wait — là bước đệm chắc chắn nhất để vào nghề automation. Khi đã quen tay, bạn có thể tiến xa hơn với [khóa Automation Playwright](/playwright.html) của IT LEARN để mở rộng bộ kỹ năng của mình.

