2012-03-07 43 views
0

我有一個問題,我一直在努力了幾天。錄製用戶輸入並確認在Firefox插件sdk

我正在爲firefox編寫一個userInput錄製系統,以便使用它來記錄基於Web的應用程序的測試。

我在表單字段上記錄onchange事件並使用contentScript將其保存在商店中,併爲每個字段的onchange事件添加了監聽器。

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

我遇到的問題是,當確認是由場變化引發的任何確認響應現場的變化,這是錯誤的順序運行測試之前記錄。

我認爲這是因爲頁面的onchange是在addon contentscript之前被評估的,有沒有什麼方法可以改變這個順序?

我希望有一個解決方案或解決方法,不使用超時或更改基本頁面內容。 我還需要能夠記錄由其他事件引起的確認,如頁面加載。

回答

1

問題是頁面和你的內容腳本在同一個元素上註冊了事件處理程序 - 它們被調用的順序是未定義的(不過,我認爲在通過addEventListener添加任何聽衆之前,Firefox始終調用onchange) 。您需要在網頁執行前獲取change事件並觸發其他操作。解決方案將在頂層的capture phase期間捕獲事件。在捕獲階段,事件「陷入」實際元素,並在氣泡階段開始之前觸發捕獲事件偵聽器,並且事件再次觸發常規事件偵聽器。像這樣的東西應該工作:

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

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

此不再在各個領域,而是在window一級註冊事件偵聽器。請注意,如果網頁收聽inputkeypress之類的其他事件,則這無濟於事。

+0

謝謝您的回覆。我將您建議的偵聽器添加到observeWindow()函數中,但是在記錄確認響應之後,偵聽器函數仍會觸發。 :( – Arth 2012-03-07 13:25:38

+0

順便說一下,在observeWindow()函數中設置window.onchange時,實際上會在兩個窗口監聽器函數之後觸發,以便更改泡泡和捕獲階段。:( – Arth 2012-03-07 13:34:02

+0

對不起,當時是白癡,確認對話框是實際上是由應用程序中的複選框和收音機的onclick提示 - 您的方法代表由onchange發起的確認 – Arth 2012-03-07 14:20:33