CodeGym /Các khóa học /Python SELF VI / Tìm kiếm phần tử bằng thuộc tính HTML: id, class

Tìm kiếm phần tử bằng thuộc tính HTML: id, class

Python SELF VI
Mức độ, Bài học
Có sẵn

1. Cơ bản về tìm kiếm phần tử

Phương pháp tìm kiếm phần tử

Trước khi lao vào viết code, cần hiểu chính xác cách chúng ta có thể tìm kiếm phần tử trên trang web bằng Selenium. Selenium cung cấp một số phương pháp tiện dụng để tìm kiếm phần tử:

  • find_element_by_id(): Tìm kiếm phần tử dựa trên id duy nhất của phần tử.
  • find_element_by_name(): Cho phép tìm kiếm phần tử qua thuộc tính name.
  • find_element_by_class_name(): Tìm kiếm các phần tử có class cụ thể.
  • find_element_by_tag_name(): Sử dụng tên thẻ để tìm kiếm phần tử, ví dụ như div, p, a.

Quan trọng: đây là cú pháp của Selenium 3. Trong Selenium 4 những phương thức này đã bị loại bỏ — cách viết hiện đại với By được trình bày ở mục tiếp theo.

Bắt đầu với một ví dụ đơn giản — tìm kiếm phần tử bằng id. Hãy tưởng tượng chúng ta đã mất một nút bấm có dòng chữ "Nút thần kỳ" và cần tìm nó:

Python

from selenium import webdriver

# Cài đặt driver và mở trình duyệt
driver = webdriver.Chrome()
driver.get('https://example.com')

# Tìm kiếm phần tử bằng id
magic_button = driver.find_element_by_id('magic_button_id')

# Thao tác với phần tử được tìm thấy (ví dụ, lấy văn bản)
print(magic_button.text)

# Kết thúc phiên làm việc
driver.quit()

Thao tác với phần tử tìm thấy

Sau khi tìm thấy phần tử, đây là lúc quyết định xem sẽ làm gì với nó. Hãy sáng tạo và sử dụng các phương pháp của Selenium như text để lấy nội dung văn bản của phần tử hoặc get_attribute('attribute_name') để lấy giá trị của bất kỳ thuộc tính nào của phần tử.

Giả sử phần tử của chúng ta là một liên kết và chúng ta muốn biết liên kết đó dẫn đến đâu. Đây là cách thực hiện:

Python

# Tìm kiếm phần tử là liên kết
link_element = driver.find_element_by_class_name('link_class')

# Lấy URL từ thuộc tính href
link_url = link_element.get_attribute('href')
print(f'Liên kết này dẫn đến: {link_url}')

2. Selenium 4: cách tìm kiếm hiện đại với By

Tất cả những gì được trình bày tiếp theo trong bài học này là cú pháp cổ điển của Selenium 3. Trong Selenium 4, các phương thức find_element_by_* ban đầu bị đánh dấu là lỗi thời, và từ phiên bản Selenium 4.3.0 thì bị loại bỏ hoàn toàn. Nếu chạy đoạn mã như vậy trên phiên bản thư viện mới, bạn sẽ nhận được AttributeError.

Thay cho một loạt phương thức riêng lẻ, giờ chỉ còn một phương thức đa năng find_element(): tham số thứ nhất là chiến lược tìm kiếm lấy từ lớp By, tham số thứ hai là chính giá trị cần tìm. Lớp By phải được import riêng:

Python

from selenium.webdriver.common.by import By

Bảng đối chiếu

Selenium 3 Selenium 4 Công dụng
find_element_by_id('magic_button_id') find_element(By.ID, 'magic_button_id') Tìm kiếm phần tử dựa trên id duy nhất của phần tử.
find_element_by_name('name') find_element(By.NAME, 'name') Cho phép tìm kiếm phần tử qua thuộc tính name.
find_element_by_class_name('class') find_element(By.CLASS_NAME, 'class') Tìm kiếm các phần tử có class cụ thể.
find_element_by_tag_name('tag') find_element(By.TAG_NAME, 'tag') Sử dụng tên thẻ để tìm kiếm phần tử, ví dụ như div, p, a.

