2016-12-16 84 views
0

我正在測試的網站有一個通知邏輯,它在屏幕底部顯示一條消息,並將它保留一秒鐘然後發送出去。當通知顯示時,它隱藏了其他元素,這使得我的測試不穩定。我盡力找出通知何時顯示(業務邏輯顯示時)並解僱它,但是我偶爾會檢測到新代碼在通知顯示時不知道的情況。Selenium:是否有像DOM元素中插入新元素的事件

有沒有一種方法(使用Selenium)來訂閱像「插入到DOM中的新元素」這樣的事件。在回調中忽略通知將一勞永逸地解決我的問題。

+0

請閱讀[問]。請提供您嘗試過的代碼以及執行結果,包括任何錯誤消息等。還請提供指向頁面和/或相關HTML的鏈接。 – JeffC

回答

0

Selenium不支持此用例,但您可以在javascript中使用MutationObserver來實現該功能。我不知道你使用的是寫Selenium測試用什麼語言,但在C#中,你可以創建擴展方法如下

public static void StartWatchingForContentChange(this RemoteWebDriver driver, string containerId, int timeout = SearchElementDefaultTimeout) 
{ 
    driver.ExecuteScript(@"var $$expectedId = arguments[0]; 
__selenium_observers__ = window.__selenium_observers__ || {}; 
(function(){   
var target = document.getElementById($$expectedId); 
__selenium_observers__[$$expectedId] = { 
     observer: new MutationObserver(function(mutations) { 
      __selenium_observers__[$$expectedId].occured = true; 
      __selenium_observers__[$$expectedId].observer.disconnect(); 
     }), 
     occured:false 
}; 
var config = { attributes: true, childList: true, characterData: true, subtree: true }; 
__selenium_observers__[$$expectedId].observer.observe(target, config); 
})();", containerId);  
} 

public static bool WasContentChanged(this RemoteWebDriver driver, string containerId) 
{ 
    return (bool) driver.ExecuteScript("return window.__selenium_observers__ && window.__selenium_observers__[arguments[0]].occured;", containerId) 
} 

您可以使用某種計時器的異步調用WasContentChanged方法和內容的變化作出反應。請閱讀MutationObserver文檔以獲取更多詳細信息https://developer.mozilla.org/pl/docs/Web/API/MutationObserver

+0

也可以。作爲從這個建議開始的筆記,我最終使用了[Mutation Summary](https://github.com/rafaelw/mutation-summary)庫。 –