web-dev-qa-db-ja.com

分度器セットのグローバル変数

すべての記述ブロックで使用する分度器にグローバル変数を設定しようとしています。

var glob = 'test';

describe('glob test', function () {
    it('should set glob', function () {
        browser.get('http://example.com/test');
        browser.executeScript(function () {
            window.glob = glob;
        });
    });    
});

しかし、これは私に次のエラーを返します:

Message:
[firefox #2]      UnknownError: glob is not defined

私もこの質問を見ました: 分度器angleJSグローバル変数

だから私はこの方法でconf.jsの変数globを設定しようとしました:

exports.config = {
  ...,
  onPrepare: function () {
      global.glob = 'test';
  }
};

それでも、同じエラーが発生します。

分度器テストで適切にグローバル変数を追加するにはどうすればよいですか?

20
pietrovismara

paramsプロパティを使用して、Protractorの設定ファイルからグローバルを設定できます。

exports.config = {
    // ...

    params: {
        glob: 'test'
    }

    // ...
};

また、browser.params.globを使用して、仕様でアクセスできます。

参照設定ファイル を参照してください。

ParamsオブジェクトはProtractorインスタンスに直接渡され、テストからbrowser.paramsとしてアクセスできます。これは任意のオブジェクトであり、テストに必要なものをすべて含めることができます。これは、コマンドラインから次のように変更できます。

protractor conf.js --params.glob 'other test'

更新:

docs for browser.executeScript から:

スクリプトが関数オブジェクトとして提供されている場合、その関数はターゲットウィンドウに挿入するための文字列に変換されます。スクリプトに加えて提供される引数は、スクリプト引数として含まれ、引数オブジェクトを使用して参照できます。

したがって、この場合のJavaScriptスコープは機能しません。browser.executeScriptに渡される関数には、browserなどの仕様からのクロージャー変数がありません。ただし、これらの変数を明示的に渡すことができます。

browser.executeScript(function (glob) {

    // use passed variables on the page
    console.log(glob);

}, browser.params.glob);
39

globalを使用して、onPrepare()でグローバル変数を設定することもできます。

onPrepare: function () {
    global.myVariable = "test";
},

次に、テスト全体でmyVariableをそのまま使用します。

これは、実際にprotractorbrowserおよびその他の組み込みグローバル変数 グローバルに利用可能になった

Runner.prototype.setupGlobals_ = function(browser_) {
  // Export protractor to the global namespace to be used in tests.
  global.protractor = protractor;
  global.browser = browser_;
  global.$ = browser_.$;
  global.$$ = browser_.$$;
  global.element = browser_.element;
  global.by = global.By = protractor.By;

  // ...
}

このアプローチでは、グローバルスコープ/ネームスペースを汚染することに注意してください。

22
alecxe