2016-12-16 81 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)库。 –