1. Kiến thức cơ bản kỹ thuật
Điền và gửi form
Thao tác với form thường được yêu cầu để tự động hóa đăng ký người dùng, điền vào bảng câu hỏi, thu thập dữ liệu và nhiều thứ khác nữa. Khi bạn cần điền hàng trăm form, làm điều đó thủ công cũng giống như cố ăn một quả dưa hấu qua ống hút vậy. Nhưng với sức mạnh của Selenium, chúng ta sẽ hoàn thành trong vài giây.
Hãy cùng bắt đầu tìm hiểu cách chúng ta có thể điền vào trường văn bản và gửi form. Với ví dụ là một form đăng nhập vào trang web, chúng ta sẽ học các bước cơ bản:
from selenium import webdriver
# Cấu hình driver (ví dụ ChromeDriver)
driver = webdriver.Chrome()
try:
# Mở trang web
driver.get("https://example.com/login")
# Tìm trường nhập tên người dùng và nhập văn bản
username_input = driver.find_element_by_name("username")
username_input.send_keys("ten_dang_nhap_cua_toi")
# Tìm trường nhập mật khẩu và nhập văn bản
password_input = driver.find_element_by_name("password")
password_input.send_keys("mat_khau_cua_toi")
# Tìm nút gửi form và nhấn vào
submit_button = driver.find_element_by_name("submit")
submit_button.click()
finally:
# Đóng driver
driver.quit()
Kiểm tra và xử lý lỗi
Không có gì phá hỏng ngày làm việc của lập trình viên hơn những lỗi xuất hiện vào lúc không cần thiết. Vì vậy, xử lý chúng trước. Sử dụng try/except để bắt lỗi và ghi log để tìm hiểu điều gì đã xảy ra.
try:
username_input = driver.find_element_by_name("username")
username_input.send_keys("ten_dang_nhap_cua_toi")
except Exception as e:
print(f"Lỗi khi điền tên người dùng: {e}")
logging.error("Lỗi khi điền tên người dùng", exc_info=True)
2. Ô đánh dấu (Checkboxes)
Bây giờ, khi chúng ta đã biết cách nhấn nút, hãy thử chọn một số tùy chọn từ danh sách. Để đặt hoặc bỏ đánh dấu, chúng ta cũng có thể sử dụng phương pháp click(). Nếu cần kiểm tra xem ô đã được đánh dấu hay chưa, chúng ta sử dụng thuộc tính is_selected().
checkbox = driver.find_element_by_id("checkbox_id")
if not checkbox.is_selected():
checkbox.click()
3. Nút radio (Radio Buttons)
Nút radio cho phép chọn một tùy chọn duy nhất từ nhiều tùy chọn. Làm việc với chúng giống như với ô đánh dấu: chọn tùy chọn với phương pháp click() và kiểm tra trạng thái với is_selected().
radio_button = driver.find_element_by_id("radio_button_id")
if not radio_button.is_selected():
radio_button.click()
4. Danh sách thả xuống (Dropdowns)
Danh sách thả xuống chứa nhiều tùy chọn để lựa chọn. Trong Selenium có lớp Select, cung cấp các phương pháp để làm việc với các danh sách này.
from selenium.webdriver.support.ui import Select
dropdown = Select(driver.find_element_by_id("dropdown_id"))
dropdown.select_by_visible_text("Option 1")
Bạn cũng có thể chọn các tùy chọn với select_by_index() hoặc select_by_value().
5. Trường văn bản (Text Areas)
Trường văn bản giống như trường nhập văn bản, nhưng thường được sử dụng để nhập một lượng lớn văn bản. Làm việc với chúng tương tự như làm việc với trường nhập văn bản.
text_area = driver.find_element_by_id("textarea_id")
text_area.send_keys("Đây là một văn bản mẫu cho trường văn bản.")
6. Lịch (Date Picker)
Trường lịch cho phép người dùng chọn ngày. Nếu đây là một trường văn bản thông thường hỗ trợ định dạng ngày, bạn có thể sử dụng send_keys() để nhập giá trị với định dạng mong muốn.
date_field = driver.find_element_by_id("date_field_id")
date_field.send_keys("2023-12-25") # Định dạng ngày có thể thay đổi tùy theo trang web
Tuy nhiên, một số trường lịch yêu cầu các thao tác bổ sung, như mở lịch pop-up và chọn ngày.
7. Trường tệp (File Upload)
Trường này cho phép tải tệp lên máy chủ. Chúng ta có thể tương tác với nó bằng cách sử dụng phương pháp send_keys(), chỉ ra đường dẫn đến tệp trên máy tính cục bộ.
file_input = driver.find_element_by_id("file_upload_id")
file_input.send_keys("/path/to/file.txt")
8. Trường ẩn (Hidden Fields)
Trường ẩn không hiển thị trên trang nhưng có thể được sử dụng để lưu trữ thông tin cần thiết cho việc gửi form. Bạn chỉ có thể tương tác với chúng nếu bạn có quyền truy cập vào giá trị của chúng (ví dụ: để kiểm tra hoặc thay đổi giá trị).
hidden_field = driver.find_element_by_id("hidden_field_id")
value = hidden_field.get_attribute("value")
print("Giá trị trường ẩn:", value)
9. Kiểm tra thành công hành động
Nhận dữ liệu về việc thực hiện hành động - thước đo thành công của bạn. Sau khi gửi form bạn chắc chẳn muốn đảm bảo rằng yêu cầu đã được chấp nhận thành công, đúng không? Đây là cách làm:
># Kiểm tra đăng nhập thành công trên trang web
if "Chào mừng" in driver.page_source:
print("Đăng nhập thành công!")
else:
print("Có lỗi xảy ra khi đăng nhập.")
10. Vấn đề và giải pháp
Vấn đề
- Sự không ổn định: Các trang web thường xuyên thay đổi. Thay đổi cấu trúc trang có thể dẫn đến lỗi trong script, vì vậy cần kiểm tra mã thường xuyên để đảm bảo nó hiện hành.
- Phụ thuộc vào tốc độ mạng: Thời gian tải trang và các thành phần có thể khác nhau. Sử dụng chờ rõ ràng (explicit waits) để xử lý các trì hoãn.
Giải pháp
- Ghi log: Ghi lại tất cả các hành động để dễ dàng hiểu rõ vấn đề. Sử dụng thư viện
loggingđể ghi log sẽ giúp việc này dễ dàng hơn rất nhiều. - Mô-đun hóa mã: Phân chia các tác vụ phức tạp thành các hàm và mô-đun để dễ dàng thay đổi và kiểm tra.
GO TO FULL VERSION