1. 查找元素的基礎
查找元素的方法
在開始撰寫程式碼之前,很重要的是要理解,我們可以如何透過 Selenium 查找網頁上的元素。 Selenium 提供了幾種方便的查找元素的方法:
-
find_element_by_id(): 根據元素的唯一 ID 查找。 -
find_element_by_name(): 根據屬性name查找元素。 -
find_element_by_class_name(): 查找具有特定 class 的元素。 -
find_element_by_tag_name(): 根據 tag 名稱查找元素,例如div,p,a。
重要提示:這是 Selenium 3 的寫法。Selenium 4 已經移除這些方法,使用 By 的現代寫法請見下一節。
我們從簡單的例子開始 — 通過 id 查找元素。比如,我們丟失了一個按鈕,上面寫著“魔法按鈕”,現在我們需要找到它:
from selenium import webdriver
# 設置 Driver 並打開瀏覽器
driver = webdriver.Chrome()
driver.get('https://example.com')
# 根據 id 查找元素
magic_button = driver.find_element_by_id('magic_button_id')
# 操作找到的元素(例如提取文本)
print(magic_button.text)
# 結束 session
driver.quit()
處理找到的元素
找到元素後,是時候決定該做些什麼了。發揮創意,使用 Selenium 提供的方法,比如 text 來獲取元素的文本內容,或者 get_attribute('attribute_name') 來提取元素的屬性值。
假設我們的元素是一個鏈接,我們想知道它的跳轉目標。方法如下:
# 查找鏈接元素
link_element = driver.find_element_by_class_name('link_class')
# 從屬性 href 中提取 URL
link_url = link_element.get_attribute('href')
print(f'這個鏈接的目標是:{link_url}')
2. Selenium 4:使用 By 的現代查找方式
本節之後講解的內容都是經典的 Selenium 3 寫法。在 Selenium 4 中,find_element_by_* 方法先是被標記為已棄用,從 Selenium 4.3.0 版本開始被徹底移除。如果在較新版本的函式庫上執行這樣的程式碼,你會得到 AttributeError。
一整套獨立的方法只剩下一個通用的 find_element():第一個參數傳入 By 類別中的查找策略,第二個參數傳入具體的值。By 類別需要另外匯入:
from selenium.webdriver.common.by import By
對照表
| Selenium 3 | Selenium 4 | 作用 |
|---|---|---|
find_element_by_id('magic_button_id') |
find_element(By.ID, 'magic_button_id') |
根據元素的唯一 ID 查找。 |
find_element_by_name('name') |
find_element(By.NAME, 'name') |
根據屬性 name 查找元素。 |
find_element_by_class_name('class') |
find_element(By.CLASS_NAME, 'class') |
查找具有特定 class 的元素。 |
find_element_by_tag_name('tag') |
find_element(By.TAG_NAME, 'tag') |
根據 tag 名稱查找元素,例如 div, p, a。 |
查找所有符合條件元素的方式也有同樣的變化:find_elements_by_*() 這一系列被單一的 find_elements() 取代,接受同樣的 By 策略。除了上面列出的四種,By 類別還提供 By.XPATH、By.CSS_SELECTOR、By.LINK_TEXT 與 By.PARTIAL_LINK_TEXT——我們會在後面的課程中談到。
同一個例子,改用 Selenium 4
from selenium import webdriver
from selenium.webdriver.common.by import By
# 設置 Driver 並打開瀏覽器
driver = webdriver.Chrome()
driver.get('https://example.com')
# 根據 id 查找元素
magic_button = driver.find_element(By.ID, 'magic_button_id')
# 操作找到的元素(例如提取文本)
print(magic_button.text)
# 結束 session
driver.quit()
可以看到,只有查找那一行改變了,其餘部分完全一樣:方法回傳的仍是同一個元素物件,text、get_attribute()、click() 與 send_keys() 都照常可用。
本節之後,每個方法仍以經典的 find_element_by_* 形式講解——你在舊程式碼和部分練習題中遇到的正是這種寫法。要把其中任何一個遷移到 Selenium 4,只需依照上面的對照表做一次機械式替換。
3. 方法 find_element_by_id()
方法 find_element_by_id() 是查找網頁元素最快最可靠的方式之一。 它允許根據元素的唯一屬性 id 來查找元素。在 HTML 中,屬性 id 是唯一的識別符號,因此可保證方法返回所需的單一元素。
使用範例:
element = driver.find_element_by_id("submit-button")
在此範例中,Selenium 查找具有 id="submit-button" 的元素,並將其保存到變數 element 中。 這種方式適用於查找按鈕、表單、輸入框等稀有的唯一元素。
什麼時候使用?
只要元素有唯一的 id,即可推薦使用 find_element_by_id() 方法,因為它提供了快速且精確的訪問。
4. 方法 find_element_by_name()
方法 find_element_by_name() 是通過屬性 name 查找元素。 它經常被用於表單和輸入框,特別是當元素可能有相同的 class 或 id,但有不同的 name。與 id 不同,name 的屬性不一定是唯一的,因此在頁面上可能會有多個具有相同 name 的元素。
使用範例:
element = driver.find_element_by_name("username")
此程式碼會查找屬性為 name="username" 的元素。通常這是登錄表單中的用戶名輸入框。
什麼時候使用?
這個方法適用於當元素沒有唯一 id,但有 name 屬性時。它在表單輸入中非常有效,因為這些元素通常依賴 name 進行識別。
5. 方法 find_element_by_class_name()
方法 find_element_by_class_name() 是通過其 class (class) 查找元素。 它可與 CSS 配合使用,幫助找到具有相同樣式設計的元素。不過要注意,class 可被分配給多個元素,因此如果需要找到特定元素,最好確認唯一的 class,或者使用其他方法。
使用範例:
element = driver.find_element_by_class_name("main-header")
在此範例中,Selenium 會查找第一個具有 class main-header 的元素。
什麼時候使用?
find_element_by_class_name() 經常被用於查找標題、按鈕或其他有樣式的元素。 當元素沒有唯一的 id 或 name,而你需要根據樣式來查找時,這個方法非常有用。
6. 方法 find_element_by_tag_name()
方法 find_element_by_tag_name() 是根據元素的標籤名查找元素,例如 div, p, a, input。 對於需要獲取同類型的所有元素,尤其是頁面結構清晰的情況下,這個方法非常有幫助。
使用範例:
element = driver.find_element_by_tag_name("h1")
這裡 Selenium 將查找第一個標籤為 h1 的元素,通常這是頁面上的主要標題。
什麼時候使用?
方法 find_element_by_tag_name() 適用於查找標題、圖片、段落或其他用特定標籤表示的元素。 但是需要注意,一個頁面中同類型的標籤可能會很多,因此這個方法並不總是能精確指出某個特定元素。
7. 特點與錯誤
在繼續前,讓我們停下來讚歎一下 HTML 的多樣性。有時,像按鈕或圖片這樣的元素可能沒有唯一的 id 或 class。 這種情況下,我們需要更複雜的查找方式,比如 XPath 和 CSS 選擇器,我們會在下一堂課中講到。但如果你現在就遇到這樣的元素,不要慌,這只是自動化世界中的一部分樂趣。
選擇器的脆弱性
在使用屬性(如 id 和 class)時,請注意它們可能會改變。 選擇器依賴於突然改變的 id 可能會導致錯誤。特別是對於動態生成的頁面,標識符可能是隨機的。 解決方法?使用更穩定的屬性或者結合不同的方法。
8. 實際應用
現在我們已經知道如何通過 id、class 和名稱來查找元素。 此知識的用途非常廣泛,尤其是在自動化網頁交互時。成功找到的元素可以用來填寫表單、按下按鈕,或提取信息——這些操作大大加速了你的工作,並減輕了單調的任務。
想像一下,一家公司中,每個員工每天都要花 10 分鐘填寫同樣的表單。 這時 Selenium 就派上用場了:它能在幾分鐘內處理完所有的重複工作,而你卻可以悠閒地享用早晨的咖啡。
對於那些對真實案例感興趣的人來說,Selenium 的自動化功能被用於測試網頁應用程式、監控網站變化,甚至可以在你最愛的社交網站上找回忘記的密碼(假如那些演算法突然決定你在熊貓照片裡不是你自己)。
GO TO FULL VERSION