🎯 專案概述 這是一個基於 Selenium WebDriver 的網頁自動化技術學習專案。透過這個專案,我深入學習了現代網頁自動化技術,掌握了瀏覽器控制、元素定位、事件處理等核心技能。
注意: 本專案僅用於技術學習和研究目的,不提供完整程式碼開源。
🛠️ 技術架構 核心技術棧 Python 3.9+ - 主要開發語言 Selenium WebDriver - 瀏覽器自動化框架 ChromeDriver - Chrome瀏覽器驅動 BeautifulSoup4 - HTML解析 手動驗證碼處理 - 人工輸入驗證碼 系統架構設計 ┌─────────────────┐ │ 配置管理模組 │ │ - 設定檔讀取 │ │ - 參數驗證 │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ 瀏覽器控制模組 │ │ - WebDriver │ │ - 頁面載入 │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ 元素定位模組 │ │ - XPath/CSS │ │ - 元素等待 │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ 事件處理模組 │ │ - 點擊事件 │ │ - 表單填寫 │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ 驗證處理模組 │ │ - 手動輸入 │ │ - 安全驗證 │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ 日誌記錄模組 │ │ - 操作記錄 │ │ - 錯誤處理 │ └─────────────────┘ 📚 學習重點 1. Selenium WebDriver 基礎 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 瀏覽器初始化 from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 配置Chrome選項 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') # 初始化WebDriver driver = webdriver.Chrome(service=Service(chromedriver_path), options=chrome_options) 2. 元素定位技巧詳解 2.1 ID 定位(最優先使用) 1 2 3 4 5 6 7 8 9 # 優點:唯一性高,定位速度快 # 適用:有明確ID的元素 element = driver.find_element(By.ID, "username") element = driver.find_element(By.ID, "submit-button") # 實際範例:登入表單 username_input = driver.find_element(By.ID, "login-username") password_input = driver.find_element(By.ID, "login-password") login_button = driver.find_element(By.ID, "login-submit") 2.2 Name 定位 1 2 3 4 5 6 7 8 # 優點:語義化,易於理解 # 適用:表單元素 element = driver.find_element(By.NAME, "username") element = driver.find_element(By.NAME, "email") # 實際範例:搜尋框 search_input = driver.find_element(By.NAME, "q") search_button = driver.find_element(By.NAME, "search") 2.3 Class Name 定位 1 2 3 4 5 6 7 8 # 優點:可定位多個相同樣式的元素 # 適用:樣式化的元素 elements = driver.find_elements(By.CLASS_NAME, "btn-primary") element = driver.find_element(By.CLASS_NAME, "form-control") # 實際範例:按鈕群組 primary_buttons = driver.find_elements(By.CLASS_NAME, "btn-primary") secondary_buttons = driver.find_elements(By.CLASS_NAME, "btn-secondary") 2.4 Tag Name 定位 1 2 3 4 5 6 7 8 9 # 優點:可定位所有特定標籤 # 適用:需要遍歷所有同類元素 links = driver.find_elements(By.TAG_NAME, "a") inputs = driver.find_elements(By.TAG_NAME, "input") # 實際範例:獲取所有連結 all_links = driver.find_elements(By.TAG_NAME, "a") for link in all_links: print(link.text) 2.5 CSS Selector 定位(推薦) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 優點:語法簡潔,功能強大 # 適用:複雜的選擇器需求 # 基本選擇器 element = driver.find_element(By.CSS_SELECTOR, "input[type='text']") element = driver.find_element(By.CSS_SELECTOR, ".btn-primary") # 組合選擇器 element = driver.find_element(By.CSS_SELECTOR, "form.login-form input[type='submit']") element = driver.find_element(By.CSS_SELECTOR, "div.container > button.btn") # 實際範例:複雜表單 username = driver.find_element(By.CSS_SELECTOR, "form#loginForm input[name='username']") password = driver.find_element(By.CSS_SELECTOR, "form#loginForm input[type='password']") submit = driver.find_element(By.CSS_SELECTOR, "form#loginForm button[type='submit']") 2.6 XPath 定位(最靈活) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 優點:功能最強大,可定位任何元素 # 適用:複雜的定位需求 # 絕對路徑 element = driver.find_element(By.XPATH, "/html/body/div[1]/form/input[1]") # 相對路徑 element = driver.find_element(By.XPATH, "//input[@name='username']") element = driver.find_element(By.XPATH, "//button[contains(text(),'登入')]") # 父元素定位 element = driver.find_element(By.XPATH, "//input[@id='username']/parent::div") # 實際範例:動態內容定位 # 定位包含特定文字的按鈕 login_button = driver.find_element(By.XPATH, "//button[contains(text(),'登入')]") # 定位特定屬性的元素 email_input = driver.find_element(By.XPATH, "//input[@type='email']") # 定位多個條件 submit_btn = driver.find_element(By.XPATH, "//button[@type='submit' and @class='btn-primary']") 2.7 定位策略總結 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 # 推薦的定位優先順序 def find_element_smart(driver, element_info): """ 智能元素定位策略 1. ID (最快) 2. Name (表單元素) 3. CSS Selector (複雜選擇) 4. XPath (最後選擇) """ try: # 優先使用ID if 'id' in element_info: return driver.find_element(By.ID, element_info['id']) except: pass try: # 其次使用Name if 'name' in element_info: return driver.find_element(By.NAME, element_info['name']) except: pass try: # 使用CSS Selector if 'css' in element_info: return driver.find_element(By.CSS_SELECTOR, element_info['css']) except: pass # 最後使用XPath if 'xpath' in element_info: return driver.find_element(By.XPATH, element_info['xpath']) raise Exception("Element not found") # 使用範例 element_info = { 'id': 'username', 'name': 'username', 'css': 'input[name="username"]', 'xpath': '//input[@name="username"]' } username_input = find_element_smart(driver, element_info) 3. 事件處理 1 2 3 4 5 6 7 8 9 10 11 # 點擊操作 element.click() # 輸入文字 element.clear() element.send_keys("text") # 下拉選單處理 from selenium.webdriver.support.ui import Select select = Select(driver.find_element(By.ID, "dropdown")) select.select_by_value("option_value") 4. 驗證碼處理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # 手動輸入驗證碼 def handle_captcha_manual(driver): """ 手動處理驗證碼 1. 截圖驗證碼區域 2. 暫停程式等待人工輸入 3. 輸入驗證碼並提交 """ # 定位驗證碼輸入框 captcha_input = driver.find_element(By.ID, "captcha-input") # 暫停等待人工輸入 print("請查看驗證碼並手動輸入...") input("按Enter繼續...") # 獲取人工輸入的驗證碼 captcha_text = input("請輸入驗證碼: ") # 輸入驗證碼 captcha_input.clear() captcha_input.send_keys(captcha_text) return captcha_text # 使用範例 captcha_result = handle_captcha_manual(driver) print(f"驗證碼已輸入: {captcha_result}") 自動辨識驗證碼技術:如需了解更多關於自動驗證碼辨識技術,請聯絡 Boyce Work工作坊 了解更多。
...