Python Selenium 教學:定位網頁元素、輸入文字與等待載入
想用 Python 操作網頁,第一步不是抓取整頁,而是先找到輸入框、按鈕或連結,再對元素輸入文字、點擊或讀取內容。本文保留原本用 Selenium 操作 Chrome/Firefox 搜尋欄位的主題,並更新成 Selenium 4 的 By 定位器、Selenium Manager 與明確等待寫法。
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()安全結束工作階段。















