1. 頁面元素搜尋基礎
使用方法來搜尋元素
當你準備在實際項目中使用 Selenium 時,第一個任務通常就是搜尋頁面上的元素。可以想像成在飯店裡找電梯按鈕一樣:你需要知道它在哪裡,才能按下去到需要的樓層。
Selenium 提供了幾個方法來搜尋元素。根據你的喜好,你可以使用 find_element_by_id
、
find_element_by_name
、
find_element_by_xpath
、
find_element_by_css_selector
,等等。
讓我們一起回顧一下並寫個簡單的例子:
from selenium import webdriver
# 創建瀏覽器的實例 (這裡使用 Chrome)
driver = webdriver.Chrome()
# 開啟頁面
driver.get('http://example.com')
# 根據 ID 搜尋元素
element_by_id = driver.find_element_by_id('main')
# 根據名字搜尋元素
element_by_name = driver.find_element_by_name('username')
# 根據 XPath 搜尋元素
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# 根據 CSS 選擇器搜尋元素
element_by_css = driver.find_element_by_css_selector('div.content')
find_element 與 find_elements 之間的區別
如果你想獲取多個元素(例如擁有 btn
類的所有按鈕),你需要用到 find_elements
方法。find_element
和 find_elements
的區別在於,前者返回一個單一元素,而後者返回的是元素的列表。
# 搜尋單一元素
single_element = driver.find_element_by_class_name('btn')
# 搜尋多個元素
multiple_elements = driver.find_elements_by_class_name('btn')
# 遍歷找到的元素
for element in multiple_elements:
print(element.text)
如你所見,find_elements
非常適合處理頁面上可能存在多個的元素集合。每個 find_element_xxx
方法都有一個對應的 find_elements_xxx
,返回的是元素列表。
2. 與元素的互動
與按鈕、鏈接和輸入框互動
現在,你已經回憶起如何尋找元素,是時候記住如何與它們互動!這有點像玩 LEGO:需要正確地組裝元素,以實現你的需求。
可以通過 Selenium 提供的方法來與元素互動。讓我們再次檢查怎麼做:
# 點擊按鈕
button = driver.find_element_by_id('submit')
button.click()
# 在輸入框中輸入文字
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')
# 獲取元素的文字
header = driver.find_element_by_tag_name('h1')
print(header.text)
處理事件和動態元素操作
當涉及到操作動態元素,例如只有在某些操作後才會出現的按鈕時,
考慮延遲和等待是很重要的。Selenium 提供了等待這些元素加載的方法。
其中之一是使用 WebDriverWait
配合 expected_conditions
。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待按鈕出現最多 10 秒
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
提示: 為了避免每次都寫 expected_conditions
,我們在導入時將其重命名為 EC
。
使用等待可以讓你的腳本更加穩健,不會因為短暫的延遲或頁面加載速度過慢而崩潰。實際項目中,這種情況發生得非常頻繁——幾乎一直都有 :)
3. 可能出現的問題
什麼都有可能出問題。 當你對與元素互動充滿期待時,突然,砰——某些事情出錯了。讓我們來討論一些你可能遇到的典型錯誤。
首先是 NoSuchElementException
——這是一個錯誤消息,當你尋找的元素不存在於頁面上時,它會經常出現。這通常是因為你試圖查找一個不存在的元素。為了防止這種情況,你可以使用 try-except
方法來處理異常。
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("哎呀,看起來這個元素沒有找到!")
同時還可能遇到與動態元素和加載時間相關的問題。在這種情況下,可以使用我們之前提到的 WebDriverWait
等待元素加載完成。
GO TO FULL VERSION