diff --git a/packages/@vue/cli-plugin-e2e-nightwatch/__tests__/nightwatchPlugin.spec.js b/packages/@vue/cli-plugin-e2e-nightwatch/__tests__/nightwatchPlugin.spec.js index a27daf6ac4..a7716f7627 100644 --- a/packages/@vue/cli-plugin-e2e-nightwatch/__tests__/nightwatchPlugin.spec.js +++ b/packages/@vue/cli-plugin-e2e-nightwatch/__tests__/nightwatchPlugin.spec.js @@ -99,7 +99,10 @@ describe('nightwatch e2e plugin', () => { testSettings = JSON.parse(testSettings) expect(testSettings.parallel_mode).toStrictEqual(true) - expect(testSettings.test_workers).toStrictEqual(true) + expect(testSettings.test_workers).toStrictEqual({ + enabled: true, + workers: 'auto' + }) expect(Object.keys(results.modules).sort()).toEqual([ 'test', 'test-with-pageobjects' diff --git a/packages/@vue/cli-plugin-e2e-nightwatch/index.js b/packages/@vue/cli-plugin-e2e-nightwatch/index.js index cb1a595a79..9175fee366 100644 --- a/packages/@vue/cli-plugin-e2e-nightwatch/index.js +++ b/packages/@vue/cli-plugin-e2e-nightwatch/index.js @@ -127,7 +127,7 @@ async function loadNightwatchConfig (rawArgs, api) { process.env.VUE_NIGHTWATCH_USER_OPTIONS = JSON.stringify(userOptions || {}) - rawArgs.push('--config', require.resolve('./nightwatch.config.js')) + rawArgs.push('--config', require.resolve('./nightwatch.conf.js')) } } diff --git a/packages/@vue/cli-plugin-e2e-nightwatch/nightwatch.conf.js b/packages/@vue/cli-plugin-e2e-nightwatch/nightwatch.conf.js new file mode 100644 index 0000000000..ad710a2824 --- /dev/null +++ b/packages/@vue/cli-plugin-e2e-nightwatch/nightwatch.conf.js @@ -0,0 +1,360 @@ +// Autogenerated by Nightwatch +// Refer to the online docs for more details: https://nightwatchjs.org/gettingstarted/configuration/ + +const path = require('path') +const deepmerge = require('deepmerge') + +const Services = {} +loadServices() +const VUE_DEV_SERVER_URL = process.env.VUE_DEV_SERVER_URL +const BROWSERSTACK_USER = process.env.BROWSERSTACK_USER +const BROWSERSTACK_KEY = process.env.VUE_DEV_SERVER_URL +const userOptions = JSON.parse(process.env.VUE_NIGHTWATCH_USER_OPTIONS || '{}') +const concurrentMode = process.env.VUE_NIGHTWATCH_CONCURRENT === '1' +const useSelenium = process.env.VUE_NIGHTWATCH_USE_SELENIUM === '1' +const startHeadless = process.env.VUE_NIGHTWATCH_HEADLESS === '1' +const chromeArgs = [] +const geckoArgs = [] + +if (startHeadless) { + chromeArgs.push('headless') + geckoArgs.push('--headless') +} + +// _ _ _ _ _ _ _ +// | \ | |(_) | | | | | | | | +// | \| | _ __ _ | |__ | |_ __ __ __ _ | |_ ___ | |__ +// | . ` || | / _` || '_ \ | __|\ \ /\ / / / _` || __| / __|| '_ \ +// | |\ || || (_| || | | || |_ \ V V / | (_| || |_ | (__ | | | | +// \_| \_/|_| \__, ||_| |_| \__| \_/\_/ \__,_| \__| \___||_| |_| +// __/ | +// |___/ + +const defaultSettings = { + // An array of folders (excluding subfolders) where your tests are located; + // if this is not specified, the test source must be passed as the second argument to the test runner. + src_folders: ['tests/e2e/specs'], + + // See https://nightwatchjs.org/guide/working-with-page-objects/ + page_objects_path: 'tests/e2e/page-objects', + + // See https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands + custom_commands_path: 'tests/e2e/custom-commands', + + // See https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-assertions + custom_assertions_path: 'tests/e2e/custom-assertions', + + // See https://nightwatchjs.org/guide/#external-globals + globals_path: path.resolve('tests/e2e/globals.js'), + + output_folder: 'tests/e2e/reports', + + webdriver: {}, + + test_workers: { + enabled: concurrentMode, + workers: 'auto' + }, + + test_settings: { + default: { + disable_error_log: false, + launch_url: `${VUE_DEV_SERVER_URL}`, + + screenshots: { + enabled: false, + path: 'screens', + on_failure: true + }, + + desiredCapabilities: { + browserName: 'firefox' + }, + + webdriver: { + start_process: true, + server_path: Services.geckodriver ? Services.geckodriver.path : '' + } + }, + + safari: { + desiredCapabilities: { + browserName: 'safari', + alwaysMatch: { + acceptInsecureCerts: false + } + }, + webdriver: { + start_process: true, + server_path: '/usr/bin/safaridriver' + } + }, + + firefox: { + desiredCapabilities: { + browserName: 'firefox', + alwaysMatch: { + // Enable this if you encounter unexpected SSL certificate errors in Firefox + // acceptInsecureCerts: true, + 'moz:firefoxOptions': { + args: geckoArgs + } + } + }, + webdriver: { + start_process: true, + server_path: Services.geckodriver ? Services.geckodriver.path : '', + cli_args: [ + // very verbose geckodriver logs + // '-vv' + ] + } + }, + + chrome: { + desiredCapabilities: { + browserName: 'chrome', + 'goog:chromeOptions': { + // More info on Chromedriver: https://sites.google.com/a/chromium.org/chromedriver/ + // + // w3c:false tells Chromedriver to run using the legacy JSONWire protocol (not required in Chrome 78) + w3c: true, + args: chromeArgs + } + }, + + webdriver: { + start_process: true, + server_path: Services.chromedriver ? Services.chromedriver.path : '', + cli_args: [ + // --verbose + ] + } + }, + + edge: { + desiredCapabilities: { + browserName: 'MicrosoftEdge', + 'ms:edgeOptions': { + w3c: true, + // More info on EdgeDriver: https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium/capabilities-edge-options + args: [ + // '--headless' + ] + } + }, + + webdriver: { + start_process: true, + // Download msedgedriver from https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium/ + // and set the location below: + server_path: '', + cli_args: [ + // --verbose + ] + } + }, + + /// /////////////////////////////////////////////////////////////////////////////// + // Configuration for when using cucumber-js (https://cucumber.io) | + // | + // It uses the bundled examples inside the nightwatch examples folder; feel free | + // to adapt this to your own project needs | + /// /////////////////////////////////////////////////////////////////////////////// + 'cucumber-js': { + src_folders: ['examples/cucumber-js/features/step_definitions'], + + test_runner: { + // set cucumber as the runner + type: 'cucumber', + + // define cucumber specific options + options: { + // set the feature path + feature_path: 'node_modules/nightwatch/examples/cucumber-js/*/*.feature' + + // start the webdriver session automatically (enabled by default) + // auto_start_session: true + + // use parallel execution in Cucumber + // parallel: 2 // set number of workers to use (can also be defined in the cli as --parallel 2 + } + } + }, + + /// /////////////////////////////////////////////////////////////////////////////// + // Configuration for when using the browserstack.com cloud service | + // | + // Please set the username and access key by setting the environment variables: | + // - BROWSERSTACK_USER | + // - BROWSERSTACK_KEY | + // .env files are supported | + /// /////////////////////////////////////////////////////////////////////////////// + browserstack: { + selenium: { + host: 'hub-cloud.browserstack.com', + port: 443 + }, + // More info on configuring capabilities can be found on: + // https://www.browserstack.com/automate/capabilities?tag=selenium-4 + desiredCapabilities: { + 'bstack:options': { + userName: `${BROWSERSTACK_USER}`, + accessKey: `${BROWSERSTACK_KEY}` + } + }, + + disable_error_log: true, + webdriver: { + timeout_options: { + timeout: 15000, + retry_attempts: 3 + }, + keep_alive: true, + start_process: false + } + }, + + 'browserstack.local': { + extends: 'browserstack', + desiredCapabilities: { + 'browserstack.local': true + } + }, + + 'browserstack.chrome': { + extends: 'browserstack', + desiredCapabilities: { + browserName: 'chrome', + chromeOptions: { + w3c: true + } + } + }, + + 'browserstack.firefox': { + extends: 'browserstack', + desiredCapabilities: { + browserName: 'firefox' + } + }, + + 'browserstack.ie': { + extends: 'browserstack', + desiredCapabilities: { + browserName: 'internet explorer', + browserVersion: '11.0' + } + }, + + 'browserstack.safari': { + extends: 'browserstack', + desiredCapabilities: { + browserName: 'safari' + } + }, + + 'browserstack.local_chrome': { + extends: 'browserstack.local', + desiredCapabilities: { + browserName: 'chrome' + } + }, + + 'browserstack.local_firefox': { + extends: 'browserstack.local', + desiredCapabilities: { + browserName: 'firefox' + } + }, + /// /////////////////////////////////////////////////////////////////////////////// + // Configuration for when using the Selenium service, either locally or remote, | + // like Selenium Grid | + /// /////////////////////////////////////////////////////////////////////////////// + selenium_server: { + // Selenium Server is running locally and is managed by Nightwatch + selenium: { + start_process: true, + port: 4444, + server_path: (Services.seleniumServer ? Services.seleniumServer.path : ''), + cli_args: { + 'webdriver.gecko.driver': (Services.geckodriver ? Services.geckodriver.path : ''), + 'webdriver.chrome.driver': (Services.chromedriver ? Services.chromedriver.path : '') + } + } + }, + + 'selenium.chrome': { + extends: 'selenium_server', + desiredCapabilities: { + browserName: 'chrome', + chromeOptions: { + w3c: true + } + } + }, + + 'selenium.firefox': { + extends: 'selenium_server', + desiredCapabilities: { + browserName: 'firefox', + 'moz:firefoxOptions': { + args: geckoArgs + } + } + } + } +} + +const baseSettings = deepmerge(defaultSettings, webdriverServerSettings()) + +module.exports = deepmerge(baseSettings, adaptUserSettings(userOptions)) + +function adaptUserSettings (settings) { + // The path to nightwatch external globals file needs to be made absolute + // if it is supplied in an additional config file, due to merging of config files + if (settings.globals_path) { + settings.globals_path = path.resolve(settings.globals_path) + } + + return settings +} + +function webdriverServerSettings () { + if (useSelenium) { + return { + selenium: { + start_process: true, + host: '127.0.0.1', + port: 4444, + server_path: require('selenium-server').path, + cli_args: { + 'webdriver.chrome.driver': Services.chromedriver.path, + 'webdriver.gecko.driver': Services.geckodriver.path + } + } + } + } + + return { + webdriver: { + start_process: true, + port: 9515, + server_path: Services.chromedriver.path + } + } +} + +function loadServices () { + try { + Services.seleniumServer = require('selenium-server') + } catch (err) {} + + try { + Services.chromedriver = require('chromedriver') + } catch (err) {} + + try { + Services.geckodriver = require('geckodriver') + } catch (err) {} +} diff --git a/packages/@vue/cli-plugin-e2e-nightwatch/nightwatch.config.js b/packages/@vue/cli-plugin-e2e-nightwatch/nightwatch.config.js deleted file mode 100644 index 4071a3aa19..0000000000 --- a/packages/@vue/cli-plugin-e2e-nightwatch/nightwatch.config.js +++ /dev/null @@ -1,106 +0,0 @@ -// http://nightwatchjs.org/gettingstarted#settings-file - -const path = require('path') -const deepmerge = require('deepmerge') -const chromedriver = require('chromedriver') - -// user may have not installed geckodriver -let geckodriver = {} -try { - geckodriver = require('geckodriver') -} catch (e) {} - -const userOptions = JSON.parse(process.env.VUE_NIGHTWATCH_USER_OPTIONS || '{}') -const useSelenium = process.env.VUE_NIGHTWATCH_USE_SELENIUM === '1' -const startHeadless = process.env.VUE_NIGHTWATCH_HEADLESS === '1' -const concurrentMode = process.env.VUE_NIGHTWATCH_CONCURRENT === '1' -const chromeArgs = [] -const geckoArgs = [] - -if (startHeadless) { - chromeArgs.push('headless') - geckoArgs.push('--headless') -} - -const defaultSettings = { - src_folders: ['tests/e2e/specs'], - output_folder: 'tests/e2e/reports', - page_objects_path: 'tests/e2e/page-objects', - custom_assertions_path: 'tests/e2e/custom-assertions', - custom_commands_path: 'tests/e2e/custom-commands', - globals_path: path.resolve('tests/e2e/globals.js'), - test_workers: concurrentMode, - test_settings: { - default: { - detailed_output: !concurrentMode, - launch_url: '${VUE_DEV_SERVER_URL}' // eslint-disable-line no-template-curly-in-string - }, - - chrome: { - desiredCapabilities: { - browserName: 'chrome', - chromeOptions: { - w3c: false, - args: chromeArgs - } - } - }, - - firefox: { - desiredCapabilities: { - browserName: 'firefox', - alwaysMatch: { - acceptInsecureCerts: true, - 'moz:firefoxOptions': { - args: geckoArgs - } - } - }, - webdriver: useSelenium - ? {} - : { - server_path: geckodriver.path, - port: 4444 - } - } - } -} - -const baseSettings = deepmerge(defaultSettings, webdriverServerSettings()) - -module.exports = deepmerge(baseSettings, adaptUserSettings(userOptions)) - -function adaptUserSettings (settings) { - // The path to nightwatch external globals file needs to be made absolute - // if it is supplied in an additional config file, due to merging of config files - if (settings.globals_path) { - settings.globals_path = path.resolve(settings.globals_path) - } - - return settings -} - -function webdriverServerSettings () { - if (useSelenium) { - return { - selenium: { - start_process: true, - host: '127.0.0.1', - port: 4444, - server_path: require('selenium-server').path, - cli_args: { - 'webdriver.chrome.driver': chromedriver.path, - 'webdriver.gecko.driver': geckodriver.path - } - } - } - } - - return { - webdriver: { - start_process: true, - port: 9515, - server_path: chromedriver.path - } - } -} diff --git a/packages/@vue/cli-plugin-e2e-nightwatch/package.json b/packages/@vue/cli-plugin-e2e-nightwatch/package.json index 46ef43545c..dee1d3bf1a 100644 --- a/packages/@vue/cli-plugin-e2e-nightwatch/package.json +++ b/packages/@vue/cli-plugin-e2e-nightwatch/package.json @@ -25,11 +25,11 @@ "dependencies": { "@vue/cli-shared-utils": "^5.0.0-rc.1", "deepmerge": "^4.2.2", - "nightwatch": "^1.7.8" + "nightwatch": "^2.0.5" }, "devDependencies": { - "chromedriver": "^94.0.0", - "geckodriver": "^2.0.1", + "chromedriver": "^96.0.0", + "geckodriver": "^3.0.1", "selenium-server": "^3.141.59" }, "peerDependencies": {