Skip to content

Commit 76d069a

Browse files
authored
Merge pull request #103 from browserstack/headless-browsers
Enable headless key in run_settings
2 parents 6eb5042 + 8c7a948 commit 76d069a

File tree

9 files changed

+195
-1
lines changed

9 files changed

+195
-1
lines changed

bin/commands/runs.js

+3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ module.exports = function run(args) {
4545
//accept the local identifier from env variable if provided
4646
utils.setLocalIdentifier(bsConfig);
4747

48+
// run test in headed mode
49+
utils.setHeaded(bsConfig, args);
50+
4851
// Validate browserstack.json values and parallels specified via arguments
4952
return capabilityHelper.validate(bsConfig, args).then(function (cypressJson) {
5053

bin/helpers/capabilityHelper.js

+6
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ const caps = (bsConfig, zip) => {
8484
if (!Utils.isUndefined(bsConfig.run_settings.cypress_version)){
8585
obj.cypress_version = bsConfig.run_settings.cypress_version;
8686
}
87+
88+
if (!Utils.isUndefined(bsConfig.run_settings.headless) && String(bsConfig.run_settings.headless) === "false"){
89+
obj.headless = bsConfig.run_settings.headless;
90+
} else {
91+
logger.info(`Running your tests in headless mode. Use --headed arg to run in headful mode.`);
92+
}
8793
}
8894

8995
if(obj.parallels === Constants.cliMessages.RUN.DEFAULT_PARALLEL_MESSAGE) obj.parallels = undefined

bin/helpers/constants.js

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ const cliMessages = {
9393
ENV_DESCRIPTION: "Specify the environment variables for your spec files",
9494
SYNC_DESCRIPTION: "Makes the run command in sync",
9595
BUILD_REPORT_MESSAGE: "See the entire build report here",
96+
HEADED: "Run your tests in a headed browser instead of a headless browser",
9697
},
9798
COMMON: {
9899
DISABLE_USAGE_REPORTING: "Disable usage reporting",

bin/helpers/utils.js

+6
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,12 @@ exports.setLocalIdentifier = (bsConfig) => {
333333
}
334334
};
335335

336+
exports.setHeaded = (bsConfig, args) => {
337+
if (!this.isUndefined(args.headed) && args.headed === true) {
338+
bsConfig.run_settings.headless = false;
339+
}
340+
};
341+
336342
exports.getNumberOfSpecFiles = (bsConfig, args, cypressJson) => {
337343
let testFolderPath = cypressJson.integrationFolder || Constants.DEFAULT_CYPRESS_SPEC_PATH;
338344
let globSearchPatttern = bsConfig.run_settings.specs || `${testFolderPath}/**/*.+(${Constants.specFileTypes.join("|")})`;

bin/runner.js

+5
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,11 @@ var argv = yargs
200200
default: false,
201201
describe: Constants.cliMessages.RUN.SYNC_DESCRIPTION,
202202
type: "boolean"
203+
},
204+
'headed': {
205+
default: false,
206+
describe: Constants.cliMessages.RUN.HEADED,
207+
type: "boolean"
203208
}
204209
})
205210
.help('help')

bin/templates/configTemplate.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ module.exports = function () {
6060
"npm_dependencies": {
6161
},
6262
"package_config_options": {
63-
}
63+
},
64+
"headless": true
6465
},
6566
"connection_settings": {
6667
"local": false,

test/unit/bin/commands/runs.js

+16
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const chai = require("chai"),
55
const Constants = require("../../../../bin/helpers/constants"),
66
logger = require("../../../../bin/helpers/logger").winstonLogger,
77
testObjects = require("../../support/fixtures/testObjects");
8+
const { setHeaded } = require("../../../../bin/helpers/utils");
89

910
const proxyquire = require("proxyquire").noCallThru();
1011

@@ -98,6 +99,7 @@ describe("runs", () => {
9899
capabilityValidatorStub = sandbox.stub();
99100
setLocalStub = sandbox.stub();
100101
setLocalIdentifierStub = sandbox.stub();
102+
setHeadedStub = sandbox.stub();
101103
deleteResultsStub = sandbox.stub();
102104
setDefaultsStub = sandbox.stub();
103105
});
@@ -127,6 +129,7 @@ describe("runs", () => {
127129
getConfigPath: getConfigPathStub,
128130
setLocal: setLocalStub,
129131
setLocalIdentifier: setLocalIdentifierStub,
132+
setHeaded: setHeadedStub,
130133
deleteResults: deleteResultsStub,
131134
setDefaults: setDefaultsStub,
132135
isJSONInvalid: isJSONInvalidStub
@@ -152,6 +155,7 @@ describe("runs", () => {
152155
sinon.assert.calledOnce(getErrorCodeFromMsgStub);
153156
sinon.assert.calledOnce(setLocalStub);
154157
sinon.assert.calledOnce(setLocalIdentifierStub);
158+
sinon.assert.calledOnce(setHeadedStub);
155159
sinon.assert.calledOnce(deleteResultsStub);
156160
sinon.assert.calledOnce(setDefaultsStub);
157161
sinon.assert.calledOnceWithExactly(
@@ -189,6 +193,7 @@ describe("runs", () => {
189193
deleteZipStub = sandbox.stub();
190194
setLocalStub = sandbox.stub();
191195
setLocalIdentifierStub = sandbox.stub();
196+
setHeadedStub = sandbox.stub();
192197
deleteResultsStub = sandbox.stub();
193198
getNumberOfSpecFilesStub = sandbox.stub().returns([]);
194199
setDefaultsStub = sandbox.stub();
@@ -219,6 +224,7 @@ describe("runs", () => {
219224
getConfigPath: getConfigPathStub,
220225
setLocal: setLocalStub,
221226
setLocalIdentifier: setLocalIdentifierStub,
227+
setHeaded: setHeadedStub,
222228
deleteResults: deleteResultsStub,
223229
setDefaults: setDefaultsStub,
224230
getNumberOfSpecFiles: getNumberOfSpecFilesStub
@@ -249,6 +255,7 @@ describe("runs", () => {
249255
sinon.assert.calledOnce(setParallelsStub);
250256
sinon.assert.calledOnce(setLocalStub);
251257
sinon.assert.calledOnce(setLocalIdentifierStub);
258+
sinon.assert.calledOnce(setHeadedStub);
252259
sinon.assert.calledOnce(validateBstackJsonStub);
253260
sinon.assert.calledOnce(capabilityValidatorStub);
254261
sinon.assert.calledOnce(archiverStub);
@@ -292,6 +299,7 @@ describe("runs", () => {
292299
deleteZipStub = sandbox.stub();
293300
setLocalStub = sandbox.stub();
294301
setLocalIdentifierStub = sandbox.stub();
302+
setHeadedStub = sandbox.stub();
295303
deleteResultsStub = sandbox.stub();
296304
getNumberOfSpecFilesStub = sandbox.stub().returns([]);
297305
setDefaultsStub = sandbox.stub();
@@ -322,6 +330,7 @@ describe("runs", () => {
322330
getConfigPath: getConfigPathStub,
323331
setLocal: setLocalStub,
324332
setLocalIdentifier: setLocalIdentifierStub,
333+
setHeaded: setHeadedStub,
325334
deleteResults: deleteResultsStub,
326335
getNumberOfSpecFiles: getNumberOfSpecFilesStub,
327336
setDefaults: setDefaultsStub
@@ -356,6 +365,7 @@ describe("runs", () => {
356365
sinon.assert.calledOnce(setParallelsStub);
357366
sinon.assert.calledOnce(setLocalStub);
358367
sinon.assert.calledOnce(setLocalIdentifierStub);
368+
sinon.assert.calledOnce(setHeadedStub);
359369
sinon.assert.calledOnce(validateBstackJsonStub);
360370
sinon.assert.calledOnce(capabilityValidatorStub);
361371
sinon.assert.calledOnce(archiverStub);
@@ -403,6 +413,7 @@ describe("runs", () => {
403413
deleteZipStub = sandbox.stub();
404414
setLocalStub = sandbox.stub();
405415
setLocalIdentifierStub = sandbox.stub();
416+
setHeadedStub = sandbox.stub();
406417
deleteResultsStub = sandbox.stub();
407418
getNumberOfSpecFilesStub = sandbox.stub().returns([]);
408419
setDefaultsStub = sandbox.stub();
@@ -433,6 +444,7 @@ describe("runs", () => {
433444
getConfigPath: getConfigPathStub,
434445
setLocal: setLocalStub,
435446
setLocalIdentifier: setLocalIdentifierStub,
447+
setHeaded: setHeadedStub,
436448
deleteResults: deleteResultsStub,
437449
getNumberOfSpecFiles: getNumberOfSpecFilesStub,
438450
setDefaults: setDefaultsStub
@@ -475,6 +487,7 @@ describe("runs", () => {
475487
sinon.assert.calledOnce(setParallelsStub);
476488
sinon.assert.calledOnce(setLocalStub);
477489
sinon.assert.calledOnce(setLocalIdentifierStub);
490+
sinon.assert.calledOnce(setHeadedStub);
478491
sinon.assert.calledOnce(archiverStub);
479492
sinon.assert.calledOnce(setUsageReportingFlagStub);
480493
sinon.assert.calledOnce(zipUploadStub);
@@ -527,6 +540,7 @@ describe("runs", () => {
527540
isUndefinedStub = sandbox.stub();
528541
setLocalStub = sandbox.stub();
529542
setLocalIdentifierStub = sandbox.stub();
543+
setHeadedStub = sandbox.stub();
530544
getNumberOfSpecFilesStub = sandbox.stub().returns([]);
531545
});
532546

@@ -556,6 +570,7 @@ describe("runs", () => {
556570
getConfigPath: getConfigPathStub,
557571
setLocal: setLocalStub,
558572
setLocalIdentifier: setLocalIdentifierStub,
573+
setHeaded: setHeadedStub,
559574
exportResults: exportResultsStub,
560575
deleteResults: deleteResultsStub,
561576
setDefaults: setDefaultsStub,
@@ -603,6 +618,7 @@ describe("runs", () => {
603618
sinon.assert.calledOnce(setParallelsStub);
604619
sinon.assert.calledOnce(setLocalStub);
605620
sinon.assert.calledOnce(setLocalIdentifierStub);
621+
sinon.assert.calledOnce(setHeadedStub);
606622
sinon.assert.calledOnce(archiverStub);
607623
sinon.assert.calledOnce(setUsageReportingFlagStub);
608624
sinon.assert.calledOnce(zipUploadStub);

test/unit/bin/helpers/capabilityHelper.js

+130
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,136 @@ describe("capabilityHelper.js", () => {
414414
});
415415
});
416416
});
417+
418+
context("headless in run_settings", () => {
419+
it("sets headless if false", () => {
420+
let headless = false;
421+
let zip_url = "bs://<random>";
422+
let bsConfig = {
423+
auth: {
424+
username: "random",
425+
access_key: "random",
426+
},
427+
browsers: [
428+
{
429+
browser: "chrome",
430+
os: "Windows 10",
431+
versions: ["78", "77"],
432+
},
433+
],
434+
run_settings: {
435+
headless: headless
436+
},
437+
};
438+
439+
return capabilityHelper
440+
.caps(bsConfig, { zip_url: zip_url })
441+
.then(function (data) {
442+
let parsed_data = JSON.parse(data);
443+
chai.assert.equal(parsed_data.headless, headless);
444+
chai.assert.equal(parsed_data.env, undefined);
445+
})
446+
.catch((error) => {
447+
chai.assert.fail("Promise error");
448+
});
449+
});
450+
451+
it("sets headless if string false", () => {
452+
let headless = "false";
453+
let zip_url = "bs://<random>";
454+
let bsConfig = {
455+
auth: {
456+
username: "random",
457+
access_key: "random",
458+
},
459+
browsers: [
460+
{
461+
browser: "chrome",
462+
os: "Windows 10",
463+
versions: ["78", "77"],
464+
},
465+
],
466+
run_settings: {
467+
headless: headless
468+
},
469+
};
470+
471+
return capabilityHelper
472+
.caps(bsConfig, { zip_url: zip_url })
473+
.then(function (data) {
474+
let parsed_data = JSON.parse(data);
475+
chai.assert.equal(parsed_data.headless, headless);
476+
chai.assert.equal(parsed_data.env, undefined);
477+
})
478+
.catch((error) => {
479+
chai.assert.fail("Promise error");
480+
});
481+
});
482+
483+
it("does not set headless if true", () => {
484+
let headless = true;
485+
let zip_url = "bs://<random>";
486+
let bsConfig = {
487+
auth: {
488+
username: "random",
489+
access_key: "random",
490+
},
491+
browsers: [
492+
{
493+
browser: "chrome",
494+
os: "Windows 10",
495+
versions: ["78", "77"],
496+
},
497+
],
498+
run_settings: {
499+
headless: headless
500+
},
501+
};
502+
503+
return capabilityHelper
504+
.caps(bsConfig, { zip_url: zip_url })
505+
.then(function (data) {
506+
let parsed_data = JSON.parse(data);
507+
chai.assert.equal(parsed_data.headless, undefined);
508+
chai.assert.equal(parsed_data.env, undefined);
509+
})
510+
.catch((error) => {
511+
chai.assert.fail("Promise error");
512+
});
513+
});
514+
515+
it("does not set headless if truthy", () => {
516+
let headless = "enable";
517+
let zip_url = "bs://<random>";
518+
let bsConfig = {
519+
auth: {
520+
username: "random",
521+
access_key: "random",
522+
},
523+
browsers: [
524+
{
525+
browser: "chrome",
526+
os: "Windows 10",
527+
versions: ["78", "77"],
528+
},
529+
],
530+
run_settings: {
531+
headless: headless
532+
},
533+
};
534+
535+
return capabilityHelper
536+
.caps(bsConfig, { zip_url: zip_url })
537+
.then(function (data) {
538+
let parsed_data = JSON.parse(data);
539+
chai.assert.equal(parsed_data.headless, undefined);
540+
chai.assert.equal(parsed_data.env, undefined);
541+
})
542+
.catch((error) => {
543+
chai.assert.fail("Promise error");
544+
});
545+
});
546+
});
417547
});
418548

419549
describe("validate", () => {

test/unit/bin/helpers/utils.js

+26
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,32 @@ describe('utils', () => {
545545
});
546546
});
547547

548+
describe('setHeaded', () => {
549+
it('sets the headless to false', () => {
550+
let args = {
551+
headed: true
552+
};
553+
let bsConfig = {
554+
run_settings: {}
555+
};
556+
557+
utils.setHeaded(bsConfig, args);
558+
expect(bsConfig.run_settings.headless).to.be.eq(false);
559+
});
560+
561+
it('sets the headless to false', () => {
562+
let args = {
563+
headed: false
564+
};
565+
let bsConfig = {
566+
run_settings: {}
567+
};
568+
569+
utils.setHeaded(bsConfig, args);
570+
expect(bsConfig.run_settings.headless).to.be.eq(undefined);
571+
});
572+
});
573+
548574
describe('exportResults', () => {
549575
it('should export results to log/build_results.txt', () => {
550576
sinon.stub(fs, 'writeFileSync').returns(true);

0 commit comments

Comments
 (0)