【问题标题】:how to set cucumber environment variables如何设置黄瓜环境变量
【发布时间】:2018-07-19 08:59:24
【问题描述】:

我有以下 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 变量?

【问题讨论】:

    标签: javascript node.js phantomjs cucumber


    【解决方案1】:

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

    这就是 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
      };
    };
    

    【讨论】:

      【解决方案2】:

      当你想定义环境变量时,你可以做类似的事情。顺便说一句,不强制添加整个路径,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"
        }
      }
      

      【讨论】:

      • 当我运行您的提案时,会打印出以下内容:> NODE_ENV=test cucumber-js -- --profile.desktop.env.browser ff fs.js:1574 return binding.realpath(pathModule._makeLong(path), options.encoding); Error: ENOENT: no such file or directory, realpath '--profile.desktop.env.browser' at Error (native) at Object.realpathSync (fs.js:1574:18)
      【解决方案3】:

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

      思路是设置环境变量:

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

        #!/bin/bash
        export BROWSER=$1
        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)

      【讨论】:

      • @acontell@Svabael 提出的所有解决方案都不适用于我的 cucumber-js,它一直打印出错误:ENOENT:没有这样的文件或目录,realpath '- -profile.desktop.env.browser' 在 Object.realpathSync (fs.js:1574:18) 处出现错误(本机)
      • 我喜欢这个解决方案的想法 - 带有参数的 start.sh 文件。我更喜欢创建一个 json 文件并从那里读取参数而不是 switch/case。
      【解决方案4】:

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

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

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

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

      &lt;JSON&gt; 将包含信息。关于浏览器类型等。希望对您有所帮助。

      【讨论】:

      • 我的问题是每个世界级都会这样做,而实际上你可能只需要设置一次
      【解决方案5】:

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

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

        转换成

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

      2. (如果默认构造函数被 setWorldConstructor(World) 覆盖)按照Cucumber.js/World Doc 的指定为 World 创建构造函数,具体而言

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

      3. 要在 World 类 (world.js) 中引用参数值,请使用以下表达式 this.parameters.browser

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-25
        • 1970-01-01
        • 2019-07-02
        • 2014-09-29
        • 1970-01-01
        • 2012-09-18
        • 2018-02-04
        相关资源
        最近更新 更多