2016-12-16 6 views
0

私がテストしているサイトには、画面の下部にメッセージを表示して1秒間メッセージを残してから送信する通知ロジックがあります。通知が表示されると、他の要素が表示されなくなり、テストが不安定になります。通知が表示された時点(ビジネスロジックが表示されているとき)を把握してそれを却下するように努力しましたが、今度は通知が表示されるタイミングを自分のコードで認識しません。Selenium: "DOMに新しい要素が挿入されました"のようなイベントはありますか?

"新しい要素がDOMに挿入されました"のようなイベントを購読する方法(Seleniumを使用)がありますか?そのコールバックの通知を却下すると、私の問題は一度解決されます。

+0

[ask]をお読みください。試したコードやエラーメッセージなどの実行結果を提供してください。ページや関連するHTMLへのリンクも提供してください。 – JeffC

答えて

0

Seleniumは、このユースケースをそのまま使用することはできませんが、JavaScriptでMutationObserverを使用することで達成できます。私はあなたがセレンテストを書くために使用している言語を知らないが、あなたは非同期WasContentChangedメソッドを呼び出すために、タイマーのいくつかの種類を使用して、コンテンツの変更のために反応することができ

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) 
} 

に従うように、C#であなたが拡張メソッドを作成することができます。詳細についてはMutationObserverのドキュメントをお読みくださいhttps://developer.mozilla.org/pl/docs/Web/API/MutationObserver

+0

それも動作します。この提案から始まるメモとして、私は[突然変異の概要](https://github.com/rafaelw/mutation-summary)ライブラリを使用して終了しました。 –

関連する問題