量角器设置全局变量

时间:2015-07-03 09:33:28

标签: javascript angularjs protractor

我正在尝试在量角器上设置一个全局变量,以便在所有描述块中使用。

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

我也看了这个问题:protractor angularJS global variables

所以我试着用这种方式在conf.js中设置变量glob:

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

仍然有同样的错误。

如何在量角器测试中添加正确的全局变量?

4 个答案:

答案 0 :(得分:38)

可以在params属性的帮助下从Protractor配置文件中设置全局变量:

exports.config = {
    // ...

    params: {
        glob: 'test'
    }

    // ...
};

您可以使用browser.params.glob在规范中访问它。

请参阅reference config file

  

params对象将直接传递给Protractor实例,并可以作为browser.params从您的测试中访问。它是一个任意对象,可以包含测试中可能需要的任何内容。这可以通过命令行更改为:

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

更新

来自docs for browser.executeScript

  

如果脚本作为函数对象提供,则该函数将转换为字符串以注入目标窗口。除了脚本之外提供的任何参数都将作为脚本参数包含在内,并且可以使用arguments对象进行引用。

因此,在这种情况下,JavaScript范围不起作用,传递给browser.executeScript的函数不会有来自browser等规范的任何闭包变量。但是你可以明确地传递这些变量:

browser.executeScript(function (glob) {

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

}, browser.params.glob);

答案 1 :(得分:20)

您还可以使用onPrepare()

global中设置全局变量
onPrepare: function () {
    global.myVariable = "test";
},

然后,您只需按原样使用myVariable

这实际上就是protractorbrowser和其他内置全局变量were made available globally

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;

  // ...
}

请注意,使用此方法会污染全局范围/命名空间,请注意。

答案 2 :(得分:1)

另一种选择是使用过程变量

量角器是一个节点进程。任何节点进程都可以使用自定义节点变量启动。不确定它是如何在 Windows 中完成的(如果你知道如何做,请发表评论)但对于 mac 和任何 linux/unix 操作系统,你可以

用这样的环境变量启动量角器

MY_VAR=Dev protractor tmp/config.js

然后它将可以在您的流程中的任何地方使用,甚至可以在您的配置中使用

console.log(process.env.MY_VAR)

答案 3 :(得分:-4)

我知道答案有点晚了但是这是另一种设置可以在整个文件中使用的全局变量的方法

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
    });
});