Việc tìm tất cả các phần tử phù hợp cũng thay đổi tương tự: thay cho nhóm find_elements_by_*(), giờ chỉ có một find_elements() với đúng những chiến lược By đó. Ngoài bốn chiến lược kể trên, lớp By còn có By.XPATH, By.CSS_SELECTOR, By.LINK_TEXT và By.PARTIAL_LINK_TEXT — chúng ta sẽ nói về chúng trong các bài sau.

Vẫn ví dụ đó, nhưng viết bằng Selenium 4

Python

from selenium import webdriver
from selenium.webdriver.common.by import By

# Cài đặt driver và mở trình duyệt
driver = webdriver.Chrome()
driver.get('https://example.com')

# Tìm kiếm phần tử bằng id
magic_button = driver.find_element(By.ID, 'magic_button_id')

# Thao tác với phần tử được tìm thấy (ví dụ, lấy văn bản)
print(magic_button.text)

# Kết thúc phiên làm việc
driver.quit()

Như bạn thấy, chỉ có dòng tìm kiếm thay đổi — mọi thứ còn lại hoạt động y hệt: phương thức vẫn trả về cùng một đối tượng phần tử với text, get_attribute(), click() và send_keys() như cũ.

Phần còn lại của bài học vẫn trình bày từng phương thức ở dạng cổ điển find_element_by_* — đó chính là dạng bạn sẽ gặp trong mã nguồn cũ và trong một phần bài tập. Để chuyển bất kỳ phương thức nào sang Selenium 4, chỉ cần một thao tác thay thế máy móc theo bảng ở trên.

3. Phương pháp find_element_by_id()

Phương pháp find_element_by_id() – là một trong những cách nhanh nhất và đáng tin cậy nhất để tìm kiếm phần tử trên trang web. Nó cho phép tìm kiếm phần tử dựa trên thuộc tính id duy nhất của chúng. Trong HTML, thuộc tính id là một định danh duy nhất, vì vậy có thể đảm bảo rằng phương pháp này sẽ trả về chính xác phần tử cần tìm.

Ví dụ sử dụng:

Python

element = driver.find_element_by_id("submit-button")

Trong ví dụ này, Selenium tìm kiếm phần tử với id="submit-button" và lưu trữ nó vào biến element. Cách tiếp cận này rất tiện lợi để tìm các nút, biểu mẫu, trường nhập và các phần tử duy nhất khác hiếm khi trùng lặp trên trang.

Khi nào sử dụng?

Sử dụng find_element_by_id() được khuyến nghị bất cứ khi nào phần tử có định danh duy nhất id, vì phương pháp này đảm bảo truy cập nhanh chóng và chính xác vào phần tử.

4. Phương pháp find_element_by_name()

Phương pháp find_element_by_name() tìm kiếm phần tử qua thuộc tính name. Nó thường được dùng cho biểu mẫu và trường nhập, đặc biệt khi các phần tử có thể có cùng class hoặc id, nhưng khác name. Không giống id, thuộc tính name không nhất thiết phải là duy nhất, và đôi khi trên trang có thể có nhiều phần tử với cùng một name.

Ví dụ sử dụng:

Python

element = driver.find_element_by_name("username")

Mã này tìm kiếm phần tử với name="username". Thông thường đây là trường nhập tên người dùng trong biểu mẫu đăng nhập.

Khi nào sử dụng?

Phương pháp này hữu ích nếu phần tử trên trang không có id duy nhất, nhưng có thuộc tính name. Nó đặc biệt hiệu quả với các biểu mẫu nhập liệu, nơi các phần tử thường được nhận diện qua name.

5. Phương pháp find_element_by_class_name()

