如何设置黄瓜环境变量

how to set cucumber environment variables

我有以下 package.json:

{
  "name": "newcucumber",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "./node_modules/.bin/cucumber-js",
    "firefox": "./node_modules/.bin/cucumber-js -- --profile.desktop.env.browser ff"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "chromedriver": "^2.24.1",
    "cucumber": "^1.3.0",
    "firefox-profile": "^0.4.2",
    "geckodriver": "^1.1.2",
    "phantomjs-prebuilt": "^2.1.12",
    "selenium-webdriver": "^3.0.0-beta-2"
  }
}

我运行程序使用:

npm test

我想为 Cucumber 设置一个环境变量,这样我就可以从命令行 运行:npm test firefoxnpm test phantomjs.

它也可以作为 package.json 'scripts' 的一部分,如上所示,但我不确定我是否做对了。调用 npm run-script firefox

如何实现,在js代码中,如world.js或browser.js抓取env变量?

当你想定义环境变量时,你可以做类似的事情。顺便说一句,并不是必须要添加整个路径,npm 会弄清楚

{
  "name": "newcucumber",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "cucumber-js",
    "firefox": "NODE_ENV=test cucumber-js -- --profile.desktop.env.browser ff"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "chromedriver": "^2.24.1",
    "cucumber": "^1.3.0",
    "firefox-profile": "^0.4.2",
    "geckodriver": "^1.1.2",
    "phantomjs-prebuilt": "^2.1.12",
    "selenium-webdriver": "^3.0.0-beta-2"
  }
}

我自己还没有尝试过,但是根据 cucumber 的 CLI 文档,有一种方法可以将数据传递给世界构造函数(World parameters,在页面末尾)

您可以将浏览器传递给 World 构造函数,让它根据您的选择创建 webdriver 实例。

我猜你的 package.json 中的脚本部分可能(或多或少)如下:

"scripts": {
    "test": "cucumber-js",
    "firefox": "./node_modules/.bin/cucumber-js --world-parameters <JSON>"
  }

其中 <JSON> 将包含信息。关于浏览器类型等,希望对你有帮助

我决定不更改 node_modules 或其他任何内容,因为在下一个 npm update <package> 之后更改将丢失。

想法是设置环境变量:

  1. 在调用 npm test 的目录中创建一个 start.sh 文件。
  2. 写在start.sh:

    #!/bin/bash
    export BROWSER=
    npm test
    
  3. 在您的 browser.js 或您调用浏览器的文件中键入:

    var chrome = require('chromedriver'),
    phantom = require('phantomjs-prebuilt'),
    firefox = require('selenium-webdriver/firefox'),
    webdriver = require('selenium-webdriver');
    ...
    
    console.log("What was passed into global env: ", process.env.BROWSER);
    switch(process.env.BROWSER) {
        case 'firefox':                             //Setup Firefox
            var capabilities = {
                'browserName' : 'firefox'
            }
            break; 
        case 'phantomjs':
            var capabilities = {
                'browserName' : 'phantomjs'
            }
            break;
        case 'chrome':
            var capabilities = {
                'browserName' : 'chrome'
            }
            break;
        }
    
    return browserHandle = new webdriver
        .Builder()
        .withCapabilities(capabilities)
        .build();
    
    1. 致电. start.sh firefox (phantomjs, chrome)

再一次,现在我得到了我最初想使用的答案:

这就是 package.json 的一部分(注意!!!引号的语法)的样子:

"scripts": {
    "test": "cucumber-js",
    "firefox": "cucumber-js --world-parameters '{\"browser\":\"firefox\"}'",
    "chrome": "cucumber-js --world-parameters '{\"browser\":\"chrome\"}'",
    "safari": "cucumber-js --world-parameters '{\"browser\":\"safari\"}'",
    "phantomjs": "cucumber-js --world-parameters '{\"browser\":\"phantomjs\"}'"
  }

JSON 对象被传递给 World。在您的 World.js 中,代码如下所示:

module.exports = function() {
  this.World = function(input) {
    console.log(input.browser); // Do whatever you want with the JSON (input) object
  };
};

6axter82 的解决方案对我有用……在某种程度上。 为了从命令行传递变量,我必须添加以下调整。 (环境:Windows10/VS 代码/命令提示符)

  1. 要从 package.json 内的脚本 属性 执行,附加 需要反斜杠 ()。
    "firefox": "cucumber-js --world-parameters '{\"browser\":\"firefox\"}'",

    转换为

    "firefox": "cucumber-js --world-parameters {\\"browser\\":\\"firefox\\"}"

  2. (如果默认构造函数被 setWorldConstructor(World) 覆盖)按照 Cucumber.js/World Doc 中指定的方式为世界创建构造函数,特别是

    function World({attach, parameters}) { this.attach = attach this.parameters = parameters }

  3. 要引用世界class(world.js)中的参数值,使用以下表达式this.parameters.browser

希望对您有所帮助。