一尘不染

selenium:是否有类似“在DOM中插入新元素”之类的事件

selenium

我正在测试的站点具有通知逻辑,该通知逻辑会在屏幕底部显示一条消息,将其保留一秒钟,然后将其发送出去。显示通知时,它会隐藏其他元素,这会使我的测试不稳定。我尽力弄清何时显示通知(当业务逻辑显示通知时)并将其关闭,但是我时不时地发现新情况,我的代码不知道通知何时显示。

有没有一种方法(使用Selenium)来订阅诸如“在DOM中插入新元素”之类的事件。取消通知的回调将彻底解决我的问题。


阅读 245

收藏
2020-06-26

共1个答案

一尘不染

Selenium不支持开箱即用,但您可以使用javascript中的MutationObserver来实现。我不知道您使用什么语言编写硒测试,但是在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

2020-06-26