6

特定のメソッド(パラメーター付き)がJavaScriptオブジェクトで呼び出されたことをセレンで確認したいと思います-JMockitでのある種の期待のモックですが、Javascriptとセレンで。

残念ながら、オブジェクトは非常に難読化された不透明な Web サイト パフォーマンス トラッカーであり、その内部にアクセスできないため、モックが唯一の選択肢のように思えます。または、明らかな何かを見逃していますか?

更新: 考えてみると、解決策は次のように思われます: - HTML が完全に読み込まれるのを待つ - パフォーマンス トラッカーを含む特定のスクリプト タグを削除する - トラッカーのように動作するが、後で使用するために呼び出しを記録する JavaScript モック オブジェクトを作成する

4

3 に答える 3

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>

の洞窟:

  • ウィンドウスコープの変数は名前空間ウィンドウにあります
  • 呼び出しが満たされない場合は例外が発生するため、検証ステップからの評価値は無視できます。
  • セレンIDEまたはテストドライバーにjsライブラリを追加することを忘れないでください
于 2012-06-25T09:23:35.873 に答える
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;
};
于 2012-06-26T11:33:45.920 に答える
0

関数を拡張して、セレンを操作する別の関数を呼び出すことができます (IDK SELENIUM のしくみ)

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"
于 2012-06-26T17:05:03.833 に答える