1. Phương pháp kiểm tra script
Chào mừng các bạn đến với bài giảng mà mọi lập trình viên đều yêu thích — gỡ lỗi và kiểm tra phần mềm! Nếu bạn đã học cách tạo một bot nhỏ thú vị với Selenium, đã đến lúc tìm hiểu cách biến nó thành một công cụ ngoan ngoãn, không chỉ hoạt động mà còn hoạt động một cách ổn định. Chắc chắn bạn không muốn bot của mình quyết định "nghỉ ngơi" vào thời điểm quan trọng nhất.
Chúng ta sẽ bắt đầu bằng việc thảo luận các phương pháp kiểm tra script. Kiểm tra phần mềm cũng giống như việc đi khám bác sĩ: không ai thích, nhưng không thể tránh được. Ngay cả script tốt nhất cũng cần được kiểm tra về độ bền và độ tin cậy. Tin tốt là Python có rất nhiều công cụ để giúp bạn trong việc này.
Unit test
Mọi thứ bắt đầu với unit test. Chúng giống như những chiếc đồng hồ Thụy Sĩ nhỏ, kiểm tra từng bánh răng trong hệ thống của bạn. Trong Python, thư viện unittest là chuẩn mực để viết unit test. Ý tưởng chính là kiểm tra từng "unit" hoặc phần nhỏ mã của bạn trong môi trường cách ly.
import unittest
from my_selenium_script import my_function
class TestMyFunction(unittest.TestCase):
def test_success_case(self):
result = my_function("expected input")
self.assertEqual(result, "expected output")
unittest.main()
Ví dụ đơn giản này minh hoạ cách bạn có thể kiểm tra từng hàm riêng biệt trong mã của mình. Tất nhiên, trong thực tế, bạn sẽ kiểm tra không chỉ các trường hợp thành công mà còn cả các trường hợp đặc biệt và dữ liệu đầu vào không hợp lệ.
Kiểm tra tích hợp
Khi bạn đã tin tưởng từng "unit", đã đến lúc kiểm tra cách chúng tương tác với nhau. Kiểm tra tích hợp, giống như một buổi hẹn hò hoàn hảo, cho thấy các phần tử riêng biệt hoạt động cùng nhau ra sao. Ở đây, bạn có thể sử dụng cùng thư viện, nhưng tiếp cận việc kiểm tra từ một góc độ khác.
class TestIntegration(unittest.TestCase):
def test_full_workflow(self):
# Hãy tưởng tượng mỗi bước là một lời gọi hàm trong thuật toán của bạn
open_page()
fill_form()
submit_form()
self.assertTrue(check_results())
Kiểm tra tích hợp có thể phức tạp hơn và tốn nhiều thời gian hơn, nhưng chúng mang lại sự tự tin rằng toàn bộ hệ thống đang hoạt động như một khối thống nhất.
2. Gỡ lỗi và sửa lỗi
Bây giờ, khi đã nói về kiểm tra, hãy đi sâu vào phần thú vị hơn — gỡ lỗi. Gỡ lỗi là khi bot của bạn quyết định hành động tự do và bạn cố gắng đưa nó trở lại với kế hoạch ban đầu.
Công cụ gỡ lỗi
Công cụ tuyệt vời để gỡ lỗi trong Python là pdb. Nó cho phép bạn tạm dừng thực thi script và kiểm tra trạng thái của nó từng bước một. Cùng xem một ví dụ:
import pdb
def some_function(value):
pdb.set_trace() # Tại đây việc thực thi sẽ bị tạm dừng
result = value + 1
return result
some_function(3)
Khi chạy đoạn mã này, bạn sẽ bước vào một môi trường tương tác, nơi bạn có thể đi qua từng bước mã, xem giá trị của biến, thay đổi chúng và thậm chí tiếp tục thực thi chương trình từng bước. Điều này làm cuộc sống trở nên dễ dàng hơn nhiều khi script của bạn dường như làm điều gì đó kỳ lạ.
Hình dung trạng thái trang
Để gỡ lỗi một cách trực quan, bạn có thể lưu ảnh chụp màn hình của trang ở mỗi giai đoạn thực thi script. Điều này giúp bạn thấy các phần tử nào đang hiển thị trên màn hình và trang trông như thế nào tại thời điểm xảy ra lỗi.
driver.save_screenshot("page_state.png")
Chiến lược tìm và sửa lỗi
Rất tiếc, không có bộ gỡ lỗi nào cho bạn biết lỗi logic cơ bản trong mã của bạn nằm ở đâu. Đây là lúc các chiến lược hỗ trợ:
- Ghi nhật ký (logging): Thêm việc ghi nhật ký ở khắp mọi nơi. Như ai đó thông thái từng nói, "nếu bạn không biết chuyện gì đang xảy ra với mã, điều đó nghĩa là bạn không có đủ log". Sử dụng thư viện
logginggiúp bạn không làm lộn xộn mã với các hàmprint()và mang lại sự kiểm soát tốt hơn. - Đọc mã thành tiếng: Đôi khi các nhiệm vụ trong não được giải quyết tốt hơn khi bạn nói ra mã sẽ làm gì. Nghe có vẻ kỳ lạ, nhưng nó thực sự hiệu quả!
- Chia nhỏ thành module: Chia rạch ròi các phần trong mã thành các module hoặc các hàm. Điều này giúp dễ dàng xác định lỗi nằm ở đâu.
3. Phân tích script Selenium của bạn
Để tạo một script đáng tin cậy, điều quan trọng là kiểm tra hoạt động của nó trong các kịch bản khác nhau. Dưới đây là một số ví dụ về các kịch bản như vậy:
Thiếu phần tử trên trang
Trong khi gỡ lỗi, bạn cần đảm bảo rằng tất cả các phần tử cần thiết đều có mặt trên trang và sẵn sàng để tương tác. Sử dụng phương thức find_elements() và kiểm tra độ dài của danh sách trả về để tránh lỗi NoSuchElementException.
elements = driver.find_elements_by_class_name("class_name")
if len(elements) == 0:
logging.warning("Không tìm thấy phần tử")
else:
logging.info("Đã tìm thấy phần tử thành công")
Các trạng thái không lường trước của trang
Ví dụ như các trang với các hình thức tải khác nhau hoặc các phần tử khác nhau xuất hiện tùy thuộc vào điều kiện. Script cần phải sẵn sàng xử lý các tình huống như vậy.
try:
special_offer = driver.find_element(By.ID, "special_offer")
logging.info("Đã tìm thấy offer đặc biệt và thực hiện các hành động")
except NoSuchElementException:
logging.info("Không tìm thấy offer, tiếp tục không có nó")
Các phần tử biến đổi trên trang
Khi kiểm tra, nên lưu ý rằng các phần tử trên cùng một trang có thể thay đổi (ví dụ: các banner khác nhau, khối quảng cáo, v.v.). Hãy kiểm tra script trong nhiều trạng thái trang khác nhau.
Kiểm tra trên các trình duyệt khác nhau
Các trình duyệt khác nhau có thể xử lý các trang web một cách khác biệt, vì vậy để đảm bảo ổn định, hãy kiểm tra script trên một số trình duyệt (ví dụ: Chrome, Firefox, Edge). Selenium cho phép chạy các bài kiểm tra trên các trình duyệt khác nhau thông qua các trình điều khiển web khác nhau.
from selenium import webdriver
# Chạy trên Chrome
driver = webdriver.Chrome()
# Chạy trên Firefox
driver = webdriver.Firefox()
# Chạy trên Edge
driver = webdriver.Edge()
4. Tự động hóa kiểm tra script
Viết bài kiểm tra với unittest
Sử dụng thư viện unittest để tự động chạy các bài kiểm tra cho các phần khác nhau trong script của bạn. Điều này cho phép bạn thường xuyên kiểm tra tính khả dụng của từng phần tử.
import unittest
from selenium import webdriver
class SeleniumTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get("https://example.com")
def test_element_presence(self):
driver = self.driver
element = driver.find_element_by_id("submit_button")
self.assertIsNotNone(element, "Không tìm thấy phần tử trên trang")
def tearDown(self):
self.driver.quit()
unittest.main()
Tạo tập hợp bài kiểm tra với tham số
Tạo tập hợp các bài kiểm tra để kiểm tra nhiều tổ hợp phần tử và kịch bản khác nhau. Ví dụ, bạn có thể kiểm tra các trang với các tham số khác nhau, chẳng hạn như các form dữ liệu khác nhau trong ô nhập liệu.
Kiểm tra độ ổn định và hiệu năng
- Kiểm tra độ ổn định của script trên dữ liệu lớn: Đảm bảo script có thể xử lý khối lượng dữ liệu lớn và hoạt động trong thời gian dài.
- Chạy kiểm tra định kỳ: Thường xuyên chạy các bài kiểm tra để giám sát độ ổn định của script, đặc biệt nếu trang web mà bạn đang làm việc thường xuyên được cập nhật.
- Đánh giá hiệu năng: Tránh đợi quá lâu và các phần tử chậm. Sử dụng bộ định giờ để đánh giá thời gian thực thi của từng bước và tối ưu hóa khi cần thiết.
GO TO FULL VERSION