2012-06-21 29 views
6

我想驗證與硒驗證某些方法(帶參數)被調用 JavaScript對象 - 類似的期望嘲弄與JMockit,但在JavaScript和硒。如何驗證在硒對象上使用JavaScript對象調用某個方法?

不幸的是,對象是嚴重隱瞞不透明的網站性能跟蹤器,我無法訪問它的內部,所以嘲笑似乎是我唯一的選擇。或者我想念一些明顯的東西?

更新:經過考慮之後,它在我看來,解決辦法是: - 等待HTML完全加載 - 刪除包含業績跟蹤 某些腳本標籤 - 創建JavaScript的模仿對象行爲就像跟蹤,但記錄的調用的後來用

回答

2

JsMockito顯然是最強大的解決方案。它適用於每種方法,它經過了全面測試,並提供了一些不錯的附加功能(如提到的交互記錄)。

也就是說,如果您不想將的另一個依賴項添加到您的項目中,只需使用它一次,就可以手動執行此項工作。

window.origWwa = window.wwa; 
window.wwa = function() { 
    if (arguments[0] === 'Trefferliste Webadresse') { 
     window.wwaFired = true; 
    } 
    window.origWwa.apply(this, arguments); 
}; 

...做你的工作......

if (!window.wwaFired) { 
    // do something, either throw an error or console.log("oops") 
} 

如果要運行腳本是在<script>標籤和您所選擇的瀏覽器是Firefox,可以勾了onafterscriptexecute事件通過任何函數。這是短,但我認爲你不能確保正確的說法叫:

document.getElementById('script').onafterscriptexecute = function() { 
    window.wwaFired = true; 
}; 
+0

很好的解決方案 - 對於單一調用可以很好地工作,但對於複雜的交互嘲笑更好 –

+0

絕對。這是一個簡單的一次性計時器。如果我不得不使用它兩次或想要更多,我會採取JsMockito。 –

3

好吧,終於明白了。嘲笑框架的選擇是:jsmockito和jshamcrest(jsmockito需要它) - http://jsmockito.org/

這是和平的蛋糕。

間諜現有對象:

<tr> 
<td>storeEval</td> 
<td>window.wwa = JsMockito.spy(window.wwa$); </td> 
<td>mockedWipe</td> 

...做任何必要的

和驗證:

<tr> 
<td>storeEval</td> 
<td>JsMockito.verify(window.wwa$).logAction('Trefferliste Webadresse');</td> 
<td></td> 

山洞是:

  • 窗範圍的變量在命名空間窗口
  • 從驗證步驟評估valie可以忽略不計,因爲你會得到一個異常,如果調用不滿意
  • 不要忘了JS庫添加到您的硒IDE或測試驅動程序
0

您可以擴展函數調用另一個函數硒工作(IDK如何硒作品)

Function.prototype.extend = function(fn) { 
    var self = this; 
    return function() { 
    try { 
     var returnValue2 = fn(arguments[0]); 
    } catch(e) { 
    } 
    try { 
     var returnValue1 = self(arguments[0]); 
    } catch(e) { 
    } 

    return returnValue1 && returnValue2; 
    }; 
}; 

var object = {a_function:function(arg){ 
    alert(arg) 
}}; 

object.a_function('simple'); // alerts "simple" 
object.a_function = object.a_function.extend(function(arg){ 
    alert('prealert for '+arg) 
}); 

object.a_function('simple'); // alerts "prealert for simple" and then alerts "simple"