diff --git a/lib/bpRunner.ts b/lib/bpRunner.ts index 7c124097a..e003abfaf 100644 --- a/lib/bpRunner.ts +++ b/lib/bpRunner.ts @@ -1,5 +1,4 @@ import {ChildProcess, fork} from 'child_process'; -import * as q from 'q'; import {Config} from './config'; import {Logger} from './logger'; @@ -15,7 +14,7 @@ export class BlockingProxyRunner { constructor(private config: Config) {} start() { - return q.Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.checkSupportedConfig(); let args = [ diff --git a/lib/driverProviders/sauce.ts b/lib/driverProviders/sauce.ts index d6a99288c..05374a4cf 100644 --- a/lib/driverProviders/sauce.ts +++ b/lib/driverProviders/sauce.ts @@ -4,7 +4,6 @@ * it down, and setting up the driver correctly. */ -import * as q from 'q'; import {Session, WebDriver} from 'selenium-webdriver'; import * as util from 'util'; diff --git a/lib/frameworks/debugprint.js b/lib/frameworks/debugprint.js index 79c28267c..8b10c353a 100644 --- a/lib/frameworks/debugprint.js +++ b/lib/frameworks/debugprint.js @@ -1,5 +1,4 @@ var util = require('util'), - q = require('q'), Logger = require('../logger').Logger; var logger = new Logger('debugger'); @@ -10,10 +9,10 @@ var logger = new Logger('debugger'); * * @param {Runner} runner The current Protractor Runner. * @param {Array} specs Array of Directory Path Strings. - * @return {q.Promise} Promise resolved with the test results + * @return {Promise} Promise resolved with the test results */ -exports.run = function(runner, specs) { - return q.promise(function(resolve) { +exports.run = (runner, specs) => { + return new Promise(resolve => { logger.info('Resolved spec files: ' + util.inspect(specs)); resolve({ failedCount: 0 diff --git a/lib/frameworks/explorer.js b/lib/frameworks/explorer.js deleted file mode 100644 index 4a60adb4a..000000000 --- a/lib/frameworks/explorer.js +++ /dev/null @@ -1,24 +0,0 @@ -var q = require('q'); - -/** - * A framework which does not actually run any tests. It allows users to drop - * into a repl loop to experiment with protractor commands. - * - * @param {Runner} runner The current Protractor Runner. - * @return {q.Promise} Promise resolved with the test results - */ -exports.run = function(runner) { - /* globals browser */ - return q.promise(function(resolve) { - if (runner.getConfig().baseUrl) { - browser.get(runner.getConfig().baseUrl); - } - browser.executeScriptWithDescription('var e = 0', 'starting explorer hook'); - browser.enterRepl(); - browser.executeScriptWithDescription('var e = 1', 'done with explorer hook').then(function() { - resolve({ - failedCount: 0 - }); - }); - }); -}; diff --git a/lib/frameworks/jasmine.js b/lib/frameworks/jasmine.js index 03251729b..beac77520 100644 --- a/lib/frameworks/jasmine.js +++ b/lib/frameworks/jasmine.js @@ -1,7 +1,4 @@ -var q = require('q'); -var webdriver = require('selenium-webdriver'); - -var RunnerReporter = function(emitter) { +let RunnerReporter = function(emitter) { this.emitter = emitter; this.testResult = [], this.failedCount = 0; @@ -18,7 +15,7 @@ RunnerReporter.prototype.specStarted = function() { }; RunnerReporter.prototype.specDone = function(result) { - var specInfo = { + const specInfo = { name: result.description, category: result.fullName.slice(0, -result.description.length).trim() }; @@ -29,7 +26,7 @@ RunnerReporter.prototype.specDone = function(result) { this.failedCount++; } - var entry = { + const entry = { description: result.fullName, assertions: [], duration: new Date().getTime() - this.startTime.getTime() @@ -41,7 +38,7 @@ RunnerReporter.prototype.specDone = function(result) { }); } - result.failedExpectations.forEach(function(item) { + result.failedExpectations.forEach(item => { entry.assertions.push({ passed: item.passed, errorMsg: item.passed ? undefined : item.message, @@ -56,23 +53,20 @@ RunnerReporter.prototype.specDone = function(result) { * * @param {Runner} runner The current Protractor Runner. * @param {Array} specs Array of Directory Path Strings. - * @return {q.Promise} Promise resolved with the test results + * @return {Promise} Promise resolved with the test results */ -exports.run = function(runner, specs) { - var JasmineRunner = require('jasmine'); - var jrunner = new JasmineRunner(); - /* global jasmine */ - - require('jasminewd2').init(webdriver.promise.controlFlow(), webdriver); +exports.run = async function(runner, specs) { + const JasmineRunner = require('jasmine'); + const jrunner = new JasmineRunner(); - var jasmineNodeOpts = runner.getConfig().jasmineNodeOpts; + const jasmineNodeOpts = runner.getConfig().jasmineNodeOpts; // On timeout, the flow should be reset. This will prevent webdriver tasks // from overflowing into the next test and causing it to fail or timeout // as well. This is done in the reporter instead of an afterEach block // to ensure that it runs after any afterEach() blocks with webdriver tasks // get to complete first. - var reporter = new RunnerReporter(runner); + const reporter = new RunnerReporter(runner); jasmine.getEnv().addReporter(reporter); // Add hooks for afterEach @@ -100,36 +94,32 @@ exports.run = function(runner, specs) { } } - return runner.runTestPreparer().then(function() { - return q.promise(function(resolve, reject) { - if (jasmineNodeOpts && jasmineNodeOpts.defaultTimeoutInterval) { - jasmine.DEFAULT_TIMEOUT_INTERVAL = jasmineNodeOpts.defaultTimeoutInterval; - } + await runner.runTestPreparer(); + return new Promise((resolve, reject) => { + if (jasmineNodeOpts && jasmineNodeOpts.defaultTimeoutInterval) { + jasmine.DEFAULT_TIMEOUT_INTERVAL = jasmineNodeOpts.defaultTimeoutInterval; + } - var originalOnComplete = runner.getConfig().onComplete; - - jrunner.onComplete(function(passed) { - try { - var completed = q(); - if (originalOnComplete) { - completed = q(originalOnComplete(passed)); - } - completed.then(function() { - resolve({ - failedCount: reporter.failedCount, - specResults: reporter.testResult - }); - }); - } catch (err) { - reject(err); - } - }); + const originalOnComplete = runner.getConfig().onComplete; - jrunner.configureDefaultReporter(jasmineNodeOpts); - jrunner.projectBaseDir = ''; - jrunner.specDir = ''; - jrunner.addSpecFiles(specs); - jrunner.execute(); + jrunner.onComplete(async(passed) => { + try { + if (originalOnComplete) { + await originalOnComplete(passed); + } + resolve({ + failedCount: reporter.failedCount, + specResults: reporter.testResult + }); + } catch (err) { + reject(err); + } }); + + jrunner.configureDefaultReporter(jasmineNodeOpts); + jrunner.projectBaseDir = ''; + jrunner.specDir = ''; + jrunner.addSpecFiles(specs); + jrunner.execute(); }); }; diff --git a/lib/frameworks/mocha.js b/lib/frameworks/mocha.js index d7d7f1d16..7317d98db 100644 --- a/lib/frameworks/mocha.js +++ b/lib/frameworks/mocha.js @@ -1,5 +1,3 @@ -var q = require('q'); - /** * Execute the Runner's test cases through Mocha. * @@ -7,134 +5,129 @@ var q = require('q'); * @param {Array} specs Array of Directory Path Strings. * @return {q.Promise} Promise resolved with the test results */ -exports.run = function(runner, specs) { - var Mocha = require('mocha'), - mocha = new Mocha(runner.getConfig().mochaOpts); +exports.run = (runner, specs) => { + const Mocha = require('mocha'); + const mocha = new Mocha(runner.getConfig().mochaOpts); // Add hooks for afterEach require('./setupAfterEach').setup(runner, specs); - var deferred = q.defer(); - - // Mocha doesn't set up the ui until the pre-require event, so - // wait until then to load mocha-webdriver adapters as well. - mocha.suite.on('pre-require', function() { - try { - // We need to re-wrap all of the global functions, which `selenium-webdriver/testing` only - // does when it is required. So first we must remove it from the cache. - delete require.cache[require.resolve('selenium-webdriver/testing')]; - var seleniumAdapter = require('selenium-webdriver/testing'); - - // Save unwrapped version - var unwrappedFns = {}; - ['after', 'afterEach', 'before', 'beforeEach', 'it', 'xit', 'iit'].forEach(function(fnName) { - unwrappedFns[fnName] = global[fnName] || Mocha[fnName]; - }); + return new Promise(async (resolve, reject) => { + // Mocha doesn't set up the ui until the pre-require event, so + // wait until then to load mocha-webdriver adapters as well. + mocha.suite.on('pre-require', () => { + try { + // We need to re-wrap all of the global functions, which `selenium-webdriver/testing` only + // does when it is required. So first we must remove it from the cache. + delete require.cache[require.resolve('selenium-webdriver/testing')]; + const seleniumAdapter = require('selenium-webdriver/testing'); + + // Save unwrapped version + let unwrappedFns = {}; + ['after', 'afterEach', 'before', 'beforeEach', 'it', 'xit', 'iit'].forEach((fnName) => { + unwrappedFns[fnName] = global[fnName] || Mocha[fnName]; + }); - var wrapFn = function(seleniumWrappedFn, opt_fnName) { - // This does not work on functions that can be nested (e.g. `describe`) - return function() { - // Set globals to unwrapped version to avoid circular reference - var wrappedFns = {}; - for (var fnName in unwrappedFns) { - wrappedFns[fnName] = global[fnName]; - global[fnName] = unwrappedFns[fnName]; - } + const wrapFn = (seleniumWrappedFn, opt_fnName) => { + // This does not work on functions that can be nested (e.g. `describe`) + return function() { + // Set globals to unwrapped version to avoid circular reference + let wrappedFns = {}; + for (let fnName in unwrappedFns) { + wrappedFns[fnName] = global[fnName]; + global[fnName] = unwrappedFns[fnName]; + } - var args = arguments; - // Allow before/after hooks to use names - if (opt_fnName && (arguments.length > 1) && (seleniumWrappedFn.length < 2)) { - global[opt_fnName] = global[opt_fnName].bind(this, args[0]); - args = Array.prototype.slice.call(arguments, 1); - } + let args = arguments; + // Allow before/after hooks to use names + if (opt_fnName && (arguments.length > 1) && (seleniumWrappedFn.length < 2)) { + global[opt_fnName] = global[opt_fnName].bind(this, args[0]); + args = Array.prototype.slice.call(arguments, 1); + } - try { - seleniumWrappedFn.apply(this, args); - } finally { - // Restore wrapped version - for (fnName in wrappedFns) { - global[fnName] = wrappedFns[fnName]; + try { + seleniumWrappedFn.apply(this, args); + } finally { + // Restore wrapped version + for (fnName in wrappedFns) { + global[fnName] = wrappedFns[fnName]; + } } - } + }; }; - }; - - // Wrap functions - global.after = wrapFn(seleniumAdapter.after, 'after'); - global.afterEach = wrapFn(seleniumAdapter.afterEach, 'afterEach'); - global.before = wrapFn(seleniumAdapter.before, 'before'); - global.beforeEach = wrapFn(seleniumAdapter.beforeEach, 'beforeEach'); - - global.it = wrapFn(seleniumAdapter.it); - global.iit = wrapFn(seleniumAdapter.it.only); - global.xit = wrapFn(seleniumAdapter.xit); - global.it.only = wrapFn(seleniumAdapter.it.only); - global.it.skip = wrapFn(seleniumAdapter.it.skip); - } catch (err) { - deferred.reject(err); - } - }); - - mocha.loadFiles(); - runner.runTestPreparer().then(function() { - specs.forEach(function(file) { - mocha.addFile(file); + // Wrap functions + global.after = wrapFn(seleniumAdapter.after, 'after'); + global.afterEach = wrapFn(seleniumAdapter.afterEach, 'afterEach'); + global.before = wrapFn(seleniumAdapter.before, 'before'); + global.beforeEach = wrapFn(seleniumAdapter.beforeEach, 'beforeEach'); + + global.it = wrapFn(seleniumAdapter.it); + global.iit = wrapFn(seleniumAdapter.it.only); + global.xit = wrapFn(seleniumAdapter.xit); + global.it.only = wrapFn(seleniumAdapter.it.only); + global.it.skip = wrapFn(seleniumAdapter.it.skip); + } catch (err) { + reject(err); + } }); - var testResult = []; + mocha.loadFiles(); - var mochaRunner = mocha.run(function(failures) { - try { - var completed = q(); - if (runner.getConfig().onComplete) { - completed = q(runner.getConfig().onComplete()); - } - completed.then(function() { - deferred.resolve({ + try { + await runner.runTestPreparer(); + specs.forEach((file) => { + mocha.addFile(file); + }); + let testResult = []; + + const mochaRunner = mocha.run(async (failures) => { + try { + if (runner.getConfig().onComplete) { + await runner.getConfig().onComplete(); + } + resolve({ failedCount: failures, specResults: testResult }); - }); - } catch (err) { - deferred.reject(err); - } - }); - - mochaRunner.on('pass', function(test) { - var testInfo = { - name: test.title, - category: test.fullTitle().slice(0, -test.title.length).trim() - }; - runner.emit('testPass', testInfo); - testResult.push({ - description: test.title, - assertions: [{ - passed: true - }], - duration: test.duration + } catch (err) { + reject(err); + } }); - }); - mochaRunner.on('fail', function(test) { - var testInfo = { - name: test.title, - category: test.fullTitle().slice(0, -test.title.length).trim() - }; - runner.emit('testFail', testInfo); - testResult.push({ - description: test.title, - assertions: [{ - passed: false, - errorMsg: test.err.message, - stackTrace: test.err.stack - }], - duration: test.duration + mochaRunner.on('pass', (test) => { + const testInfo = { + name: test.title, + category: test.fullTitle().slice(0, -test.title.length).trim() + }; + runner.emit('testPass', testInfo); + testResult.push({ + description: test.title, + assertions: [{ + passed: true + }], + duration: test.duration + }); }); - }); - }).catch (function(reason) { - deferred.reject(reason); - }); - return deferred.promise; + mochaRunner.on('fail', (test) => { + const testInfo = { + name: test.title, + category: test.fullTitle().slice(0, -test.title.length).trim() + }; + runner.emit('testFail', testInfo); + testResult.push({ + description: test.title, + assertions: [{ + passed: false, + errorMsg: test.err.message, + stackTrace: test.err.stack + }], + duration: test.duration + }); + }); + } catch (err) { + reject(err); + } + }); }; diff --git a/lib/util.ts b/lib/util.ts index 346051702..a090e2fb1 100644 --- a/lib/util.ts +++ b/lib/util.ts @@ -1,10 +1,9 @@ -import {resolve} from 'path'; -import {Promise, when} from 'q'; +import * as path from 'path'; import {error as wderror} from 'selenium-webdriver'; let STACK_SUBSTRINGS_TO_FILTER = [ 'node_modules/jasmine/', 'node_modules/selenium-webdriver', 'at Module.', 'at Object.Module.', - 'at Function.Module', '(timers.js:', 'jasminewd2/index.js', 'protractor/lib/' + 'at Function.Module', '(timers.js:', 'protractor/lib/' ]; @@ -33,35 +32,37 @@ export function filterStackTrace(text: string): string { * Internal helper for abstraction of polymorphic filenameOrFn properties. * @param {object} filenameOrFn The filename or function that we will execute. * @param {Array.}} args The args to pass into filenameOrFn. - * @return {q.Promise} A promise that will resolve when filenameOrFn completes. + * @return {Promise} A promise that will resolve when filenameOrFn completes. */ -export function runFilenameOrFn_(configDir: string, filenameOrFn: any, args?: any[]): Promise { - return Promise((resolvePromise) => { - if (filenameOrFn && !(typeof filenameOrFn === 'string' || typeof filenameOrFn === 'function')) { - throw new Error('filenameOrFn must be a string or function'); - } +export async function runFilenameOrFn_( + configDir: string, filenameOrFn: any, args?: any[]): Promise { + if (filenameOrFn && !(typeof filenameOrFn === 'string' || typeof filenameOrFn === 'function')) { + throw new Error('filenameOrFn must be a string or function'); + } - if (typeof filenameOrFn === 'string') { - filenameOrFn = require(resolve(configDir, filenameOrFn)); - } - if (typeof filenameOrFn === 'function') { - let results = when(filenameOrFn.apply(null, args), null, (err) => { - if (typeof err === 'string') { - err = new Error(err); - } else { - err = err as Error; - if (!err.stack) { - err.stack = new Error().stack; - } + if (typeof filenameOrFn === 'string') { + filenameOrFn = require(path.resolve(configDir, filenameOrFn)); + } + if (typeof filenameOrFn === 'function') { + let results; + try { + results = await filenameOrFn.apply(null, args); + } catch (err) { + if (typeof err === 'string') { + err = new Error(err); + } else { + err = err as Error; + if (!err.stack) { + err.stack = new Error().stack; } - err.stack = exports.filterStackTrace(err.stack); - throw err; - }); - resolvePromise(results); - } else { - resolvePromise(undefined); + } + err.stack = exports.filterStackTrace(err.stack); + throw err; } - }); + return results; + } else { + return undefined; + } } /** diff --git a/package-lock.json b/package-lock.json index 40781e592..b3a5a44e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,15 +33,6 @@ "integrity": "sha512-mkrHFZTgOXkZhau36K628iKFkjbp11t/bHCkY4Mefu4R6McMg2FD9P3naBv/0Ygyn4sz8baColJp2gdmSekgiw==", "dev": true }, - "@types/jasminewd2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", - "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", - "dev": true, - "requires": { - "@types/jasmine": "*" - } - }, "@types/minimatch": { "version": "2.0.29", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-2.0.29.tgz", @@ -65,11 +56,6 @@ "integrity": "sha1-qIc1gLOoS2msHmhzI7Ffu+uQR5o=", "dev": true }, - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=" - }, "@types/selenium-webdriver": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.10.tgz", @@ -2334,11 +2320,6 @@ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=" }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=" - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", diff --git a/package.json b/package.json index 1bcea3357..3baca5f1d 100644 --- a/package.json +++ b/package.json @@ -13,16 +13,13 @@ "author": "Julie Ralph ", "dependencies": { "@types/node": "^6.0.46", - "@types/q": "^0.0.32", "@types/selenium-webdriver": "^3.0.0", "blocking-proxy": "^1.0.0", "browserstack": "^1.5.1", "chalk": "^1.1.3", "glob": "^7.0.3", "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", "optimist": "~0.6.0", - "q": "1.4.1", "saucelabs": "^1.5.0", "selenium-webdriver": "3.6.0", "source-map-support": "~0.4.0", @@ -34,7 +31,6 @@ "@types/chalk": "^0.4.28", "@types/glob": "^5.0.29", "@types/jasmine": "^2.5.47", - "@types/jasminewd2": "^2.0.0", "@types/minimatch": "^2.0.28", "@types/minimist": "^1.1.28", "@types/optimist": "^0.0.29", diff --git a/scripts/test.js b/scripts/test.js index acf8f75f5..4ae0aa908 100755 --- a/scripts/test.js +++ b/scripts/test.js @@ -31,6 +31,7 @@ const passingTests = [ 'node built/cli.js spec/interactionConf.js', 'node built/cli.js spec/directConnectConf.js', 'node built/cli.js spec/restartBrowserBetweenTestsConf.js', + 'node spec/driverProviderTest.js', 'node built/cli.js spec/driverProviderLocalConf.js', 'node built/cli.js spec/driverProviderLocalConf.js --useBlockingProxy', 'node built/cli.js spec/getCapabilitiesConf.js', diff --git a/spec/basic/locators_spec.js b/spec/basic/locators_spec.js index f5945cbe5..4c064d2ac 100644 --- a/spec/basic/locators_spec.js +++ b/spec/basic/locators_spec.js @@ -317,7 +317,7 @@ describe('locators', () => { it('should find elements with text-transform style', async() => { expect(await element(by.cssContainingText('#transformedtext div', 'Uppercase')).getAttribute('id')).toBe('textuppercase'); - expect(element(await by.cssContainingText('#transformedtext div', + expect(await element(by.cssContainingText('#transformedtext div', 'Lowercase')).getAttribute('id')).toBe('textlowercase'); expect(await element(by.cssContainingText('#transformedtext div', 'capitalize')).getAttribute('id')).toBe('textcapitalize'); diff --git a/spec/driverProviderTest.js b/spec/driverProviderTest.js new file mode 100644 index 000000000..a10237869 --- /dev/null +++ b/spec/driverProviderTest.js @@ -0,0 +1,145 @@ +/** + * Sanity integration tests for Driver Providers. + * + * Assumed setup: + * - selenium server running locally at http://localhost:4444 + * - selenium jar and chromedriver in protractor/selenium, where + * webdriver-manager stores them. + * - if you want to test saucelabs, test with --sauceUser and --sauceKey + * - if you want to test browserstack driverProvider, test with + --browserstackUser and --browserstackKey + * You should verify that there are no lingering processes when these tests + * complete. + */ + +const argv = require('optimist').argv; +const env = require('./environment'); + +const Direct = require('../built/driverProviders/direct').Direct; +const Hosted = require('../built/driverProviders/hosted').Hosted; +const Local = require('../built/driverProviders/local').Local; +const Sauce = require('../built/driverProviders/sauce').Sauce; +const BrowserStack = require('../built/driverProviders/browserStack').BrowserStack; + +const testDriverProvider = async (driverProvider) => { + await driverProvider.setupEnv(); + const driver = driverProvider.getNewDriver(); + await driver.get('about:blank'); + const url = await driver.getCurrentUrl(); + if (url != 'about:blank') { + throw new Error(`url was not about:blank, instead found ${url}`); + } + + if (driverProvider.updateJob) { + await driverProvider.updateJob({'passed': true}); + await driverProvider.teardownEnv(); + } else { + await driverProvider.teardownEnv(); + } +}; + +const chromeConfig = { + capabilities: { + browserName: 'chrome' + } +}; + +testDriverProvider(new Direct(chromeConfig)). + then(() => { + console.log('direct.dp with chrome working!'); + }, (err) => { + console.error('direct.dp with chrome failed with', err); + throw err; + }); + +const firefoxConfig = { + capabilities: { + browserName: 'firefox' + } +}; +testDriverProvider(new Direct(firefoxConfig)). + then(() => { + console.log('direct.dp with firefox working!'); + }, (err) => { + console.error('direct.dp with firefox failed with', err); + throw err; + }); + +const hostedConfig = { + seleniumAddress: env.seleniumAddress, + capabilities: { + browserName: 'firefox' + } +}; +testDriverProvider(new Hosted(hostedConfig)). + then(() => { + console.log('hosted.dp working!'); + }, (err) => { + console.error('hosted.dp failed with', err); + throw err; + }); + +const hostedPromisedConfig = { + seleniumAddress: Promise.resolve(env.seleniumAddress), + capabilities: { + browserName: 'firefox' + } +}; +testDriverProvider(new Hosted(hostedPromisedConfig)). + then(() => { + console.log('hosted.dp with promises working!'); + }, (err) => { + console.error('hosted.dp with promises failed with', err); + throw err; + }); + +const localConfig = { + seleniumArgs: [], + capabilities: { + browserName: 'chrome' + } +}; +testDriverProvider(new Local(localConfig)). + then(() => { + console.log('local.dp working!'); + }, (err) => { + console.error('local.dp failed with', err); + throw err; + }); + +if (argv.sauceUser && argv.sauceKey) { + const sauceConfig = { + sauceUser: argv.sauceUser, + sauceKey: argv.sauceKey, + sauceBuild: argv.sauceBuild, + capabilities: { + browserName: 'chrome' + } + }; + testDriverProvider(new Sauce(sauceConfig)). + then(() => { + console.log('sauce.dp working!'); + }, (err) => { + console.error('sauce.dp failed with', err); + throw err; + }); +} + +if (argv.browserstackUser && argv.browserstackKey) { + const browserStackConfig = { + browserstackUser: argv.browserstackUser, + browserstackKey: argv.browserstackKey, + capabilities: { + 'build': 'protractor-browserstack-spec', + 'name': 'protractor-browserstack-spec', + 'browserName': 'chrome', + } + }; + testDriverProvider(new BrowserStack(browserStackConfig)). + then(() => { + console.log('browserstack.dp working!'); + }, (err) => { + console.error('browserstack.dp failed with', err); + throw err; + }); +} diff --git a/spec/driverprovider_test.js b/spec/driverprovider_test.js deleted file mode 100644 index e67d8b85f..000000000 --- a/spec/driverprovider_test.js +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Sanity integration tests for Driver Providers. - * - * Assumed setup: - * - selenium server running locally at http://localhost:4444 - * - selenium jar and chromedriver in protractor/selenium, where - * webdriver-manager stores them. - * - if you want to test saucelabs, test with --sauceUser and --sauceKey - * - if you want to test browserstack driverProvider, test with - --browserstackUser and --browserstackKey - * You should verify that there are no lingering processes when these tests - * complete. - */ - -var argv = require('optimist').argv; -var q = require('q'); -var env = require('./environment'); - -var Direct = require('../built/driverProviders/direct').Direct; -var Hosted = require('../built/driverProviders/hosted').Hosted; -var Local = require('../built/driverProviders/local').Local; -var Sauce = require('../built/driverProviders/sauce').Sauce; -var BrowserStack = require('../built/driverProviders/browserStack').BrowserStack; - -var testDriverProvider = function(driverProvider) { - return driverProvider.setupEnv().then(function() { - var driver = driverProvider.getNewDriver(); - var deferred = q.defer(); - driver.get('about:blank'); - driver.getCurrentUrl().then(function(url) { - if (url != 'about:blank') { - throw new Error('url was not about:blank, instead found ' + url); - } - deferred.resolve(); - }); - return deferred.promise; - }).then(function() { - if (driverProvider.updateJob) { - return driverProvider.updateJob({ - 'passed': true - }).then(function() { - return driverProvider.teardownEnv(); - }); - } else { - return driverProvider.teardownEnv(); - } - }); -}; - -var chromeConfig = { - capabilities: { - browserName: 'chrome' - } -}; -testDriverProvider(new Direct(chromeConfig)). - then(function() { - console.log('direct.dp with chrome working!'); - }, function(err) { - console.log('direct.dp with chrome failed with ' + err.stack); - }); - -var firefoxConfig = { - capabilities: { - browserName: 'firefox' - } -}; -testDriverProvider(new Direct(firefoxConfig)). - then(function() { - console.log('direct.dp with firefox working!'); - }, function(err) { - console.log('direct.dp with firefox failed with ' + err.stack); - }); - -var hostedConfig = { - seleniumAddress: env.seleniumAddress, - capabilities: { - browserName: 'firefox' - } -}; -testDriverProvider(new Hosted(hostedConfig)). - then(function() { - console.log('hosted.dp working!'); - }, function(err) { - console.log('hosted.dp failed with ' + err); - }); - -var hostedPromisedConfig = { - seleniumAddress: q.when(env.seleniumAddress), - capabilities: { - browserName: 'firefox' - } -}; -testDriverProvider(new Hosted(hostedPromisedConfig)). - then(function() { - console.log('hosted.dp with promises working!'); - }, function(err) { - console.log('hosted.dp with promises failed with ' + err); - }); - -var localConfig = { - seleniumArgs: [], - capabilities: { - browserName: 'chrome' - } -}; -testDriverProvider(new Local(localConfig)). - then(function() { - console.log('local.dp working!'); - }, function(err) { - console.log('local.dp failed with ' + err); - }); - -if (argv.sauceUser && argv.sauceKey) { - var sauceConfig = { - sauceUser: argv.sauceUser, - sauceKey: argv.sauceKey, - sauceBuild: argv.sauceBuild, - capabilities: { - browserName: 'chrome' - } - }; - testDriverProvider(new Sauce(sauceConfig)). - then(function() { - console.log('sauce.dp working!'); - }, function(err) { - console.log('sauce.dp failed with ' + err); - }); -} - -if (argv.browserstackUser && argv.browserstackKey) { - var browserStackConfig = { - browserstackUser: argv.browserstackUser, - browserstackKey: argv.browserstackKey, - capabilities: { - 'build': 'protractor-browserstack-spec', - 'name': 'protractor-browserstack-spec', - 'browserName': 'chrome', - } - }; - testDriverProvider(new BrowserStack(browserStackConfig)). - then(function() { - console.log('browserstack.dp working!'); - }, function(err) { - console.log('browserstack.dp failed with ' + err); - }); -} diff --git a/spec/mocha/lib_spec.js b/spec/mocha/lib_spec.js index e469f8d9e..60da3c8b0 100644 --- a/spec/mocha/lib_spec.js +++ b/spec/mocha/lib_spec.js @@ -33,7 +33,7 @@ describe('protractor library', () => { this.slow(6000); await browser.get('index.html'); - expect(browser.getTitle()).to.eventually.equal('My AngularJS App'); + expect(await browser.getTitle()).to.equal('My AngularJS App'); }); describe('with async tests', () => { diff --git a/spec/onPreparePromiseConf.js b/spec/onPreparePromiseConf.js index b01e527ac..9906e1fef 100644 --- a/spec/onPreparePromiseConf.js +++ b/spec/onPreparePromiseConf.js @@ -1,7 +1,6 @@ // Configuration using a function in onPrepare to set a parameter before // testing. const env = require('./environment.js'); -var q = require('q'); // The main suite of Protractor tests. exports.config = { diff --git a/spec/plugins/plugins/async_plugin.js b/spec/plugins/plugins/async_plugin.js index 2530ed0c2..d34f69a00 100644 --- a/spec/plugins/plugins/async_plugin.js +++ b/spec/plugins/plugins/async_plugin.js @@ -1,29 +1,27 @@ -var q = require('q'); - module.exports = { - setup: function() { - var self = this; - return q.delay(100).then(function() { - self.addSuccess(); + setup: async function() { + await new Promise(resolve => { + setTimeout(resolve, 100); }); + this.addSuccess(); }, - teardown: function() { - var self = this; - return q.delay(100).then(function() { - self.addSuccess(); + teardown: async function() { + await new Promise(resolve => { + setTimeout(resolve, 100); }); + this.addSuccess(); }, postResults: function() { // This function should cause no failures. }, - postTest: function() { - var self = this; - return q.delay(100).then(function() { - self.addSuccess(); + postTest: async function() { + await new Promise(resolve => { + setTimeout(resolve, 100); }); + this.addSuccess(); }, name: 'some plugin name' diff --git a/spec/plugins/plugins/failing_plugin.js b/spec/plugins/plugins/failing_plugin.js index ad436faaf..e1e781552 100644 --- a/spec/plugins/plugins/failing_plugin.js +++ b/spec/plugins/plugins/failing_plugin.js @@ -1,28 +1,26 @@ -var q = require('q'); - module.exports = { - setup: function() { - var self = this; - return q.delay(100).then(function() { - self.addFailure('from setup'); + setup: async function() { + await new Promise(resolve => { + setTimeout(resolve, 100); }); + self.addFailure('from setup'); }, teardown: function() { - var self = this; - return q.delay(100).then(function() { - self.addFailure('from teardown'); + await new Promise(resolve => { + setTimeout(resolve, 100); }); + self.addFailure('from teardown'); }, postResults: function() { // This function should cause no failures. }, - postTest: function(passed) { - var self = this; - return q.delay(100).then(function() { - self.addFailure('from postTest ' + (passed ? 'passing' : 'failing')); + postTest: async function(passed) { + await new Promise(resolve => { + setTimeout(resolve, 100); }); + self.addFailure('from postTest ' + (passed ? 'passing' : 'failing')); } }; diff --git a/spec/ts/basic/element_spec.ts b/spec/ts/basic/element_spec.ts index faabd61a5..75716f73b 100644 --- a/spec/ts/basic/element_spec.ts +++ b/spec/ts/basic/element_spec.ts @@ -1,6 +1,4 @@ // Based off of spec/basic/elements_spec.js -import * as q from 'q'; - import {$, browser, by, element, ElementArrayFinder, ElementFinder, promise as ppromise, WebElement} from '../../..'; describe('ElementFinder', () => {