Глобальные переменные

Я пытаюсь установить глобальную переменную на транспортир для использования во всех описываемых блоках.

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

Я также рассмотрел этот вопрос: глобальные переменные углового перемещения транспортировщика

поэтому я попытался установить переменную glob в conf.js следующим образом:

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

Тем не менее, с той же ошибкой.

Как я могу добавить правильные глобальные переменные в испытаниях транспортира?

Ответы

Ответ 1

С помощью свойства params можно установить глобальные значения из конфигурационного файла Protractor:

exports.config = {
    // ...

    params: {
        glob: 'test'
    }

    // ...
};

И вы можете получить к нему доступ в спецификациях с помощью browser.params.glob.

См. файл конфигурации ссылок.

Объект params будет передан непосредственно экземпляру Protractor и может быть доступен из вашего теста в качестве browser.params. Это произвольный объект и может содержать все, что вам может понадобиться в вашем тесте. Это можно изменить с помощью командной строки как:

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

Update:

В docs для browser.executeScript:

Если script предоставляется как объект функции, эта функция будет преобразована в строку для инъекции в целевое окно. Любые аргументы, предоставленные в дополнение к script, будут включены в качестве аргументов script и могут ссылаться на объект arguments.

Итак, область JavaScript в этом случае не работает, функция, переданная в browser.executeScript, не будет иметь никаких переменных закрытия из спецификации типа browser. Но вы можете явно передать эти переменные:

browser.executeScript(function (glob) {

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

}, browser.params.glob);

Ответ 2

Вы также можете установить глобальные переменные в onPrepare() с помощью global:

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

Затем вы просто используете myVariable во всех тестах, как есть.

На самом деле, как protractor, browser и другие встроенные глобальные переменные были доступны глобально:

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;

  // ...
}

Обратите внимание, что при таком подходе вы загрязняете свое глобальное пространство/пространство имен, будьте осторожны.

Ответ 3

Я знаю, что немного опоздал на ответ, но вот еще один способ установки глобальных переменных, которые можно использовать во всем файле

describe("Some Global most outer describe", function(){
    var glob = "some global variable";
    var blob = "some other global variable";

    it('should test glob', function(){
        expecte(glob).toEqual("some global variable");
    });

    it('should test blob', function(){
        expecte(glob).toEqual("some other global variable");
    });

    describe('Some inner describe', function(){
        //Some other inner tests can also see glob and blob
    });
});