1. 操作腳本與其執行順序
當我們開始規劃自動化腳本時,要記住像故事一樣,應該從簡單到複雜。想像你的腳本是一位英雄, 它正在網頁上旅行。每一步都精確設計和調整,以便不偏離路徑。
建立逐步自動化腳本
首先要規劃好計畫。你想達到什麼目的?加載網頁、填寫表單、點擊按鈕嗎? 就像大家常說的:「不計劃的人就是計劃失敗的人」。我們可不想失敗, 所以讓我們詳細列出每一步。
from selenium import webdriver
from selenium.webdriver.common.by import By
# 創建瀏覽器驅動的實例。使用適合你瀏覽器的驅動。
driver = webdriver.Chrome()
# 開啟網頁
driver.get('https://example.com/login')
# 填寫登入名
driver.find_element(By.NAME, 'username').send_keys('my_username')
# 填寫密碼
driver.find_element(By.NAME, 'password').send_keys('my_secure_password')
# 點擊登入按鈕
driver.find_element(By.ID, 'login-button').click()
就是這樣,我們為腳本操作設定了節奏。每一步順序執行,好讓腳本能夠流暢地 瀏覽網站。
記錄執行步驟
就像每一位自尊自重的英雄,我們的腳本也應該留下「足跡」,讓我們知道它去了哪裡, 做了什麼。記錄(logging)就像我們腳本的日記。它幫助我們追蹤腳本的執行情況, 以及在有問題時查找錯誤。
import logging
# 設定記錄
logging.basicConfig(level=logging.INFO)
# 記錄操作範例
logging.info("開啟登入頁面")
driver.get('https://example.com/login')
記錄不僅能幫助我們進行調試,也能讓我們安心,知道腳本正按計畫執行。 如果出現問題,我們就能回頭看看是在哪一步出錯了。
2. 讓程式碼更易於閱讀與修改
當腳本變得更加複雜時,保持程式碼的整潔非常重要。 想像一下生日聚會,賓客很多,食物也很多:如果不把一切安排得井井有條,那就會變成一團糟。 在我們的情況下,就是程式碼的混亂。
設定程式碼結構
要想輕鬆對程式碼進行修改,它必須組織得井然有序。 像整理襪子那樣,把每件事都分類整理好。 使用函數,將重複的操作提取到獨立的區塊中。
def login_to_site(driver, username, password):
logging.info("輸入登入名")
driver.find_element(By.NAME, 'username').send_keys(username)
logging.info("輸入密碼")
driver.find_element(By.NAME, 'password').send_keys(password)
logging.info("點擊登入按鈕")
driver.find_element(By.ID, 'login-button').click()
# 使用函數進行登入
login_to_site(driver, 'my_username', 'my_secure_password')
使用函數可以讓程式碼更緊湊,也更容易修改。
比如,如果登入按鈕的 ID
改變了,只需要在一個函數中進行修改,
而不用在整個程式碼中修改。
3. 範例:網站購物流程的自動化
假設我們需要自動化網站購物流程,包含以下步驟:
- 開啟網站並登入帳戶。
- 進入商品目錄並將商品加入購物車。
- 進入購物車並完成購買。
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
# 驅動初始化與設置
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 隱式等待
return driver
# 登入帳戶的函數
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()
# 進入商品目錄並加入商品到購物車
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()
# 進入購物車並完成購買
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()
# 關閉驅動的函數
def close_driver(driver):
driver.quit()
# 主腳本執行操作序列
def main():
# 設定登入資料
username = "myusername"
password = "mypassword"
# 初始化驅動
driver = initialize_driver()
try:
# 登入網站
login(driver, username, password)
# 進入商品目錄並加入商品到購物車
add_product_to_cart(driver)
# 進入購物車並完成購買
checkout(driver)
finally:
# 關閉驅動
close_driver(driver)
# 執行主腳本
main()
函數說明
-
initialize_driver()
— 初始化瀏覽器驅動的函數。 它為所有元素設置了隱式等待並返回驅動對象。 -
login()
— 負責執行網站登入的函數。它接受username
和password
參數, 用於填寫登入表單和點擊按鈕。 -
add_product_to_cart()
— 用於進入目錄,選擇產品並將其加入購物車的函數。 -
checkout()
— 用於進入購物車並完成購買的函數。 -
close_driver()
— 負責關閉瀏覽器驅動的函數。 -
main()
— 主函數,管理執行的操作序列。包括調用各個階段的函數以及指定登入所需的資料。
這種方法的優勢
-
可讀性
— 每個階段都單獨處理成函數,讓程式碼更容易理解。 -
可重用性
— 單個函數可以獨立於主腳本使用,例如,執行網站上的單個操作。 -
便於測試
— 每個階段都可以單獨測試,確保所有功能運行正常。 -
靈活性
— 可以根據需要添加其他函數,或者改變main()
中的執行順序。
GO TO FULL VERSION