Skip to content

建立 2026-09-15 更新 2026-09-15

等待機制

現代網頁大量使用非同步載入(AJAX、前端框架渲染),元素不一定在 driver.get() 回傳的當下就已經出現在畫面上。如果程式碼緊接著就去操作一個還沒載入的元素,會拋出 NoSuchElementExceptionElementNotInteractableException。等待機制就是用來解決「時機」問題,Selenium 提供隱性等待與顯性等待兩種方式。

隱性等待(Implicit Wait)

隱性等待會告訴 WebDriver:每次查找元素找不到時,先等待一段時間再重試,直到找到元素或超過設定時間為止。這是全域設定,一旦設定就會套用在整個 WebDriver session 中的每一次元素查找。

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # 設定隱性等待 10 秒
driver.get("https://example.com")

element = driver.find_element(By.ID, "element_id")

顯性等待(Explicit Wait)

顯性等待會針對特定條件等待,條件成立前 WebDriver 會每隔一段時間檢查一次,超過設定的最長時間仍未成立則拋出 TimeoutException。這是局部設定,只作用在指定的等待呼叫上。

常用的等待條件(expected_conditions,通常匯入為 EC):

  • presence_of_element_located:等待元素出現在 DOM 中,不代表一定可見。
  • visibility_of_element_located:等待元素可見,且寬高都大於 0。
  • element_to_be_clickable:等待元素可見且可以被點擊。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get("https://example.com")

# 最多等待 10 秒,直到元素可被點擊
element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "element_id"))
)
element.click()

隱性等待與顯性等待不建議混用:兩者交互作用可能導致實際等待時間比預期長,實務上多數團隊會選擇只用顯性等待,針對真正需要等待的地方個別設定條件。

判斷元素是否存在或可點擊

搭配 tryexcept 可以把等待條件轉換成明確的判斷邏輯:

from selenium.common.exceptions import TimeoutException

# 判斷元素是否存在
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "element_id"))
    )
    print("元素存在")
except TimeoutException:
    print("元素不存在")

# 判斷元素是否可點擊
try:
    element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "element_id"))
    )
    print("元素可點擊")
except TimeoutException:
    print("元素不可點擊")

完整範例

結合前面幾頁學到的定位、操作與等待,以下腳本會打開 Google、搜尋「Selenium Python」,並印出第一筆結果的標題:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.google.com")

# 查找搜尋框並輸入關鍵字
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Selenium Python" + Keys.RETURN)

# 等待搜尋結果載入
driver.implicitly_wait(10)

# 取得第一個結果的標題
first_result = driver.find_element(By.CSS_SELECTOR, "h3")
print(first_result.text)

driver.quit()

推薦影音

優質教學:從定位、等待到打造爬蟲機器人

freeCodeCamp 發布、由 JimShapedCoding 錄製的實戰課程,一邊建立訂房比價機器人、一邊講解定位器、CSS Selector、顯性與隱性等待的差異,並示範如何把腳本組織成完整專案,適合看完本頁觀念後想看真實專案怎麼串起來的學習者。

相關資料

接下來可以進一步學習進階操作,處理多視窗與警示對話框等更複雜的情境。