diff --git a/lib/core/client.js b/lib/core/client.js index bd5d15547..81d6371de 100644 --- a/lib/core/client.js +++ b/lib/core/client.js @@ -680,10 +680,12 @@ class NightwatchClient extends EventEmitter { // Initialize the APIs ////////////////////////////////////////////////////////////////////////////////////////// - async initialize() { + async initialize(loadNightwatchApis = true) { this.loadKeyCodes(); - return this.loadNightwatchApis(); + if (loadNightwatchApis) { + return this.loadNightwatchApis(); + } } setCurrentTest() { diff --git a/lib/index.js b/lib/index.js index 11eb1129d..b3f88009f 100644 --- a/lib/index.js +++ b/lib/index.js @@ -142,10 +142,10 @@ module.exports.createClient = function({ return cliRunner.globals.runGlobalHook('after', [client.settings]); }, - launchBrowser() { + launchBrowser({loadNightwatchApis = true} = {}) { const {argv} = cliRunner; - return client.initialize() + return client.initialize(loadNightwatchApis) .then(() => { return client.createSession({argv}); }) diff --git a/test/src/index/testProgrammaticApis.js b/test/src/index/testProgrammaticApis.js index e80756121..d77dd9f5b 100644 --- a/test/src/index/testProgrammaticApis.js +++ b/test/src/index/testProgrammaticApis.js @@ -882,4 +882,85 @@ describe('test programmatic apis', function () { CliRunner.createDefaultConfig = createDefaultConfig; CliRunner.prototype.loadConfig = loadConfig; }); + + it('test multiple calls to launchBrowser() on same client', async function() { + const CliRunner = common.require('runner/cli/cli.js'); + const Nightwatch = common.require('index.js'); + MockServer.createChromeSession({sessionId: '12345678'}); + MockServer.createChromeSession({sessionId: '87654321'}); + + const defaultConfig = { + test_settings: { + default: { + launchUrl: 'http://localhost' + }, + + chrome: { + desiredCapabilities: { + browserName: 'chrome' + } + } + }, + selenium: { + port: 10195, + start_process: false + }, + selenium_host: 'localhost' + }; + + const createDefaultConfig = CliRunner.createDefaultConfig; + const loadConfig = CliRunner.prototype.loadConfig; + + CliRunner.createDefaultConfig = function(destFileName) { + return defaultConfig; + }; + + CliRunner.prototype.loadConfig = function () { + return defaultConfig; + }; + + const clientChrome = Nightwatch.createClient({ + browserName: 'chrome', + headless: true + }); + + const session = await clientChrome.launchBrowser(); + + assert.strictEqual(session.sessionId, '12345678'); + assert.strictEqual(session.options.webdriver.port, 10195); + assert.deepStrictEqual(session.capabilities, { + acceptInsecureCerts: false, + browserName: 'chrome', + browserVersion: '90' + }); + + await session.end(); + assert.strictEqual(session.sessionId, null); + + let launchBrowserError; + try { + await clientChrome.launchBrowser(); + } catch (err) { + launchBrowserError = err; + } + assert.notStrictEqual(launchBrowserError, undefined); + assert.strictEqual(launchBrowserError.message.includes('Error while loading the API commands'), true); + + const session2 = await clientChrome.launchBrowser({loadNightwatchApis: false}); + + assert.strictEqual(session2.sessionId, '87654321'); + assert.strictEqual(session2.options.webdriver.port, 10195); + assert.deepStrictEqual(session2.capabilities, { + acceptInsecureCerts: false, + browserName: 'chrome', + browserVersion: '90' + }); + + await session2.quit(); + // TODO: calling `.quit()` does not clear the sessionId + assert.notStrictEqual(session2.sessionId, null); + + CliRunner.createDefaultConfig = createDefaultConfig; + CliRunner.prototype.loadConfig = loadConfig; + }); });