diff --git a/.nycrc-browser-api-chrome-local.yml b/.nycrc-browser-api-chrome-local.yml index 28086be1..3e780a3e 100644 --- a/.nycrc-browser-api-chrome-local.yml +++ b/.nycrc-browser-api-chrome-local.yml @@ -7,6 +7,7 @@ exclude: - 'scripts/**/*.js' - 'coverage/**/*.js' - 'src/test/clients/waychaser-via-webdriver-firefox.js' + - 'src/test/clients/waychaser-via-webdriver-safari.js' - 'src/test/clients/waychaser-via-webdriver-saucy.js' check-coverage: false diff --git a/.nycrc-browser-api-firefox-local.yml b/.nycrc-browser-api-firefox-local.yml index 096ad000..26117aff 100644 --- a/.nycrc-browser-api-firefox-local.yml +++ b/.nycrc-browser-api-firefox-local.yml @@ -7,6 +7,7 @@ exclude: - 'scripts/**/*.js' - 'coverage/**/*.js' - 'src/test/clients/waychaser-via-webdriver-chrome.js' + - 'src/test/clients/waychaser-via-webdriver-safari.js' - 'src/test/clients/waychaser-via-webdriver-saucy.js' check-coverage: false diff --git a/.nycrc-browser-api-safari-local.yml b/.nycrc-browser-api-safari-local.yml new file mode 100644 index 00000000..529ab317 --- /dev/null +++ b/.nycrc-browser-api-safari-local.yml @@ -0,0 +1,17 @@ +extends: '@istanbuljs/nyc-config-babel' +all: true +skip-full: false +exclude: + - 'lib/**/*.js' + - 'dist/**/*.js' + - 'scripts/**/*.js' + - 'coverage/**/*.js' + - 'src/test/clients/waychaser-via-webdriver-chrome.js' + - 'src/test/clients/waychaser-via-webdriver-firefox.js' + - 'src/test/clients/waychaser-via-webdriver-saucy.js' +check-coverage: false + +reporter: + - text-summary + - lcov + - text diff --git a/.nycrc-browser-api-safari-saucy.yml b/.nycrc-browser-api-safari-saucy.yml new file mode 100644 index 00000000..372b7e69 --- /dev/null +++ b/.nycrc-browser-api-safari-saucy.yml @@ -0,0 +1,17 @@ +extends: '@istanbuljs/nyc-config-babel' +all: true +skip-full: false +exclude: + - 'lib/**/*.js' + - 'dist/**/*.js' + - 'scripts/**/*.js' + - 'coverage/**/*.js' + - 'src/test/clients/waychaser-via-webdriver-firefox.js' + - 'src/test/clients/waychaser-via-webdriver-chrome.js' + - 'src/test/clients/waychaser-via-webdriver-local.js' +check-coverage: false + +reporter: + - text-summary + - lcov + - text diff --git a/cucumber.js b/cucumber.js index 10c2b78a..edfaf08d 100644 --- a/cucumber.js +++ b/cucumber.js @@ -56,4 +56,11 @@ module.exports = { 'firefox', 'Windows 10' ), + 'browser-api-safari-local': generateConfig('browser-api-safari-local'), + 'browser-api-safari-saucy': generateConfig( + 'browser-api-safari-saucy', + 'browser-api-saucy', + 'safari', + 'macOS 10.15' + ), }; diff --git a/package-lock.json b/package-lock.json index 411ee32b..d66a5fad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5409,14 +5409,6 @@ "sha.js": "^2.4.8" } }, - "cross-fetch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", - "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", - "requires": { - "node-fetch": "2.6.1" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -10211,6 +10203,15 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "requires": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -18621,6 +18622,11 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-fetch": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz", + "integrity": "sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ==" + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index 3c10492f..367ae693 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,8 @@ "test:browser-api:chrome:saucy": "scripts/test-browser.sh", "test:browser-api:firefox:local": "scripts/test-browser.sh", "test:browser-api:firefox:saucy": "scripts/test-browser.sh", + "test:browser-api:safari:local": "scripts/test-browser.sh", + "test:browser-api:safari:saucy": "scripts/test-browser.sh", "test:browser-api": "scripts/for-all-browsers.sh", "test": "npm-run-all --sequential ${npm_lifecycle_event}:*", "watch:test:node-api": "nodemon -V -x npm -- run ${npm_lifecycle_event#watch:}", @@ -60,6 +62,8 @@ "cover:browser-api:chrome:saucy": "scripts/cover.sh", "cover:browser-api:firefox:local": "scripts/cover.sh", "cover:browser-api:firefox:saucy": "scripts/cover.sh", + "cover:browser-api:safari:local": "scripts/cover.sh", + ".cover:browser-api:safari:saucy": "scripts/cover.sh", "cover:browser-api": "scripts/for-all-browsers.sh", "cover": "scripts/cover-all.sh", "eslint-check": "eslint --print-config src/server/index.js | eslint-config-prettier-check", @@ -72,9 +76,9 @@ "/dist/*.js.map" ], "dependencies": { - "cross-fetch": "^3.0.4", "debug": "^4.1.1", "http-link-header": "^1.0.2", + "isomorphic-fetch": "^3.0.0", "shellcheck": "^0.4.4", "url-polyfill": "^1.1.7" }, diff --git a/scripts/test-browser.sh b/scripts/test-browser.sh index b53272ca..2e9fc2db 100755 --- a/scripts/test-browser.sh +++ b/scripts/test-browser.sh @@ -7,10 +7,19 @@ TESTING="${npm_lifecycle_event#test:}" TEST_PROFILE="${TESTING//:/-}" +BROWSER_AND_MODE="${npm_lifecycle_event#test:browser-api:}" +MODE="${BROWSER_AND_MODE#*:}" +BROWSER="${BROWSER_AND_MODE%:*}" + +if [[ "$BROWSER" != "safari" || "$MODE" != "local" || "$OSTYPE" == "darwin"* ]]; then NODE_ENV=test \ PORT=${npm_package_config_TEST_API_PORT} \ UI_PORT=${npm_package_config_TEST_BROWSER_PORT} \ start-server-and-test \ browser:test \ "http://localhost:${npm_package_config_TEST_BROWSER_PORT}" \ - "cucumber-js -p ${TEST_PROFILE}" \ No newline at end of file + "cucumber-js -p ${TEST_PROFILE}" +else + echo "Cannot execute local safari tests on $OSTYPE. Skipping..." +fi + diff --git a/src/test/clients/waychaser-via-webdriver-firefox.js b/src/test/clients/waychaser-via-webdriver-firefox.js index 3dcef7cd..811c8c04 100644 --- a/src/test/clients/waychaser-via-webdriver-firefox.js +++ b/src/test/clients/waychaser-via-webdriver-firefox.js @@ -11,6 +11,10 @@ class WaychaserViaWebdriverFirefox extends WaychaserViaWebdriverLocal { setBrowserOptions(builder, options) { return builder.forBrowser('firefox').setChromeOptions(options); } + + async getBrowserLogs() { + // getting logs is not possible with firefox + } } const instance = new WaychaserViaWebdriverFirefox(); diff --git a/src/test/clients/waychaser-via-webdriver-local.js b/src/test/clients/waychaser-via-webdriver-local.js index b5205fba..b2cf9895 100644 --- a/src/test/clients/waychaser-via-webdriver-local.js +++ b/src/test/clients/waychaser-via-webdriver-local.js @@ -4,10 +4,10 @@ import logging from 'selenium-webdriver/lib/logging'; import logger from '../../util/logger'; -const screen = { - width: 1024, - height: 800, -}; +// const screen = { +// width: 1024, +// height: 800, +// }; class WaychaserViaWebdriverLocal extends WaychaserViaWebdriver { async load(url, options) { @@ -20,7 +20,7 @@ class WaychaserViaWebdriverLocal extends WaychaserViaWebdriver { async getBrowser() { try { const options = this.getBrowserOptions(); - options.windowSize(screen); + //options.windowSize(screen); /* istanbul ignore next: only get's executed on CI server*/ if (process.env.CI) { options.headless(); @@ -43,7 +43,7 @@ class WaychaserViaWebdriverLocal extends WaychaserViaWebdriver { { /* istanbul ignore next: only get's executed when there are web driver issues*/ { - logger.error('error getting broswer', error); + logger.error('error getting browser', error); throw error; } } diff --git a/src/test/clients/waychaser-via-webdriver-safari.js b/src/test/clients/waychaser-via-webdriver-safari.js new file mode 100644 index 00000000..35a7d855 --- /dev/null +++ b/src/test/clients/waychaser-via-webdriver-safari.js @@ -0,0 +1,23 @@ +import safari from 'selenium-webdriver/safari'; +// eslint-disable-next-line no-unused-vars +import logger from '../../util/logger'; +import { WaychaserViaWebdriverLocal } from './waychaser-via-webdriver-local'; + +class WaychaserViaWebdriverSafari extends WaychaserViaWebdriverLocal { + getBrowserOptions() { + return new safari.Options(); + } + + setBrowserOptions(builder, options) { + return builder.forBrowser('safari').setSafariOptions(options); + } + + async getBrowserLogs() { + // getting logs is not possible wtih safari + // https://stackoverflow.com/questions/46272218/unable-to-console-logs-from-safari-using-selenium-webdriver-python + } +} + +const instance = new WaychaserViaWebdriverSafari(); + +export { instance as waychaserViaWebdriverSafari }; diff --git a/src/test/clients/waychaser-via-webdriver-saucy.js b/src/test/clients/waychaser-via-webdriver-saucy.js index 84201679..51009ce7 100644 --- a/src/test/clients/waychaser-via-webdriver-saucy.js +++ b/src/test/clients/waychaser-via-webdriver-saucy.js @@ -54,9 +54,7 @@ class WaychaserViaWebdriverSaucy extends WaychaserViaWebdriver { accessKey: accessKey, build: BUILD, name, - /* As a best practice, set important test metadata and execution options - such as build info, tags for reporting, and timeout durations. - */ + extendedDebugging: true, maxDuration: 3600, idleTimeout: 1000, tags: tags, @@ -76,10 +74,18 @@ class WaychaserViaWebdriverSaucy extends WaychaserViaWebdriver { } /* istanbul ignore next: only get's executed when there are web driver issues */ catch(error) { - logger.error('error getting broswer', error); + logger.error('error getting browser', error); throw error; } + async getBrowserLogs() { + // getting logs is not possible wtih safari + // https://stackoverflow.com/questions/46272218/unable-to-console-logs-from-safari-using-selenium-webdriver-python + if (this.browser != 'safari' && this.browser != 'firefox') { + super.getBrowserLogs(); + } + } + async sendTestResult(result) { await this.driver.executeScript(`sauce:job-result=${result}`); } diff --git a/src/test/clients/waychaser-via-webdriver.js b/src/test/clients/waychaser-via-webdriver.js index 09e3faab..3dbf9edf 100644 --- a/src/test/clients/waychaser-via-webdriver.js +++ b/src/test/clients/waychaser-via-webdriver.js @@ -1,6 +1,7 @@ import humanizeDuration from 'humanize-duration'; import core from 'istanbul-middleware/lib/core'; import logger from '../../util/logger'; +import logging from 'selenium-webdriver/lib/logging'; class WaychaserViaWebdriver { async load(url, options) { @@ -12,16 +13,20 @@ class WaychaserViaWebdriver { .load(arguments[0], arguments[1]) .then((success) => { console.log({ success }); - return { success }; + return { success, result: 'success' }; }) .catch((error) => { console.log({ error }); - return { error }; + return { error, result: 'error' }; }); }, url, options ); + + await this.getBrowserLogs(); + + logger.debug(`result:`, result); if (result.error) { logger.debug(result.error); throw new Error(result.error); @@ -29,6 +34,19 @@ class WaychaserViaWebdriver { return result.success; } + async getBrowserLogs() { + await this.driver + .manage() + .logs() + .get(logging.Type.BROWSER) + .then((entries) => { + entries.forEach((entry) => { + logger.browser('[%s] %s', entry.level.name, entry.message); + }); + return; + }); + } + /* istanbul ignore next: only get's executed on test failure */ async allowDebug(timeout) { if (this.driver) { diff --git a/src/test/world.js b/src/test/world.js index 9c2e9ec9..794ad6a6 100644 --- a/src/test/world.js +++ b/src/test/world.js @@ -20,6 +20,7 @@ import { waychaser } from '../../dist/waychaser'; import { waychaserViaWebdriverChrome } from './clients/waychaser-via-webdriver-chrome'; import { waychaserViaWebdriverFirefox } from './clients/waychaser-via-webdriver-firefox'; import { waychaserViaWebdriverSaucy } from './clients/waychaser-via-webdriver-saucy'; +import { waychaserViaWebdriverSafari } from './clients/waychaser-via-webdriver-safari'; chai.use(chaiAsPromised); @@ -92,6 +93,7 @@ function world({ attach, parameters }) { 'node-api': waychaser, 'browser-api-chrome-local': waychaserViaWebdriverChrome, 'browser-api-firefox-local': waychaserViaWebdriverFirefox, + 'browser-api-safari-local': waychaserViaWebdriverSafari, 'browser-api-saucy': waychaserViaWebdriverSaucy, }; this.waychaser = clients[this.parameters.client]; diff --git a/src/waychaser.js b/src/waychaser.js index 53a20a32..0e0f353c 100644 --- a/src/waychaser.js +++ b/src/waychaser.js @@ -1,4 +1,4 @@ -import fetch from 'cross-fetch'; +import fetch from 'isomorphic-fetch'; class ApiResourceObject {}