1. Kịch bản hành động và trình tự của nó
Khi bắt đầu lập kế hoạch cho kịch bản tự động hóa, điều quan trọng là phải hiểu rằng, giống như trong truyện cổ tích, cần đi từ đơn giản đến phức tạp. Hãy tưởng tượng rằng script của bạn là một anh hùng, người đang du hành qua các trang của một website. Mỗi bước được suy nghĩ kỹ và thiết lập rõ ràng để không bị lạc đường.
Tạo kịch bản tự động hóa từng bước
Bắt đầu bằng việc lập kế hoạch. Bạn muốn đạt được gì? Tải trang, điền form, nhấn nút? Như người ta thường nói: "Ai không lập kế hoạch là lập kế hoạch cho thất bại". Chúng ta không muốn thất bại, vì vậy hãy liệt kê các bước cần làm.
from selenium import webdriver
from selenium.webdriver.common.by import By
# Tạo instance của trình điều khiển. Sử dụng trình điều khiển phù hợp với trình duyệt của bạn.
driver = webdriver.Chrome()
# Mở trang
driver.get('https://example.com/login')
# Điền username
driver.find_element(By.NAME, 'username').send_keys('ten_dang_nhap_cua_toi')
# Điền mật khẩu
driver.find_element(By.NAME, 'password').send_keys('mat_khau_bao_mat_cua_toi')
# Nhấn nút đăng nhập
driver.find_element(By.ID, 'login-button').click()
Đây chính là cách chúng ta tạo nhịp điệu cho điệu nhảy của mình. Mỗi bước của kịch bản được thực hiện theo trình tự, giúp script của bạn dễ dàng di chuyển qua trang web.
Ghi log các bước thực hiện
Giống như một anh hùng tự trọng, script của chúng ta cần để lại dấu vết để chúng ta biết nó đã ở đâu và đã làm gì. Ghi log giống như nhật ký của script. Nó giúp theo dõi các bước thực hiện và phát hiện lỗi nếu có gì đó không ổn.
import logging
# Cấu hình ghi log
logging.basicConfig(level=logging.INFO)
# Ví dụ ghi log hành động
logging.info("Mở trang đăng nhập")
driver.get('https://example.com/login')
Ghi log không chỉ giúp gỡ lỗi mà còn mang lại sự an tâm khi biết rằng script của bạn thực hiện mỗi bước như dự định. Nếu có gì đó đi sai, bạn có thể quay lại và xem điều gì đã sai ở bước nào.
2. Tổ chức mã để dễ đọc và sửa đổi
Khi kịch bản trở nên phức tạp hơn, điều quan trọng là giữ cho mã sạch sẽ. Hãy tưởng tượng một buổi tiệc kỷ niệm với nhiều khách và món ăn: nếu không sắp xếp mọi thứ đúng chỗ, sẽ rất hỗn loạn. Trong trường hợp của chúng ta — hỗn loạn trong mã.
Cấu trúc mã
Để chỉnh sửa mã một cách dễ dàng, nó cần được tổ chức tốt. Giống như người sắp xếp tất, bạn cần sắp xếp mọi thứ ngăn nắp. Sử dụng hàm để tách các hành động lặp lại thành các khối riêng biệt.
def login_to_site(driver, username, password):
logging.info("Điền username")
driver.find_element(By.NAME, 'username').send_keys(username)
logging.info("Điền mật khẩu")
driver.find_element(By.NAME, 'password').send_keys(password)
logging.info("Nhấn nút đăng nhập")
driver.find_element(By.ID, 'login-button').click()
# Sử dụng hàm để đăng nhập
login_to_site(driver, 'ten_dang_nhap_cua_toi', 'mat_khau_bao_mat_cua_toi')
Sử dụng hàm giúp mã ngăn nắp hơn và dễ dàng chỉnh sửa, ví dụ khi ID
của nút đăng nhập thay đổi, bạn chỉ cần thay đổi trong một hàm thay vì toàn bộ mã.
3. Ví dụ: Tự động hóa quy trình mua sắm trên website
Giả sử chúng ta cần thiết lập việc tự động hóa quá trình mua hàng trên trang web, bao gồm các bước:
- Mở trang và đăng nhập tài khoản.
- Truy cập danh mục sản phẩm và thêm sản phẩm vào giỏ hàng.
- Truy cập giỏ hàng và tiến hành thanh toán.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Khởi tạo driver với cài đặt
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10) # Đợi ngầm định
return driver
# Hàm đăng nhập tài khoản
def login(driver, username, password):
driver.get("https://example.com")
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("login_button").click()
# Hàm để truy cập danh mục sản phẩm và thêm sản phẩm vào giỏ
def add_product_to_cart(driver):
driver.get("https://example.com/catalog")
product = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "product_item"))
)
product.click()
add_to_cart_button = driver.find_element_by_id("add_to_cart")
add_to_cart_button.click()
# Hàm truy cập giỏ hàng và thanh toán
def checkout(driver):
driver.get("https://example.com/cart")
checkout_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "checkout"))
)
checkout_button.click()
# Hàm kết thúc driver
def close_driver(driver):
driver.quit()
# Script chính để thực hiện trình tự hành động
def main():
# Cài đặt dữ liệu
username = "ten_dang_nhap_cua_toi"
password = "mat_khau_cua_toi"
# Khởi tạo driver
driver = initialize_driver()
try:
# Đăng nhập trang
login(driver, username, password)
# Truy cập danh mục và thêm sản phẩm vào giỏ
add_product_to_cart(driver)
# Truy cập giỏ hàng và thanh toán
checkout(driver)
finally:
# Đóng driver
close_driver(driver)
# Khởi chạy script chính
main()
Giải thích các hàm
-
initialize_driver()
— hàm để khởi tạo web driver. Nó đặt đợi ngầm định cho tất cả các phần tử và trả về đối tượng driver. -
login()
— hàm để thực hiện đăng nhập vào trang web. Nó nhận các tham sốusername
vàpassword
, được sử dụng để điền form đăng nhập và nhấn nút. -
add_product_to_cart()
— hàm để truy cập danh mục, chọn sản phẩm và thêm vào giỏ hàng. -
checkout()
— hàm để truy cập giỏ hàng và thực hiện việc thanh toán. -
close_driver()
— hàm để kết thúc làm việc với driver. -
main()
— hàm chính, quản lý trình tự các hành động. Trong đó, thực hiện gọi các bước cũng như chỉ định dữ liệu cho việc đăng nhập.
Lợi ích của cách tiếp cận này
-
Dễ đọc
— mỗi bước được tổ chức dưới dạng một hàm riêng lẻ, giúp mã dễ hiểu hơn. -
Tái sử dụng
— các hàm riêng lẻ có thể sử dụng độc lập với script chính, ví dụ để thực hiện các hành động riêng lẻ trên trang web. -
Dễ kiểm thử
— mỗi bước có thể được kiểm thử riêng để đảm bảo tất cả hoạt động chính xác. -
Linh hoạt
— nếu cần thiết, có thể thêm các hàm khác hoặc thay đổi thứ tự gọi các hành động trongmain()
.
GO TO FULL VERSION