9

問題:私たちのかなり大きなテストコードベースで使用してクロスプラットフォームのキーボードショートカットは

、我々は異なるキーボードショートカットを使用しています。たとえば、私たちはCTRL/COMMAND + Cを使用している選択したテキストをコピーするには、CTRL/COMMAND + Tなど新しいタブを開くには

テストは複数のプラットフォームで動作し続けるために、CTRL/COMMAND + vを貼り付けるために、は、我々は応じてCTRLCOMMAND対選択肢自動にしたいのですがターゲットブラウザがどのプラットフォームで実行されているかはです。ターゲットプラットフォームを決定するために、我々は、現在使用して、次のヘルパー関数を使用しているnavigator.appVersion

this.getControlKey = function() { 
    return browser.executeScript("return navigator.appVersion.indexOf('Mac');").then(function (isMac) { 
     return isMac ? protractor.Key.COMMAND : protractor.Key.CONTROL; 
    }); 
}; 

このアプローチの問題はgetControlKey()は約束を返すと、我々はそれを使用するたびに、私たちは約束を解決しなければならないということです明示的に:

helpers.getControlKey().then(function (controlKey) { 
    elm.sendKeys(protractor.Key.chord(controlKey, "c")); 
}); 

質問(複数可):それはposは

  1. です入れ子を避けてgetControlKey()の使用を単純化するにはどうすればいいですか?理想的には私はそれと同じくらい簡単に動作たい:

    elm.sendKeys(protractor.Key.chord(helpers.getControlKey(), "c")); 
    
  2. ターゲットプラットフォームを決定するnavigator.appVersion最善のアプローチを使用して、より良い方法はありますか。

+0

protractorがNode.js envで動作するので、私はあなたが['os.platform()'](https://nodejs.org/api/os)を使うことができると思います。html#os_os_platform)、これは同期呼び出しです(テストはブラウザで同じマシン上で実行されていることを前提としています)。 –

+1

@MichaelRadionov問題は、テストが実行されるマシンがブラウザが起動されるマシンと同じであるとは想定できません。ありがとう。 – alecxe

+1

これはクリーンな解決策ではありませんが、 'onPrepare'で' navigator'ルックアップを一回行い、そこで定数/ヘルパーを定義することができます。それは約束を回避する必要性を避けるでしょう。 –

答えて

4

ここでは2つのシナリオのために、あなたの最初の質問に答えるために、私のベストです -

  • 複数のテスターは、自分のマシンでスクリプトを実行する場合、ヘルパーメソッドは、onPrepare()機能を割り当てるに配置することができます値をすべてのテストで使用できる一定のグローバル変数に置き換えます。

  • すべてのテストが異なるマシンにランダムに割り当てられている分散プラットフォームで実行されている場合は、beforeAll()関数でそのテストの定数ローカル変数に値を代入するヘルパーメソッドを記述すると便利です。あなたの2番目の質問への移動

、我々はテスト仕様は、分度器のgetCapabilities()メソッドを使用して実行されているプラ​​ットフォームを得ることができる別の方法もあります。プラットフォームの種類を取得するための

コード -

//Below code can be placed either in `onPrepare()` function or `beforeAll()` function depending the need. 
//If the below code is placed in the `beforeAll()` function then i guess there won't be any need for a global variable. 

browser.controlKey = protractor.Key.CONTROL; //browser.controlKey is a global variable and can be accessed anywhere in the test specs 
browser.getCapabilities().then(function(capabilities){ 
    if(capabilities.caps_.platform === "MAC") 
     browser.controlKey = protractor.Key.COMMAND; 
}); 

用途:

elm.sendKeys(protractor.Key.chord(browser.controlKey, "c")); //if its stored as global variable 

はそれがお役に立てば幸いです。

+0

すばらしい答え。私が変えなければならなかったのは、「MAC」ではなく「Darwin」だけです。再度、感謝します! – alecxe

関連する問題