我正在测试的网站有一个通知逻辑,它在屏幕底部显示一条消息,并将它保留一秒钟然后发送出去。当通知显示时,它隐藏了其他元素,这使得我的测试不稳定。我尽力找出通知何时显示(业务逻辑显示时)并解雇它,但是我偶尔会检测到新代码在通知显示时不知道的情况。Selenium:是否有像DOM元素中插入新元素的事件
有没有一种方法(使用Selenium)来订阅像“插入到DOM中的新元素”这样的事件。在回调中忽略通知将一劳永逸地解决我的问题。
我正在测试的网站有一个通知逻辑,它在屏幕底部显示一条消息,并将它保留一秒钟然后发送出去。当通知显示时,它隐藏了其他元素,这使得我的测试不稳定。我尽力找出通知何时显示(业务逻辑显示时)并解雇它,但是我偶尔会检测到新代码在通知显示时不知道的情况。Selenium:是否有像DOM元素中插入新元素的事件
有没有一种方法(使用Selenium)来订阅像“插入到DOM中的新元素”这样的事件。在回调中忽略通知将一劳永逸地解决我的问题。
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
也可以。作为从这个建议开始的笔记,我最终使用了[Mutation Summary](https://github.com/rafaelw/mutation-summary)库。 –
请阅读[问]。请提供您尝试过的代码以及执行结果,包括任何错误消息等。还请提供指向页面和/或相关HTML的链接。 – JeffC