理解常見錯誤

如何在您的 Selenium 程式碼中解決各種問題。

InvalidSelectorException

CSS 和 XPath 選擇器有時難以正確取得。

可能原因

您嘗試使用的 CSS 或 XPath 選擇器包含無效字元或無效查詢。

可能的解決方案

透過驗證器服務執行您的選擇器

或使用瀏覽器擴充功能來取得已知良好的值

NoSuchElementException

在您嘗試定位元素的確切時刻,找不到該元素。

可能原因

  • 您在錯誤的地方尋找元素(可能先前的動作未成功)。
  • 您在錯誤的時間尋找元素(元素尚未在 DOM 中顯示)。
  • 自您編寫程式碼以來,定位器已變更

可能的解決方案

  • 請確認您位於預期的頁面,並且程式碼中先前的動作已正確完成
  • 請確認您正在使用適當的等待策略
  • 使用瀏覽器的開發人員工具主控台更新定位器,或使用瀏覽器擴充功能,例如

StaleElementReferenceException

當元素先前已定位,但目前無法存取時,元素會過時。元素不會自動重新定位;驅動程式會為元素建立參考 ID,並具有預期在 DOM 中找到它的特定位置。如果它在目前的 DOM 中找不到該元素,則使用該元素的任何動作都會導致此例外狀況。

可能原因

當發生以下情況時,可能會發生這種情況

  • 您已重新整理頁面,或頁面的 DOM 已動態變更。
  • 您已導航到不同的頁面。
  • 您已切換到另一個視窗或進入或退出框架或 iframe。

可能的解決方案

DOM 已變更

當頁面重新整理或頁面上的項目已四處移動時,頁面上仍然有一個具有所需定位器的元素,只是使用中的元素物件不再可存取它,並且必須重新定位該元素才能再次使用。這通常透過兩種方式之一完成

  • 每次要使用元素時,始終重新定位元素。在定位和使用元素之間的微秒內,元素過時的可能性很小,但有可能。缺點是這不是最有效率的方法,尤其是在遠端 Grid 上執行時。

  • 將 Web 元素與另一個儲存定位器的物件包裝在一起,並快取已定位的 Selenium 元素。當使用此包裝物件執行動作時,您可以嘗試使用先前定位的快取物件,如果它過時,可以捕獲例外狀況,使用儲存的定位器重新定位元素,然後重新嘗試該方法。這樣做效率更高,但如果頁面變更後,您使用的定位器參考了不同的元素(而不是您想要的元素),則可能會導致問題。

上下文已變更

元素物件是針對給定的上下文儲存的,因此如果您移動到不同的上下文(例如不同的視窗或不同的框架或 iframe),元素參考仍然有效,但將暫時無法存取。在這種情況下,重新定位元素沒有幫助,因為它在目前的上下文中不存在。若要修正此問題,您需要確保在使用元素之前切換回正確的上下文。

頁面已變更

這種情況是當您不僅變更了上下文,而且還導航到另一個頁面,並破壞了定位元素的上下文。您不能只從目前的上下文重新定位它,也不能切換回它是有效的活動上下文。如果這是您的錯誤原因,您必須導航回正確的位置並重新定位它。

ElementClickInterceptedException

當 Selenium 嘗試點擊元素時,但點擊反而會被另一個元素接收時,就會發生此例外狀況。在 Selenium 點擊元素之前,它會檢查元素是否可見、未被任何其他元素遮蔽且已啟用 - 如果元素被遮蔽,它將引發此例外狀況。

可能原因

UI 元素重疊

UI 上的元素通常彼此相鄰放置,但偶爾元素可能會重疊。例如,當您捲動頁面時,導覽列始終停留在視窗頂部。如果該導覽列恰好覆蓋了我們嘗試點擊的元素,Selenium 可能會認為它是可見且已啟用的,但是當您嘗試點擊它時,它將拋出此例外狀況。快顯視窗和模式視窗也是這裡常見的肇事者。

動畫

具有動畫效果的元素也可能導致此例外狀況 - 建議在嘗試點擊元素之前等待動畫停止。

可能的解決方案

使用顯式等待

顯式等待很可能在這些情況下是您最好的朋友。一個很好的方法是將 ExpectedCondition.ToBeClickable()WebDriverWait 結合使用,以等待正確的時刻。

將元素捲動到檢視畫面中

在元素超出檢視範圍,但 Selenium 仍然將元素註冊為可見的情況下(例如,導覽列重疊螢幕頂部的區塊),您可以使用 WebDriver.executeScript() 方法執行 javascript 函數來捲動(例如 WebDriver.executeScript('window.scrollBy(0,-250)')),或者您可以使用 Actions 類別與 Actions.moveToElement(element)

InvalidSessionIdException

有時您嘗試存取的會話與目前可用的會話不同

可能原因

這通常在會話已刪除時發生(例如 driver.quit()),或者在會話已變更時發生,例如當最後一個標籤頁/瀏覽器已關閉時(例如 driver.close()

可能的解決方案

檢查您的腳本中是否有 driver.close()driver.quit() 的實例,以及任何其他可能導致標籤頁/瀏覽器關閉的原因。可能是您在應該/可以之前定位元素。


無法定位驅動程式錯誤

疑難排解遺失的驅動程式可執行檔路徑。

上次修改日期:2024 年 11 月 7 日:重新措辭/重新格式化一些句子 (#1981) (77ae509e3ca)