定位網頁元素
要操作網頁上的按鈕、輸入框或連結,第一步永遠是先「找到」它。Selenium 把找元素的方式統稱為定位器(Locator),並提供 find_element 與 find_elements 兩個方法搭配使用。
常用定位策略
所有定位方法都透過 By 類別指定,語法固定為 driver.find_element(By.策略, "值"):
| 策略 | 說明 | 範例 |
|---|---|---|
By.ID |
依元素的 id 屬性查找,最快也最穩定 |
By.ID, "username" |
By.NAME |
依 name 屬性查找,常用於表單欄位 |
By.NAME, "email" |
By.CLASS_NAME |
依 CSS class 查找 | By.CLASS_NAME, "btn-primary" |
By.TAG_NAME |
依 HTML 標籤查找 | By.TAG_NAME, "h1" |
By.LINK_TEXT |
依 <a> 連結的完整文字查找 |
By.LINK_TEXT, "登入" |
By.PARTIAL_LINK_TEXT |
依連結文字的部分內容查找 | By.PARTIAL_LINK_TEXT, "登" |
By.CSS_SELECTOR |
使用 CSS 選擇器,彈性最高、最常用 | By.CSS_SELECTOR, "#id .class" |
By.XPATH |
使用 XPath 表達式,可依文字內容、父子關係查找 | By.XPATH, "//tag[@attribute='value']" |
from selenium.webdriver.common.by import By
element = driver.find_element(By.ID, "element_id")
element = driver.find_element(By.NAME, "element_name")
element = driver.find_element(By.CSS_SELECTOR, ".class_name")
element = driver.find_element(By.XPATH, "//tag[@attribute='value']")
實務上優先使用 By.ID(若元素有穩定的 id),其次是 By.CSS_SELECTOR;By.XPATH 彈性最高,但語法較長、也比較容易因為頁面結構調整而失效,建議在前兩者都無法定位時再使用。
find_element v.s. find_elements
find_element
- 回傳值:第一個符合條件的單一元素;找不到時會拋出
NoSuchElementException。 - 使用時機:確定頁面上只有一個目標元素時使用(例如一個特定按鈕)。
find_elements
- 回傳值:所有符合條件的元素組成的列表(
list);找不到時回傳空列表[],不會拋出例外。 - 使用時機:需要處理多個元素(例如一組選項、一批商品卡片)時使用。
即使只找到一個元素,find_elements 仍然會以列表形式回傳,這點與 find_element 直接回傳單一元素不同。
該選哪一個?
- 確定畫面上只有一個符合條件的元素、且不存在時應視為錯誤 → 用
find_element。 - 元素可能有多個,或需要先判斷「元素存不存在」而不想讓程式直接拋出例外 → 用
find_elements,再檢查回傳的列表長度。
elements = driver.find_elements(By.ID, "element_id")
if elements:
print("元素存在")
else:
print("元素不存在")
相關資料
找到元素之後,接著可以進一步學習如何操作元素與控制瀏覽器。