【问题标题】:how to pass command line arguments with protractor conf如何使用量角器conf传递命令行参数
【发布时间】:2019-05-03 04:25:26
【问题描述】:

我们有量角器-黄瓜框架作为 e2e 测试。到目前为止,我们使用 conf 文件并在 conf json 中静态提及环境细节。我想通过 protractor_conf 文件传递​​用户定义的参数,如下所示。

protractor protractor_conf.js -DbrowserName=chrome -DexecPlatform=(native/sauce)

并希望在 conf.js 中获取此参数并在功能部分下替换。我无法在网上获得适当的详细信息,因此将不胜感激任何帮助/建议。

【问题讨论】:

  • 这方面有什么帮助吗?

标签: node.js protractor cucumberjs


【解决方案1】:

您可以在 conf.js 文件中添加参数,然后从命令行传递 arugs

这是一个例子。

   // The params object will be passed directly to the Protractor instance,
   // and can be accessed from your test as browser.params. It is an arbitrary
   // object and can contain anything you may need in your test.
   // This can be changed via the command line as:
   //   --params.environment.Browser "Firefox"

params: {
  environment: {
   browser: 'Chrome',
   execPlatform: 'sauce',
   password: 'default'
  }
}

现在我们可以从命令行传递参数

protractor conf.js --parameters.environment.browser= Firefox --parameters.environment.execPlatform=sauce --parameters.environment.password=password123

接下来,您还可以在规范文件中引用这些参数。

describe('describe some test', function() {
  it('describe some step', function() {
    $('.password').sendKeys(browser.params.login.password);
   });
});

进行参数设置有多种优势。

  • 如果我们知道我们将在多个规范文件中使用相同的值(即登录电子邮件和密码),则参数非常适合消除不必要的重复。
  • 能够在运行时更改参数值可以更轻松地使用不同的数据运行相同的测试。
  • 提高安全性 - 在规范文件中硬编码密码并不是一个好方法。参数使您能够将它们排除在外,而是在运行时提供它们。

【讨论】:

    【解决方案2】:

    您可以使用process api 来解析命令行中的参数。

    // protractor conf.js
    
    var readParamsFromCli = function() {
    
        var paramsPair = process.argv.slice(3).filter(function(it){
            return it.startsWith('-D');
        });
    
        var params = {};
    
        paramsPair.forEach(function(pair){
            var parts = pair.split('=');
            var name = parts[0].trim().replace('-D', '');
            var value = parts[1] && parts[1].trim() || true;
            params[name] = value;
        });
    
    
        return params;
    };
    
    var params = readParamsFromCli();
    
    var capbilities = {
        browserName: params.browserName || 'chrome',
        platform: params.execPlatform
    };
    
    exports.config = {
        ...
        capbilities: capbilities
    
    };
    

    然后你可以运行case如下:

    protractor protractor_conf.js -DbrowserName=chrome -DexecPlatform=native
    

    【讨论】:

      【解决方案3】:

      您可以将配置拆分为多个配置文件。例如 protractor-chrome.conf.js:

      const baseConf = require('./protractor.conf').config;
      
      exports.config = Object.assign({
        capabilities: {
          browserName: 'chrome'
        }
      }, baseConf);
      

      【讨论】:

      • 谢谢。我有这个想法。用这种方法我有一个问题。在执行Object.assign() 时,我们分配了一个新属性,例如上面提到的功能。但是如何替换现有键的值。例如,我在主配置中有cucumberOpts: { tags:['@regression'] } 作为基线模板。在执行回归套件时,我从命令行获取要执行的标签,并通过变量中的 yargs 获取它。有了这个Object.assign(),我怎样才能将现有的标签数组值替换为需要的值?
      • 那你就不要用我的方案了,直接把命令行参数传入protractorprotractor conf.js --cucumberOpts.tags @regression
      【解决方案4】:

      这将类似于第二个示例,但直接使用配置文件。

      const args = require('minimist')(process.argv.slice(2));
      exports.config = {
        //your config stuff
        baseUrl: args.Url ? args.URL : <your default>,
        capabilities: {
         'browserName': 'chrome',
         chromeOptions: {
           args: [args.Options]
          },
         }
      }
      

      然后在你的 package.json 脚本中像这样:

      "e2e": "protractor protractor.conf.js --Url=http://test.com" --Options=--headless
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-22
        • 2023-03-25
        • 2016-03-25
        • 2021-05-21
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 2017-03-10
        相关资源
        最近更新 更多