Phương pháp find_element_by_class_name() tìm kiếm phần tử qua class (class). Nó hữu ích cho công việc với CSS và cho phép tìm các phần tử có cùng kiểu dáng. Nên nhớ rằng class có thể được gán cho nhiều phần tử, vì vậy nếu cần tìm duy nhất một phần tử, nên chỉ định class cụ thể hoặc sử dụng phương pháp khác.

Ví dụ sử dụng:

Python

element = driver.find_element_by_class_name("main-header")

Trong ví dụ này, Selenium tìm kiếm phần tử đầu tiên với class main-header.

Khi nào sử dụng?

find_element_by_class_name() thường được sử dụng để tìm kiếm tiêu đề, nút và các phần tử khác có kiểu dáng cụ thể. Phương pháp này đặc biệt hữu ích khi các phần tử không có id hoặc name duy nhất, cũng như trong các trường hợp cần tìm kiếm theo đặc điểm về kiểu dáng.

6. Đặc điểm và lỗi

Trước khi tiến xa hơn, hãy dành chút thời gian để đánh giá sự đa dạng của HTML. Đôi khi các phần tử, chẳng hạn như nút hoặc hình ảnh, có thể không có id hoặc class duy nhất. Trong trường hợp đó, các phương pháp tìm kiếm phức tạp hơn như XPath và CSS selectors sẽ giúp bạn, chúng ta sẽ nói về chúng trong bài giảng tiếp theo. Nhưng nếu bạn gặp phải các phần tử này ngay bây giờ, đừng hoảng loạn. Đây chỉ là một phần vui vẻ trong thế giới tự động hóa web.

Sự không ổn định của selectors

Khi làm việc với các thuộc tính như id và class, hãy nhớ rằng chúng có thể thay đổi. Lựa chọn phần tử dựa vào id, thứ bất ngờ bị thay đổi, có thể dẫn đến lỗi. Điều này đặc biệt đúng với các trang web được tạo ra động, nơi các định danh có thể là ngẫu nhiên. Giải pháp? Sử dụng các thuộc tính ổn định hơn hoặc các phương pháp kết hợp.

7. Ứng dụng thực tế

Bây giờ chúng ta đã biết cách tìm kiếm phần tử qua id, class, và name. Kiến thức này rất hữu ích, đặc biệt khi nói về tự động hóa tương tác với các trang web. Các phần tử được tìm thấy thành công có thể được sử dụng để điền biểu mẫu, nhấn nút hoặc lấy thông tin — những hành động có thể tăng tốc công việc của bạn và loại bỏ những nhiệm vụ đơn điệu.

Hãy tưởng tượng một công ty, nơi mỗi nhân viên mất 10 phút mỗi ngày để điền một biểu mẫu giống nhau trên trang web. Và sau đó Selenium xuất hiện: nó hoàn thành tất cả công việc lặp đi lặp lại chỉ trong vài phút trong khi bạn đang thưởng thức cốc cà phê sáng của mình.

Đối với những ai đã quan tâm đến các trường hợp thực tế, tự động hóa với Selenium được sử dụng để thử nghiệm ứng dụng web, giám sát các thay đổi trên trang web và thậm chí để khôi phục nhanh chóng mật khẩu đã quên trên mạng xã hội yêu thích của bạn, nếu thuật toán quyết định rằng bạn không giống trong những bức ảnh selfie với gấu trúc.

1
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Tìm kiếm phần tử bằng định danh duy nhất
Tìm kiếm phần tử bằng định danh duy nhất
2
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Tìm kiếm và trích xuất URL từ phần tử theo class
Tìm kiếm và trích xuất URL từ phần tử theo class
3
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Tìm kiếm và tương tác với nút bấm
Tìm kiếm và tương tác với nút bấm
4
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Tìm kiếm các phần tử và làm việc với chúng bên trong bảng
Tìm kiếm các phần tử và làm việc với chúng bên trong bảng
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION