1. Cơ bản về tìm kiếm phần tử trên trang
Sử dụng các phương pháp tìm kiếm phần tử
Khi bạn bắt đầu sử dụng Selenium trong các dự án thực tế, một trong những nhiệm vụ đầu tiên sẽ là tìm kiếm các phần tử trên trang. Điều này có thể được so sánh với việc tìm nút bấm thang máy trong khách sạn: bạn cần biết nó nằm ở đâu để nhấn và đến tầng cần thiết.
Selenium cung cấp một số phương pháp để tìm kiếm phần tử. Tùy thuộc vào sở thích của bạn, bạn có thể sử dụng find_element_by_id
, find_element_by_name
, find_element_by_xpath
, find_element_by_css_selector
, v.v. Hãy nhớ lại những gì bạn đã biết - và viết một ví dụ đơn giản:
from selenium import webdriver
# Tạo một instance của trình duyệt (ở đây dùng Chrome)
driver = webdriver.Chrome()
# Mở một trang
driver.get('http://example.com')
# Tìm phần tử bằng ID
element_by_id = driver.find_element_by_id('main')
# Tìm phần tử bằng tên
element_by_name = driver.find_element_by_name('username')
# Tìm phần tử bằng XPath
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# Tìm phần tử bằng CSS selector
element_by_css = driver.find_element_by_css_selector('div.content')
Khác biệt giữa find_element và find_elements
Khi bạn có nhiều phần tử cần lấy (ví dụ, tất cả các nút với class là btn
), bạn sẽ cần phương pháp find_elements
. Sự khác biệt giữa find_element
và find_elements
là một cái trả về một phần tử, còn cái kia trả về một danh sách các phần tử.
# Tìm một phần tử
single_element = driver.find_element_by_class_name('btn')
# Tìm nhiều phần tử
multiple_elements = driver.find_elements_by_class_name('btn')
# Lặp qua các phần tử đã tìm thấy
for element in multiple_elements:
print(element.text)
Như bạn thấy, find_elements
rất lý tưởng để làm việc với các tập hợp phần tử có thể có nhiều trên trang. Mỗi phương pháp find_element_xxx
đều có phương pháp find_elements_xxx
, trả về danh sách phần tử.
2. Tương tác tương tác với phần tử
Tương tác với nút, liên kết và trường nhập liệu
Giờ đây, khi bạn đã nhớ cách tìm phần tử, đã đến lúc nhắc lại cách tương tác với chúng! Điều này giống như chơi một bộ LEGO: cần phải kết nối đúng các phần tử để tạo ra điều mà bạn muốn.
Tương tác với phần tử có thể thực hiện qua các phương pháp mà Selenium cung cấp. Hãy cùng xem cách làm:
# Nhấn vào nút
button = driver.find_element_by_id('submit')
button.click()
# Nhập văn bản vào trường nhập liệu
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')
# Lấy văn bản của phần tử
header = driver.find_element_by_tag_name('h1')
print(header.text)
Xử lý các sự kiện và tương tác với phần tử động
Khi nói đến làm việc với các phần tử động, như các nút chỉ xuất hiện sau một hành động nhất định, quan trọng là phải xem xét độ trễ và chờ đợi. Selenium cung cấp cách để đợi tải các phần tử như vậy. Một trong số đó là sử dụng lớp WebDriverWait
kết hợp với expected_conditions
.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Đợi sự xuất hiện của nút trong 10 giây
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
Lưu ý. Để không phải viết mỗi lần expected_conditions
, chúng tôi đã đổi tên nó khi import thành EC
.
Sử dụng chờ đợi giúp mã của bạn bền vững hơn và không bị lỗi vì độ trễ hoặc tải trang chậm. Thực tế, điều này xảy ra khá thường xuyên - gần như luôn luôn :)
3. Điều gì có thể xảy ra sai lầm?
Mọi thứ. Mọi thứ có thể xảy ra sai lầm. Bạn chỉ vừa sẵn sàng tương tác với các phần tử, nhưng rồi... đùng, điều gì đó xảy ra sai lầm. Hãy cùng thảo luận một số lỗi điển hình có thể gặp phải trên con đường này.
Đầu tiên, NoSuchElementException
— đây là thông báo lỗi mà bạn sẽ gặp khá thường xuyên, đặc biệt nếu phần tử mà bạn đang tìm kiếm không tồn tại trên trang. Lỗi này xuất hiện nếu bạn cố gắng tìm một phần tử không tồn tại. Để ngăn các tình huống như vậy, bạn có thể sử dụng phương pháp try-except
để xử lý ngoại lệ.
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("Oops, có vẻ phần tử không được tìm thấy!")
Ngoài ra cũng có thể gặp vấn đề với các phần tử động và thời gian tải. Trong trường hợp này, đợi tải phần tử bằng cách sử dụng WebDriverWait
, như chúng ta đã thảo luận trước đó.
GO TO FULL VERSION