Selenium là một khung kiểm thử tự động hóa trình duyệt, dựa trên giao thức WebDriver. Về bản chất:
- WebDriver là một bộ tiêu chuẩn giao diện, sử dụng giao diện HTTP RESTful tiêu chuẩn và định dạng JSON để truyền dữ liệu.
- ChromeDriver là một bộ dịch trình điều khiển cho trình duyệt Chrome thực thi tiêu chuẩn này.
- Selenium về cơ bản là một lớp bao bọc (wrapper) cho các thao tác giao diện
Giới thiệu về WebDriver
WebDriver không phải là một thư viện độc lập mà là một giao thức cho phép các ngôn ngữ lập trình điều khiển trình duyệt. Giao thức này sử dụng HTTP để gửi các lệnh và nhận phản hồi.
Khởi động dịch vụ WebDriver
Nếu ChromeDriver đã được đặt trong đường dẫn biến môi trường, bạn có thể khởi động dịch vụ bằng cách gõ lệnh chromedriver trong dòng lệnh:
$ chromedriver
Starting ChromeDriver 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f143-refs/branch-heads/3945@{#614}) on port 9515
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
Mặc định, dịch vụ chạy trên cổng 9515 với địa chỉ giao tiếp là: http://127.0.0.1:9515
Sử dụng Postman để điều khiển trình duyệt
Tạo phiên làm việc mới (New Session)
Giao thức WebDriver thường sử dụng yêu cầu POST với dữ liệu ở định dạng JSON. Để tạo phiên làm việc mới, chúng ta gửi yêu cầu đến endpoint sau:
POST http://127.0.0.1:9515/session
{
"capabilities": {"browserName": "chrome"}
}
Phản hồi sẽ chứa một sessionId, ví dụ: 06e32bb38efb7e182bd20dc5c975d3ae, đại diện cho phiên làm việc trình duyệt.
Mở một trang web cụ thể
POST http://127.0.0.1:9515/session/06e32bb38efb7e182bd20dc5c975d3ae/url
{"url": "https://www.baidu.com/"}
Phóng to cửa sổ trình duyệt
POST http://127.0.0.1:9515/session/06e32bb38efb7e182bd20dc5c975d3ae/window/maximize
{}
Định vị phần tử (Element Location)
POST http://127.0.0.1:9515/session/06e32bb38efb7e182bd20dc5c975d3ae/element
{"using": "css selector", "value": "#kw"}
Giao thức hỗ trợ 5 phương pháp định vị:
- "css selector"
- "tag name"
- "xpath"
- "link text"
- "partial link text"
Trong Selenium, các phương thức find_element_by_id(), find_element_by_name() và find_element_by_class_name() thực chất đều sử dụng css selector.
- id="kw": tương đương css selector "#kw"
- class_name="card": tương đương css selector ".card"
- name="info": tương đương css selector "[name=info]"
Sau khi thực thi, phản hồi sẽ trả về elementId, ví dụ: eef207e2-59c1-429d-9425-f1fd2da93c35, đại diện cho phần tử.
Thao tác với phần tử
Để nhập văn bản vào phần tử:
POST http://127.0.0.1:9515/session/06e32bb38efb7e182bd20dc5c975d3ae/element/eef207e2-59c1-429d-9425-f1fd2da93c35/value
{"text": "大赢家"}
Lưu ý: sessionId đi sau session/, elementId đi sau element/.
Kết thúc phiên làm việc
DELETE http://127.0.0.1:9515/session/06e32bb38efb7e182bd20dc5c975d3ae
{}
Tự động hóa trình duyệt bằng thư viện requests
- Khởi động ChromeDriver thủ công
- Viết script tự động hóa như sau:
import requests
# Tạo phiên làm việc mới
response = requests.post('http://127.0.0.1:9515/session',
json={"capabilities": {"browserName": "chrome"}})
session_data = response.json()
session_id = session_data.get('value').get('sessionId')
# Mở trang Baidu
requests.post(f'http://127.0.0.1:9515/session/{session_id}/url',
json={"url": "https://www.baidu.com/"})
# Phóng to cửa sổ
requests.post(f'http://127.0.0.1:9515/session/{session_id}/window/maximize',
json={})
# Định vị ô tìm kiếm
element_response = requests.post(f'http://127.0.0.1:9515/session/{session_id}/element',
json={"using": "css selector", "value": "#kw"}).json()
element_id = list(element_response.get('value').values())[0]
# Nhập văn bản
requests.post(f'http://127.0.0.1:9515/session/{session_id}/element/{element_id}/value',
json={"text": "大赢家"})
# Đóng trình duyệt
requests.delete(f'http://127.0.0.1:9515/session/{session_id}',
json={})
Lợi ích của việc sử dụng trực tiếp API WebDriver
- Giảm sự phụ thuộc vào thư viện Selenium
- Tăng khả năng tùy biến các thao trình tự động hóa
- Có thể tích hợp dễ dàng với các công cụ khác
- Giảm kích thước dự án vì không cần cài đặt Selenium
- Hiểu rõ hơn về cơ chế hoạt động của WebDriver