2017-07-27 5 views
1

角度ツールを使用してAngular Webアプリケーションで統合テストを実行しています。私のWebアプリケーションは、カスタムAngularサービスApiClientを使用してAPI呼び出しを行います。私はbrowser.addMockModuleangular.module().factory()でそのサービスを模擬します。これにより、バックエンドのAPIをすべて模擬することができます!ここに私のコードは次のとおりです。分度器を使ってブラウザからWebDriverにメッセージを送信する方法は?

setup() { 
    // Out in WebDriver. 

    // Third argument 'apiRequestsMap' is made available as an argument 'map' 
    // to the anonymous function which constructs the module. 
    browser.addMockModule(
     'mockDataModule', 
     (map) => 
      angular.module('mockDataModule', []).value('apiRequestsMap', map), 
     this.apiRequestsMap_); 

    const apiModuleMaker =() => { 
    const mockModule = angular.module('mockapiModule', ['mockDataModule']); 
    mockModule.factory(
     'apiClient', 
     ($q, apiRequestsMap) => ({ 
      request: (req) => { 
      // In Browser. 
      // I can access 'apiRequestsMap'! 
      // And I use it to mock those API calls. 
      } 
     })); 
    }; 
    browser.addMockModule('mockapiModule', apiModuleMaker); 
    browser.get('www.mywebpage.com/example'); 
} 

これはかなりうまく機能し、私は私の分度器のテストでモックAPIを設定できます。重要な点は、this.apiRequestsMap_変数をWebDriverからブラウザにapiRequestsMapとして渡すことができることです。

今私は疑問に思っています - 反対にすることはできますか? ブラウザからWebDriverに変数を渡すにはどうすればよいですか?

最初に私が渡したオブジェクトapiRequestsMapを編集するだけでしたが、これは片方向転送だったようです。つまり、ブラウザでは、apiRequestsMap.aVar = 5;を設定してもthis.apiRequestsMap_.aVarは変更されません。

分度器APIを見ると、browser.getRegisteredMockModulesも見つかりました。残念ながらconsole.log(JSON.stringify(browser.getRegisteredMockModules()));[null, null, null, null, null]を出力します。

非常に多くのコードとコンテキストを投稿して申し訳ありません!私は私の頭の上にあるので、私はコードがまだ実行することができますが、私はどの部分を削除することができるか分からなかった。おそらくWebDriverで直接API呼び出しを模擬するより良い方法がありますか?これは素晴らしい回避策です。

もう1つの可能なテイクアウェイは、機能の要求/不具合を投機開発者に提出することです。

+1

どのオブジェクトに渡しますか?それは値だけを持っていますか? JSONに変換できますか? Seleniumを使用してJSコードを実行せずに直接ブラウザのコンソールにそのデータを印刷できますか? –

+0

理想的には、私が渡したいオブジェクトは、すべてJSON.stringifyで変換可能なオブジェクトの配列です。私は個人的に 'console.log(JSON.stringify(req));'でこれにアクセスできます。コード経由でアクセスする方法は不明ですが、アイデアに感謝します! – hubatish

+0

私はテストを書いているだけなので、「アサート」やその他の障害状態で「通信」することもできます。これはおそらく私が次に試すものです。 – hubatish

答えて

2

ブラウザでJavascriptコードを分度器から直接実行することができます。 JavaScriptの中のSO

は、セレンと、いくつかのJavaScriptコードを実行することにより、アクセスすることができます

window.__myvariable__ = {data:2, name: "abc"}; 

以下のような何かを行います。分度器では、

browser.executeScript('return window.__myvariable__;'); 

通常の予想される分度器の約束を返します。返されるwindow.__myvariable__オブジェクトはjson convertibleである必要があります。

これはテストコードの値を取得し、ページがリフレッシュされるまで残ります。さらに詳しい返答は

Access window object/browser scope from protractor

+0

この返品明細書はどこに置く必要がありますか?どこかのブラウザコンテキスト内。 WebDriverコードの実行時にウィンドウが未定義です。 – hubatish

+0

詳細については、https://stackoverflow.com/questions/26102132/access-window-object-browser-scope-from-protractorを参照してください。 – hubatish

+2

@hubatish、あなたの情報に従って投稿を更新しました –

関連する問題