Python Selenium 透過 WebDriver 定位網頁元素、輸入文字並等待結果的自動化流程

Python Selenium 教學:定位網頁元素、輸入文字與等待載入

想用 Python 操作網頁,第一步不是抓取整頁,而是先找到輸入框、按鈕或連結,再對元素輸入文字、點擊或讀取內容。本文保留原本用 Selenium 操作 Chrome/Firefox 搜尋欄位的主題,並更新成 Selenium 4 的 By 定位器、Selenium Manager 與明確等待寫法。

先看結論:安裝最新版 Selenium 後,建立 webdriver.Chrome()webdriver.Firefox() 時,Selenium Manager 通常會自動處理瀏覽器驅動程式。舊版 find_element_by_name() 已不建議使用,應改成 find_element(By.NAME, ...)

Selenium 是什麼?

Selenium 是瀏覽器自動化工具,會真正啟動瀏覽器並載入 JavaScript,因此適合網站測試、自動填寫表單,以及取得動態載入後才出現的內容。本文使用 Selenium WebDriver,由 Python 控制本機瀏覽器。

安裝 Selenium 與啟動瀏覽器

先安裝 Python 3 與 Chrome 或 Firefox,再在終端機執行:

python -m pip install --upgrade selenium

接著建立 Chrome 工作階段:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.selenium.dev/")
print(driver.title)
driver.quit()

現在 Selenium 已內建 Selenium Manager,一般不必手動下載 ChromeDriver。只有代理伺服器、離線環境、自訂瀏覽器路徑或需要鎖定特殊版本時,才需要額外設定。

如何定位網頁元素?

原文所說的網站標籤,可理解為 HTML 形成的網頁元素,例如 <input><button><a>。Selenium 要先定位元素,才能繼續操作。

  • By.ID:元素有唯一且穩定的 ID 時優先使用。
  • By.NAME:適合具有明確 name 的表單欄位。
  • By.CSS_SELECTOR:可組合標籤、class 與屬性。
  • By.LINK_TEXT:依連結的完整可見文字尋找。
  • By.TAG_NAME:取得同類標籤,例如頁面上全部連結。
  • By.XPATH:可依 DOM 關係定位,但過長的絕對 XPath 容易在版面調整後失效。

完整範例:輸入文字並讀取結果

以下使用 Selenium 官方測試頁,示範開啟網頁、等待欄位出現、輸入內容並讀取屬性:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome()

try:
    driver.get(
        "https://www.selenium.dev/selenium/web/locators_tests/locators.html"
    )
    wait = WebDriverWait(driver, timeout=10)
    first_name = wait.until(
        lambda d: d.find_element(By.ID, "fname")
    )
    first_name.clear()
    first_name.send_keys("Hsin")
    print(first_name.tag_name)
    print(first_name.get_attribute("value"))
finally:
    driver.quit()

try...finally 能確保出錯時仍關閉瀏覽器;輸入前使用 clear() 可避免混入原有文字;get_attribute() 則可讀取輸入值、網址或圖片來源。

舊版 find_element_by_name 怎麼更新?

舊教學常用 driver.find_element_by_name("q")。新版應匯入 By 並改寫:

from selenium.webdriver.common.by import By

search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Selenium Python")

find_element() 會回傳第一個符合條件的元素;要取得多個元素則使用 find_elements(),結果是元素清單。

等待載入:不要只依賴 sleep

JavaScript 內容可能晚一點才出現。固定使用 time.sleep(),網路快時會白等,網路慢時又可能不夠。明確等待會重複檢查指定條件,成功後立即繼續:

wait = WebDriverWait(driver, timeout=10)
result = wait.until(
    lambda d: d.find_element(By.ID, "result")
)

隱含等待是整個工作階段的全域設定。Selenium 官方文件提醒,不要混用隱含等待與明確等待,否則可能產生難以預測的逾時時間。

close() 與 quit() 的差別

  • driver.close():關閉目前視窗或分頁。
  • driver.quit():結束整個 WebDriver 工作階段並關閉相關視窗。

程式完成後通常在 finally 中使用 quit(),可減少瀏覽器背景程序殘留。

常見問題

  • 找不到元素:檢查定位條件、載入時間、iframe,以及元素是否需先點擊才出現。
  • 元素突然失效:頁面重新渲染後應重新定位,不要重複使用舊參照。
  • 版本不相容:先升級 Selenium,再讓 Selenium Manager 重新解析驅動程式。

重點整理

  • 一般環境可由 Selenium Manager 自動處理驅動程式。
  • 使用 find_element(By.ID, ...) 等新版定位器。
  • 動態頁面優先使用明確等待,並避免混用兩種等待。
  • try...finally 搭配 driver.quit() 安全結束工作階段。

官方參考資料

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *