如何在 Angularjs Protractor 中使用命令行参数?

IT技术 javascript angularjs selenium webdriver protractor
2021-01-25 20:55:11

我正在使用 Protractor 执行一些端到端测试,我想通过命令行传递登录凭据,而不是将它们存储在规范文件中。我找到了一篇有人使用过的帖子process.argv.forEach,但是如何存储这些值并在另一个规范文件中使用它们?我有一个文件login-spec.js,我想在其中使用命令行参数。

谢谢!

2个回答

参考配置中,这部分可能很有趣:

  // The params object will be passed directly to the protractor instance,
  // and can be accessed from your test. 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.login.user 'Joe'
  params: {
    login: {
      user: 'Jane',
      password: '1234'
    }
  },

您可以在代码中像这样访问 params 对象: browser.params.login.user

所以在你的情况下,如果你像这样调用量角器:

protractor ... --params.login.user=abc --params.login.password=123

您可以像这样在代码中访问这些变量:

browser.params.login.userbrowser.params.login.password

奇迹般有效!但是,由于它将参数作为字符串,因此处理布尔值有点混乱。我的提示:如果您的代码中有默认值,请将它们设置为 false 并在必要时从 CLI 覆盖它们(例如量角器 ... --params.myFlag=true),因为“true”和“false”实际上都是假的. 如果你必须通过 CLI 传递 false,你必须使用唯一的错误字符串:量角器 ... ---params.myFlag= (最后留空,是的,它有效,就像看起来一样错误! )
2021-03-13 20:55:11
如何将 url 参数设置为另一个参数而不是值?ex --params.url=params.stagingUrl 不起作用
2021-03-18 20:55:11
如果您尝试在命令行“protractor --params.myArray=[1,2,3]”上传递一个数组,它将被视为您需要 JSON.parse(browser.params.myArray); 的字符串;
2021-03-20 20:55:11
另一个快速说明,命令行上的 = 符号是可选的。所以“protractor --params.myNum=50 ...”等价于“protractor --params.myNum 50 ...” 本来我以​​为答案中的评论是错误的。
2021-03-21 20:55:11
@artdias90:我认为这不可能直接实现。但是,如果您已将 URL 存储在变量中,则可以重用该变量。或者您可以在 shell 中提前一行引入一个。我创建了一个包含所有设置变量的大散列,由主环境的名称索引,我只传递环境的名称作为量角器参数。大致:Environments = {test: {url: '...', name: '...', ...}, live: {...}, ...}--params.env=test.
2021-03-24 20:55:11

接受答案的缺点 - 这些变量将在浏览器启动时可用。因此,如果您打算在配置中使用它们(创建 if/else 逻辑),这将不起作用。

解决方法

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

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

MY_VAR=Dev protractor tmp/config.js

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

console.log(process.env.MY_VAR)