量角器设置全局变量

IT技术 javascript angularjs protractor
2021-01-27 17:24:53

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

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个回答

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

exports.config = {
    // ...

    params: {
        glob: 'test'
    }

    // ...
};

您可以在规范中使用browser.params.glob.

请参阅参考配置文件

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

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

更新:

文档中browser.executeScript

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

因此,在这种情况下,JavaScript 范围不起作用,传递给的函数browser.executeScript不会有任何来自规范的闭包变量,例如browser. 但是您可以显式传递这些变量:

browser.executeScript(function (glob) {

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

}, browser.params.glob);
现在它完美地工作了!感谢您的时间。
2021-03-27 17:24:53
我正在尝试,唯一的问题是,如果我尝试在 browser.executeScript 的回调中获取浏览器对象,则会收到 UnknownError: unknown error: browser is not defined
2021-03-31 17:24:53
我已经为browser.executeScript答案添加了工作解决方案
2021-04-07 17:24:53

您还可以在onPrepare()using 中设置全局变量global

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;

  // ...
}

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

我一直在挣扎了一会儿-使用这种方法除了当我做类似的工作global.foo = require('./foo.js');,其中foo.js是一些简单的像module.exports = 'asdf';
2021-03-26 17:24:53

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

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

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

MY_VAR=Dev protractor tmp/config.js

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

console.log(process.env.MY_VAR)

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

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
    });
});
如果您在最外层描述内有其​​他描述,则它会起作用。这就是我不久前使用它的方式......我现在同意这不是最好的解决方案。
2021-03-21 17:24:53
嗯,这与我的示例相同,只是您将变量声明移动到了 describe 函数中。它不起作用。
2021-03-29 17:24:53
globblob不能在描述之外的范围内使用(“一些全局最外层描述”,函数())而是在外部声明它们,在整个文件中的任何地方启动和使用它们。
2021-04-06 17:24:53