無法定位驅動程式錯誤
疑難排解遺失的驅動程式可執行檔路徑。
CSS 和 XPath 選擇器有時難以正確取得。
您嘗試使用的 CSS 或 XPath 選擇器包含無效字元或無效查詢。
透過驗證器服務執行您的選擇器
或使用瀏覽器擴充功能來取得已知良好的值
在您嘗試定位元素的確切時刻,找不到該元素。
當元素先前已定位,但目前無法存取時,元素會過時。元素不會自動重新定位;驅動程式會為元素建立參考 ID,並具有預期在 DOM 中找到它的特定位置。如果它在目前的 DOM 中找不到該元素,則使用該元素的任何動作都會導致此例外狀況。
當發生以下情況時,可能會發生這種情況
DOM 已變更
當頁面重新整理或頁面上的項目已四處移動時,頁面上仍然有一個具有所需定位器的元素,只是使用中的元素物件不再可存取它,並且必須重新定位該元素才能再次使用。這通常透過兩種方式之一完成
每次要使用元素時,始終重新定位元素。在定位和使用元素之間的微秒內,元素過時的可能性很小,但有可能。缺點是這不是最有效率的方法,尤其是在遠端 Grid 上執行時。
將 Web 元素與另一個儲存定位器的物件包裝在一起,並快取已定位的 Selenium 元素。當使用此包裝物件執行動作時,您可以嘗試使用先前定位的快取物件,如果它過時,可以捕獲例外狀況,使用儲存的定位器重新定位元素,然後重新嘗試該方法。這樣做效率更高,但如果頁面變更後,您使用的定位器參考了不同的元素(而不是您想要的元素),則可能會導致問題。
上下文已變更
元素物件是針對給定的上下文儲存的,因此如果您移動到不同的上下文(例如不同的視窗或不同的框架或 iframe),元素參考仍然有效,但將暫時無法存取。在這種情況下,重新定位元素沒有幫助,因為它在目前的上下文中不存在。若要修正此問題,您需要確保在使用元素之前切換回正確的上下文。
頁面已變更
這種情況是當您不僅變更了上下文,而且還導航到另一個頁面,並破壞了定位元素的上下文。您不能只從目前的上下文重新定位它,也不能切換回它是有效的活動上下文。如果這是您的錯誤原因,您必須導航回正確的位置並重新定位它。
當 Selenium 嘗試點擊元素時,但點擊反而會被另一個元素接收時,就會發生此例外狀況。在 Selenium 點擊元素之前,它會檢查元素是否可見、未被任何其他元素遮蔽且已啟用 - 如果元素被遮蔽,它將引發此例外狀況。
UI 元素重疊
UI 上的元素通常彼此相鄰放置,但偶爾元素可能會重疊。例如,當您捲動頁面時,導覽列始終停留在視窗頂部。如果該導覽列恰好覆蓋了我們嘗試點擊的元素,Selenium 可能會認為它是可見且已啟用的,但是當您嘗試點擊它時,它將拋出此例外狀況。快顯視窗和模式視窗也是這裡常見的肇事者。
動畫
具有動畫效果的元素也可能導致此例外狀況 - 建議在嘗試點擊元素之前等待動畫停止。
使用顯式等待
顯式等待很可能在這些情況下是您最好的朋友。一個很好的方法是將 ExpectedCondition.ToBeClickable()
與 WebDriverWait
結合使用,以等待正確的時刻。
將元素捲動到檢視畫面中
在元素超出檢視範圍,但 Selenium 仍然將元素註冊為可見的情況下(例如,導覽列重疊螢幕頂部的區塊),您可以使用 WebDriver.executeScript()
方法執行 javascript 函數來捲動(例如 WebDriver.executeScript('window.scrollBy(0,-250)')
),或者您可以使用 Actions 類別與 Actions.moveToElement(element)
。
有時您嘗試存取的會話與目前可用的會話不同
這通常在會話已刪除時發生(例如 driver.quit()
),或者在會話已變更時發生,例如當最後一個標籤頁/瀏覽器已關閉時(例如 driver.close()
)
檢查您的腳本中是否有 driver.close()
和 driver.quit()
的實例,以及任何其他可能導致標籤頁/瀏覽器關閉的原因。可能是您在應該/可以之前定位元素。
疑難排解遺失的驅動程式可執行檔路徑。
瞭解更多或查看贊助商的完整列表。