Cài đặt Môi trường
Selenium là một framework mạnh mẽ dành cho việc kiểm thử tự động và mô phỏng hành vi người dùng trên trình duyệt. Ngoài mục đích kiểm thử, nó còn được ứng dụng phổ biến trong việc thu thập dữ liệu (scraping) và tự động hóa các tác vụ trên nền web.
Để bắt đầu, bạn cần cài đặt thư viện Selenium thông qua trình quản lý gói pip:
pip install selenium
Bên cạnh đó, Selenium yêu cầu một WebDriver tương ứng với trình duyệt bạn muốn điều khiển (như ChromeDriver cho Google Chrome, GeckoDriver cho Firefox). Bạn cần tải trình điều khiển phù hợp và đảm bảo file thực thi nằm trong biến môi trường PATH của hệ thống, hoặc sử dụng thư viện webdriver-manager để quản lý tự động.
Khởi tạo Trình duyệt và Điều hướng
Đoạn mã dưới đây minh họa cách khởi tạo một phiên làm việc với trình duyệt Chrome, truy cập vào một địa chỉ web và sau đó đóng trình duyệt:
from selenium import webdriver
# Khởi tạo phiên làm việc Chrome
browser = webdriver.Chrome()
# Điều hướng đến trang web mục tiêu
browser.get("https://www.demo-site.org")
# Đóng trình duyệt và giải phóng tài nguyên
browser.quit()
Tìm kiếm và Tương tác với Phần tử DOM
Việc tương tác với trang web phụ thuộc vào khả năng định vị các phần tử HTML. Selenium cung cấp nhiều chiến lược định vị như ID, Class, CSS Selector hay XPath. Cú pháp hiện đại sử dụng lớp By để chỉ định phương thức tìm kiếm:
from selenium.webdriver.common.by import By
# Định vị qua ID
login_btn = browser.find_element(By.ID, "submit-btn")
# Định vị qua Class Name
nav_item = browser.find_element(By.CLASS_NAME, "menu-link")
# Định vị qua Tag Name
paragraph = browser.find_element(By.TAG_NAME, "p")
# Định vị qua XPath
card_element = browser.find_element(By.XPATH, "//div[contains(@class, 'item')]")
Sau khi đã xác định được phần tử, bạn có thể thực hiện các hành động như nhấp chuột, nhập liệu hoặc trích xuất văn bản:
# Nhấp vào nút
login_btn.click()
# Gõ văn bản vào ô nhập liệu
search_box = browser.find_element(By.NAME, "q")
search_box.send_keys("Tìm kiếm tự động")
# Lấy nội dung text của phần tử
content = paragraph.text
Xử lý Biểu mẫu (Forms)
Selenium hỗ trợ đầy đủ các thao tác với các thành phần form như ô văn bản, nút radio, checkbox và danh sách thả xuống (dropdown):
from selenium.webdriver.support.ui import Select
# Nhập liệu vào ô text
email_field = browser.find_element(By.NAME, "email")
email_field.send_keys("user@mail.com")
# Chọn nút radio
gender_radio = browser.find_element(By.CSS_SELECTOR, "input[value='male']")
gender_radio.click()
# Tích vào checkbox
terms_check = browser.find_element(By.ID, "terms-accept")
terms_check.click()
# Lựa chọn tùy chọn trong thẻ select
country_dropdown = Select(browser.find_element(By.ID, "country-select"))
country_dropdown.select_by_value("VN")
Thực thi Mã JavaScript
Trong một số trường hợp, bạn cần tương tác sâu hơn với DOM hoặc kích hoạt các hàm JavaScript có sẵn trên trang. Selenium cho phép bạn chạy trực tiếp các đoạn script JS:
# Cuộn trang xuống cuối cùng
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
Quản lý Cửa sổ và Tab
Khi thao tác mở ra các tab hoặc cửa sổ mới, bạn cần chuyển đổi ngữ cảnh để tiếp tục tương tác trên chúng:
# Lấy ID của tab hiện tại
main_tab = browser.current_window_handle
# Lấy danh sách tất cả các tab đang mở
opened_tabs = browser.window_handles
# Chuyển đổi sang tab mới nhất
for tab in opened_tabs:
if tab != main_tab:
browser.switch_to.window(tab)
break
Chiến lược Chờ đợi (Waits)
Để đảm bảo các phần tử đã được tải hoàn tất trước khi tương tác, việc sử dụng cơ chế chờ là bắt buộc. Có hai loại chính: chờ ngầm định (Implicit Wait) và chờ rõ ràng (Explicit Wait):
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as cond
# Chờ ngầm định: Thiết lập thời gian chờ tối đa cho mọi lần tìm kiếm
browser.implicitly_wait(5)
# Chờ rõ ràng: Chờ cho đến khi một điều kiện cụ biệt được thỏa mãn
waiter = WebDriverWait(browser, 15)
dynamic_element = waiter.until(
cond.visibility_of_element_located((By.CSS_SELECTOR, ".loaded-content"))
)
Điều hướng Trình duyệt
Bạn có thể dễ dàng mô phỏng các nút điều hướng cơ bản của trình duyệt:
browser.back() # Quay lại trang trước
browser.forward() # Tiến tới trang kế tiếp
browser.refresh() # Tải lại trang hiện tại
Xử lý Hộp thoại Cảnh báo (Alerts)
Đối với các popup alert mặc định của trình duyệt, bạn cần chuyển đổi ngữ cảnh sang alert trước khi thao tác:
# Chuyển đến hộp thoại cảnh báo
popup = browser.switch_to.alert
# Đọc nội dung cảnh báo
popup_msg = popup.text
# Xác nhận (tương đương nhấn OK)
popup.accept()
# Hoặc hủy bỏ (tương đương nhấn Cancel)
# popup.dismiss()
Ví dụ Ứng dụng Thực tế
Dưới đây là một kịch bản hoàn chỉnh mô phỏng quá trình tự động đăng nhập vào một hệ thống, bao gồm chờ đợi phản hồi sau khi xác thực:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as cond
# Khởi động trình duyệt
browser = webdriver.Chrome()
# Mở trang đăng nhập
browser.get("https://www.demo-site.org/auth/signin")
# Điền thông tin xác thực
user_input = browser.find_element(By.NAME, "account")
pass_input = browser.find_element(By.NAME, "secret")
user_input.send_keys("admin_demo")
pass_input.send_keys("secure_pass_123")
# Nhấn nút submit
submit_btn = browser.find_element(By.CSS_SELECTOR, "button[type='submit']")
submit_btn.click()
# Sử dụng Explicit Wait chờ điều hướng đến trang Dashboard thành công
waiter = WebDriverWait(browser, 10)
waiter.until(cond.url_contains("/dashboard"))
# Tiếp tục thực hiện các tác vụ khác trên trang dashboard...
# Đóng phiên làm việc
browser.quit()