Giới thiệu Selenium và WebDriver
Selenium là một framework tự động hóa trình duyệt, trong đó WebDriver là thành phần cốt lõi, chuyển đổi các kịch bản tự động hóa thành lệnh điều khiển trình duyệt. Luồng hoạt động tiêu chuẩn bao gồm:
- Mở trang web
- Xác định các phần tử trên trang (liên kết, nút, hộp nhập liệu, v.v.)
- Thao tác với các phần tử trang (nhấp, nhập)
- Xác định và thao tác với phần tử trang tiếp theo
Nguyên lý hoạt động của WebDriver
WebDriver sẽ khởi động một dịch vụ WebService tại địa phương và gắn với một cổng động. Khi kịch bản chạy, Selenium gửi yêu cầu đến dịch vụ WebDriver, sau đó thông qua các trình điều khiển trình duyệt khác nhau, chuyển đổi thành lệnh trình duyệt.
Các thao tác cơ bản trên trình duyệt
- Phương thức
- get(): Mở trang web
- forward(): Tiến tới
- back(): Quay lại
- refresh(): Làm mới trang
- maximize_window(): Phóng to cửa sổ
- set_window_size(): Đặt kích thước cửa sổ
- close(): Đóng trang hiện tại
- quit(): Thoát trình duyệt
- Thuộc tính
- title: Tiêu đề
- current_url: URL hiện tại
- page_source: Mã nguồn trang web
Ví dụ thực tế:
from selenium import webdriver
from time import sleep
# Khởi tạo trình duyệt Chrome
trinh_duyet = webdriver.Chrome()
# trinh_duyet = webdriver.Firefox() # Khởi tạo Firefox
# trinh_duyet = webdriver.Edge() # Khởi tạo Edge
# trinh_duyet = webdriver.Ie() # Khởi tạo Internet Explorer
trinh_duyet.get("http://www.google.com") # Mở trang web
trinh_duyet.maximize_window() # Phóng to cửa sổ
print(trinh_duyet.title) # In tiêu đề trang hiện tại
print(trinh_duyet.current_url) # In URL hiện tại
print(trinh_duyet.page_source) # In mã nguồn trang web
sleep(1)
trinh_duyet.get("http://example.com/control.html")
sleep(1)
trinh_duyet.back() # Quay lại
sleep(1)
trinh_duyet.forward() # Tiến tới
trinh_duyet.refresh() # Làm mới
sleep(3)
trinh_duyet.quit() # Thoát trình duyệt
Xác định phần tử trang
8 phương thức xác định cơ bản
- Xác định theo id: find_element_by_id()
- Xác định theo name: find_element_by_name()
- Xác định theo class: find_element_by_class_name()
- Xác định theo tag: find_element_by_tag_name()
- Xác định theo link: find_element_by_link_text()
- Xác định theo link một phần: find_element_by_partial_link_text()
- Xác định theo xpath: find_element_by_xpath()
- Xác định theo css: find_element_by_css_selector()
Ví dụ thực tế:
from selenium import webdriver
from time import sleep
trinh_duyet = webdriver.Chrome()
trinh_duyet.maximize_window()
trinh_duyet.get("http://example.com/control.html")
trinh_duyet.find_element_by_id("tai_khoan").send_keys("xin_chao")
trinh_duyet.find_element_by_name("mat_khau").send_keys("123456")
trinh_duyet.find_element_by_class_name("ten_hoc_sinh").send_keys("lop_hoc")
the_div = trinh_duyet.find_element_by_tag_name("div") # Không khuyến khích vì có thể trùng lặp
print(the_div.get_attribute("id"))
lien_ket = trinh_duyet.find_element_by_link_text("Đi đến trang chủ Google")
print(lien_ket.text)
lien_ket.click()
sleep(1)
trinh_duyet.back()
trinh_duyet.find_element_by_partial_link_text("trang chủ").click()
trinh_duyet.back()
nhan2 = trinh_duyet.find_element_by_xpath('/html/body/div[4]/label[2]')
print(nhan2.text)
mua_he = trinh_duyet.find_element_by_xpath('//input[@id="u"][@value="mua_he"]')
mua_he.click()
trinh_duyet.find_element_by_css_selector('#input > input').send_keys("1111")
trinh_duyet.find_element_by_css_selector("#tai_khoan").send_keys("Tran Van A")
Bổ sung: Sử dụng By để xác định phần tử:
- find_element(By.ID,"")
- find_element(By.NAME, "")
- find_element(By.CLASS_NAME, "")
- find_element(By.TAG_NAME, "")
- find_element(By.LINK_TEXT, "")
- find_element(By.PARTIAL_LINK_TEXT, "")
- find_element(By.XPATH, "")
- find_element(By.CSS_SELECTOR, "")
Xác định nhiều phần tử cùng lúc
Khi các phần tử có cùng id/name/class_name/tag_name, có thể xác định tất cả các phần tử, sau đó lấy phần tử cụ thể theo thứ tự. Sử dụng `find_elements_by_***`, lưu ý rằng `find_elements` trả về danh sách.
from selenium import webdriver
from time import sleep
trinh_duyet = webdriver.Chrome()
trinh_duyet.maximize_window()
trinh_duyet.get("http://example.com/control.html")
ds = trinh_duyet.find_elements_by_id("u")
for i in ds:
i.click()
ds[2].click()
nhan = trinh_duyet.find_elements_by_tag_name("label")
print(nhan[2].text)
Xác định phân cấp
Khi một phần tử khó xác định, có thể xác định phần tử cha/dựng trước, sau đó sử dụng phần tử cha/dựng để tiếp tục xác định.
from selenium import webdriver
from time import sleep
trinh_duyet = webdriver.Chrome()
trinh_duyet.maximize_window()
trinh_duyet.get("http://example.com/control.html")
cha_div = trinh_duyet.find_element_by_class_name("cha_div") # Xác định phần tử cha trước
nhan = cha_div.find_elements_by_tag_name("label") # Sử dụng phần tử cha để xác định xuống
print(nhan[2].text)
Thao tác với phần tử trang
- Liên kết
- click()
- Hộp nhập liệu
- send_keys(): Nhập
- clear(): Xóa nội dung
- get_attribute("value"): Lấy giá trị
- Nút bấm
- click(): Nhấp
- isEnabled(): Kiểm tra có khả dụng không
- submit(): Dùng cho nút type=submit
- Radio/checkbox
- click(): Nhấp trực tiếp
- is_displayed(): Kiểm tra có hiển thị không
- is_selected(): Kiểm tra trạng thái đã chọn
- Dropdown (cần dùng Select)
- select_by_index(): Chọn theo chỉ mục
- select_by_value(): Chọn theo giá trị
- select_by_visible_text(): Chọn theo tên hiển thị
Ví dụ thực tế:
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import Select
trinh_duyet = webdriver.Chrome()
trinh_duyet.maximize_window()
trinh_duyet.get("http://example.com/control.html")
vung = Select(trinh_duyet.find_element_by_id("vungID"))
vung.select_by_visible_text("Thành phố Hồ Chí Minh")
sleep(1)
vung.select_by_index(1)
sleep(1)
vung.select_by_value("2")