我有以下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
我想为黄瓜设置一个环境变量,这样我就可以从命令行运行:npm test firefox
或npm test phantomjs
。
它也可以作为package.json'脚本'的一部分,如上所示,但我不确定我是否做得对。调用npm run-script firefox
如何实现它,这样在js代码中,比如world.js或browser.js我抓住了env变量?
答案 0 :(得分:2)
再一次,现在我得到了我想要首先使用的答案:
这是package.json(MIND !!!引号的语法)的一部分,如下所示:
"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
};
};
答案 1 :(得分:1)
当您想要定义env vars时,您可以执行类似的操作。顺便说一下,添加整个路径并不是强制性的,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"
}
}
答案 2 :(得分:0)
我自己没有尝试过,但是根据黄瓜的CLI文档,可以在页面末尾将数据传递给世界构造函数(World parameters )
您可以将浏览器传递给World构造函数,然后根据您的选择创建webdriver实例。
我猜你的package.json中的脚本部分可能(或多或少)如下:
"scripts": {
"test": "cucumber-js",
"firefox": "./node_modules/.bin/cucumber-js --world-parameters <JSON>"
}
其中<JSON>
将包含信息。关于浏览器类型等。希望它有所帮助。
答案 3 :(得分:0)
我决定不在node_modules或其他任何内容中更改某些内容,因为在下一个npm update <package>
之后,更改将会丢失。
想法是设置env变量:
start.sh
的目录中创建一个npm test
文件
写入start.sh
:
#!/bin/bash
export BROWSER=$1
npm test
在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();
. start.sh firefox (phantomjs, chrome)
答案 4 :(得分:0)
6axter82的解决方案在某种程度上对我有用。 为了从命令行传递变量,我必须添加以下调整。 (环境:Windows 10 / VS代码/命令提示符)
要从package.json中的scripts属性执行,需要附加
需要反斜杠()。
"firefox": "cucumber-js --world-parameters '{\"browser\":\"firefox\"}'",
转换为
"firefox": "cucumber-js --world-parameters {\\\"browser\\\":\\\"firefox\\\"}"
(如果默认构造函数被setWorldConstructor(World)覆盖),请按照Cucumber.js/World Doc(特别是
)上的指定为World创建构造函数。 function World({attach, parameters}) {
this.attach = attach
this.parameters = parameters
}
要引用World类(world.js)内部的参数值,请使用以下表达式this.parameters.browser
希望这会有所帮助。