Selenium報錯ElementNotInteractableException元素不可互動,該如何解決?

霍格沃兹测试开发学社發表於2024-03-26

簡介

在使用 Selenium 進行 Web 自動化測試時,我們可能會遇到各種異常情況。其中之一就是 ElementNotInteractableException 異常,這通常意味著在嘗試與頁面元素互動時出現了問題。本文將詳細介紹這個異常的原因、可能的解決方法,並提供示例程式碼來幫助你更好地理解和處理這種情況。

問題原因

ElementNotInteractableException 異常通常在以下情況下出現:

  1. 元素被遮擋: 頁面元素被其他元素遮擋,導致無法進行互動操作,如點選、輸入等。
  2. 元素不可見: 頁面元素可能存在於 DOM 結構中,但由於樣式或其他因素,它在頁面上是不可見的。
  3. 元素被禁用: 元素雖然可見,但可能被設定為不可互動狀態(如被禁用的按鈕)。
  4. 元素位於框架中: 如果元素位於 <iframe><frame>標籤內部,你需要先切換到正確的框架才能與該元素互動。

解決方法

針對 ElementNotInteractableException 異常,我們可以使用以下解決方法:

  1. 等待元素可互動: 在嘗試與元素互動之前,使用適當的等待策略等待元素變得可互動。這可以透過使用 顯式等待WebDriverWai 結合條件等待來實現。
  2. 確保元素可見: 在操作元素之前,確保它在頁面上可見。可以使用 ExpectedConditions.visibilityOfElementLocated 條件來等待元素可見。
  3. 檢查元素狀態: 在嘗試與元素互動之前,檢查元素是否處於可互動狀態,例如是否被禁用。
  4. 切換到正確的框架: 如果元素位於<frame>內部,我們需要先切換到該frame內部才可以進行操作。

解決示例

以下是一個示例程式碼,演示瞭如何處理 ElementNotInteractableException 異常。假設我們要點選一個按鈕,但按鈕可能會在頁面載入後一段時間後才可見。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 建立瀏覽器例項
driver = webdriver.Chrome()

# 開啟頁面
driver.get("https://example.com")

try:
    # 使用等待策略等待按鈕可見並可互動
    button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "my-button"))
    )
    
    # 確保按鈕可見後再點選
    button.click()

except ElementNotInteractableException:
    print("按鈕不可互動或不可見")

finally:
    driver.quit()

在這個示例中,我們使用了 WebDriverWait 來等待按鈕可互動,然後嘗試點選按鈕。如果按鈕不可互動或不可見,就會捕獲異常並輸出相應的資訊。

總結

元素不可互動異常即ElementNotInteractableException是Selenium 測試中常見的問題之一,通常是因為頁面元素的互動狀態不符合預期。透過合適的等待策略、確保元素可見以及檢查元素狀態,我們可以更好地處理這種異常,從而提高自動化測試的穩定性和可靠性。

相關文章