2012-03-07 6 views
0

私は数日間苦労しているという問題があります。ユーザーの入力を記録し、Firefoxのアドオンで確認するsdk

私は、Webベースのアプリケーションのテストを記録するためにfirefoxのuserInputレコーディングシステムを作成しています。

フォームフィールドにonchangeイベントを記録し、各フィールドのonchangeイベントにリスナーが追加されたcontentScriptを使用してストアに保存します。

field.addEventListener('change', recordFieldChange); 

私も、JS window.confirm法の観察者サービスベースのオーバーライドを使用して応答を確認し、ユーザを記録しています。

var obs = require("observer-service"); 

obs.add("content-document-global-created", observeWindow); 

function observeWindow(subject) { 
    var window = subject.wrappedJSObject; 
    var standardConfirm = window.confirm; 

    window.confirm = function(pMessage) { 
    response = standardConfirm(pMessage); 
    recordConfirm(response); 
    return response; 
    } 
}; 

私が午前のトラブルは確認がフィールドの変更によってトリガーされるすべての確認応答は、テストを実行するための誤った順序でフィールドの変更、前に記録されているということです。

これは、ページのオンチェンジがアドオンのcontentscriptの前に評価されているためです。このオーダーを変更する方法はありますか?

タイムアウトを使用しない、または基本的なページの内容を変更しないでください。 私はまた、ページの読み込みのような他のイベントによって引き起こされた確認を記録する必要があります。

答えて

1

問題は、ページとコンテンツスクリプトが同じ要素のイベントハンドラを登録し、呼び出される順序が未定義です(ただし、addEventListenerで追加されるリスナーの前にFirefoxが一貫してonchangeを呼び出すと思います) 。 Webページが実行する前にchangeイベントを取得し、追加アクションをトリガーします。その解決策は、トップレベルのcapture phaseの間にイベントをキャッチすることです。キャプチャフェーズでは、イベントは実際の要素に「シンクイン」し、バブルフェーズが開始される前にイベントリスナのキャプチャをトリガし、イベントは再び通常のイベントリスナをトリガします。この動作するはずのような何か:

window.addEventListener("change", recordFieldChange, true); 

function recordFieldChange(event) 
{ 
    var field = event.target; 
    ... 
} 

これは、もはや個々のフィールドではなく、むしろwindowレベルでのイベントリスナーを登録していません。ウェブページがinputkeypressのような別のイベントを聴いている場合、これはあまり役に立ちません。

+0

ご返信ありがとうございます。 observeWindow()関数に提案したリスナーを追加しますが、確認応答が記録された後もリスナー関数は起動します。 :( – Arth

+0

ちなみに、observeWindow()関数でwindow.onchangeを設定すると、これはバブルとキャプチャフェーズの変更のためのウィンドウリスナー関数の後に実際に起動します: – Arth

+0

申し訳ありません、確認ダイアログは実際にアプリケーションのチェックボックスとラジオのonclickによって促されます - あなたのメソッドはonchangeによって発生した確認を表します – Arth

関連する問題