From ac3bcc65d9892609e1ca60563078ba5c5c7a1e35 Mon Sep 17 00:00:00 2001 From: bstevens Date: Tue, 7 Nov 2017 16:20:58 -0600 Subject: [PATCH 1/9] Add TestObject as a data provider to Protractor --- docs/server-setup.md | 10 +++- lib/cli.ts | 2 + lib/config.ts | 17 +++++- lib/driverProviders/index.ts | 15 ++++- lib/driverProviders/testObject.ts | 99 +++++++++++++++++++++++++++++++ 5 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 lib/driverProviders/testObject.ts diff --git a/docs/server-setup.md b/docs/server-setup.md index e9dfb36c8..13d351a55 100644 --- a/docs/server-setup.md +++ b/docs/server-setup.md @@ -61,7 +61,15 @@ Please note that if you set seleniumAddress, the settings for `seleniumServerJar Remote Selenium Server ---------------------- -To run your tests against a remote Selenium Server, you will need an account with a service that hosts the server (and the browser drivers). Protractor has built in support for [BrowserStack](https://www.browserstack.com) and [Sauce Labs](http://www.saucelabs.com). +To run your tests against a remote Selenium Server, you will need an account with a service that hosts the server (and the browser drivers). Protractor has built in support for [BrowserStack](https://www.browserstack.com) , [Sauce Labs](http://www.saucelabs.com) and [TestObject](https://www.testobject.com). + +**Using TestObject as remote Selenium Server** + +In your config file, set these options: + - `testobjectUser` - The username for your TestObject account. + - `testobjectKey` - The key for your TestObject account. + +Please note that if you set `testobjectUser` and `testobjectKey`, the settings for `browserstackUser`, `browserstackKey`, `seleniumServerJar`, `seleniumPort`, `seleniumArgs`, `sauceUser` and `sauceKey` will be ignored. **Using BrowserStack as remote Selenium Server** diff --git a/lib/cli.ts b/lib/cli.ts index 0964e0c1e..79e82757b 100644 --- a/lib/cli.ts +++ b/lib/cli.ts @@ -50,6 +50,8 @@ let allowedNames = [ 'sauceSeleniumAddress', 'browserstackUser', 'browserstackKey', + 'testobjectUser', + 'testobjectKey', 'directConnect', 'firefoxPath', 'noGlobals', diff --git a/lib/config.ts b/lib/config.ts index 21b34d8eb..9b4601eaa 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -162,7 +162,20 @@ export interface Config { */ sauceSeleniumAddress?: string; - // ---- 4. To use remote browsers via BrowserStack --------------------------- + // ---- 4. To use remote browsers via TestObject --------------------------- + + /** + * If testobjectUser and testobjectKey are specified, browserstackUser, browserStackKey and seleniumServerJar + * will be ignored. The tests will be run remotely using TestObject. + */ + testobjectUser?: string; + /** + * If testobjectUser and testobjectKey are specified, browserStackUser, browserStackKey and seleniumServerJar + * will be ignored. The tests will be run remotely using TestObject. + */ + testobjectKey?: string; + + // ---- 5. To use remote browsers via BrowserStack --------------------------- /** * If browserstackUser and browserstackKey are specified, seleniumServerJar @@ -175,7 +188,7 @@ export interface Config { */ browserstackKey?: string; - // ---- 5. To connect directly to Drivers ------------------------------------ + // ---- 6. To connect directly to Drivers ------------------------------------ /** * If true, Protractor will connect directly to the browser Drivers diff --git a/lib/driverProviders/index.ts b/lib/driverProviders/index.ts index 40e066a8e..7bebcb8d9 100644 --- a/lib/driverProviders/index.ts +++ b/lib/driverProviders/index.ts @@ -6,6 +6,7 @@ export * from './hosted'; export * from './local'; export * from './mock'; export * from './sauce'; +export * from './testObject'; import {AttachSession} from './attachSession'; @@ -16,6 +17,7 @@ import {Hosted} from './hosted'; import {Local} from './local'; import {Mock} from './mock'; import {Sauce} from './sauce'; +import {TestObject} from "./testObject"; import {Config} from '../config'; import {Logger} from '../logger'; @@ -36,9 +38,12 @@ export let buildDriverProvider = (config: Config): DriverProvider => { driverProvider = new Hosted(config); logWarnings('hosted', config); } + } else if (config.testobjectUser && config.testobjectKey) { + driverProvider = new TestObject(config); + logWarnings('testObject', config); } else if (config.browserstackUser && config.browserstackKey) { - driverProvider = new BrowserStack(config); - logWarnings('browserStack', config); + driverProvider = new BrowserStack(config); + logWarnings('browserStack', config); } else if (config.sauceUser && config.sauceKey) { driverProvider = new Sauce(config); logWarnings('sauce', config); @@ -69,6 +74,12 @@ export let logWarnings = (providerType: string, config: Config): void => { if ('attachSession' !== providerType && config.seleniumSessionId) { warnList.push('seleniumSessionId'); } + if ('testObject' !== providerType && config.testObjectUser) { + warnList.push('testobjectUser'); + } + if ('testObject' !== providerType && config.testObjectKey) { + warnList.push('testobjectKey'); + } if ('browserStack' !== providerType && config.browserstackUser) { warnList.push('browserstackUser'); } diff --git a/lib/driverProviders/testObject.ts b/lib/driverProviders/testObject.ts new file mode 100644 index 000000000..a429bc157 --- /dev/null +++ b/lib/driverProviders/testObject.ts @@ -0,0 +1,99 @@ +/* + * This is an implementation of the TestObject Driver Provider. + * It is responsible for setting up the account object, tearing + * it down, and setting up the driver correctly. + */ +import * as https from 'https'; +import * as q from 'q'; +import {Session, WebDriver} from 'selenium-webdriver'; +import * as util from 'util'; + +import {Config} from '../config'; +import {BrowserError} from '../exitCodes'; +import {Logger} from '../logger'; + +import {DriverProvider} from './driverProvider'; + +let logger = new Logger('testobject'); + +export class TestObject extends DriverProvider { + constructor(config: Config) { + super(config); + } + + /** + * Hook to update the TestObject job status. + * @public + * @param {Object} update + * @return {q.promise} A promise that will resolve when the update is complete. + */ + updateJob(update: any): q.Promise { + let deferredArray = this.drivers_.map((driver: WebDriver) => { + let deferred = q.defer(); + driver.getSession().then((session: Session) => { + let headers: Object = { + 'Content-Type': 'application/json', + 'Authorization': 'Basic ' + + new Buffer(this.config_.testobjectUser + ':' + this.config_.testobjectKey) + .toString('base64') + }; + + let req = https.request(options, (res) => { + res.on('data', (data: Buffer) => { + let info = JSON.parse(data.toString()); + if (info && info.automation_session && info.automation_session.browser_url) { + logger.info( + 'TestObject results available at ' + info.automation_session.browser_url); + } else { + logger.info( + 'TestObject results available at ' + + 'https://app.testobject.com/#'); + } + }); + }); + req.end(); + req.on('error', (e: Error) => { + logger.info( + 'TestObject results available at ' + + 'https://www.browserstack.com/automate'); + }); + let jobStatus = update.passed ? 'completed' : 'error'; + options.method = 'PUT'; + let update_req = https.request(options, (res) => { + let responseStr = ''; + res.on('data', (data: Buffer) => { + responseStr += data.toString(); + }); + res.on('end', () => { + logger.info(responseStr); + deferred.resolve(); + }); + res.on('error', (e: Error) => { + throw new BrowserError( + logger, 'Error updating TestObject pass/fail status: ' + util.inspect(e)); + }); + }); + update_req.write('{"status":"' + jobStatus + '"}'); + update_req.end(); + }); + return deferred.promise; + }); + return q.all(deferredArray); + } + + /** + * Configure and launch (if applicable) the object's environment. + * @return {q.promise} A promise which will resolve when the environment is + * ready to test. + */ + protected setupDriverEnv(): q.Promise { + let deferred = q.defer(); + this.config_.capabilities['testobject.user'] = this.config_.testobjectUser; + this.config_.capabilities['testobject.key'] = this.config_.testobjectKey; + this.config_.seleniumAddress = 'https://us1.appium.testobject.com/wd/hub'; + + logger.info('Using TestObject selenium server at ' + this.config_.seleniumAddress); + deferred.resolve(); + return deferred.promise; + } +} From 60c7bd740171f3230d6e3a07a55860aec9def43c Mon Sep 17 00:00:00 2001 From: bstevens Date: Tue, 7 Nov 2017 16:49:37 -0600 Subject: [PATCH 2/9] updated testObject.ts --- lib/config.ts | 12 +++--- lib/driverProviders/index.ts | 10 ++--- lib/driverProviders/testObject.ts | 66 ------------------------------- 3 files changed, 11 insertions(+), 77 deletions(-) diff --git a/lib/config.ts b/lib/config.ts index 9b4601eaa..e62671c96 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -165,17 +165,17 @@ export interface Config { // ---- 4. To use remote browsers via TestObject --------------------------- /** - * If testobjectUser and testobjectKey are specified, browserstackUser, browserStackKey and seleniumServerJar - * will be ignored. The tests will be run remotely using TestObject. + * If testobjectUser and testobjectKey are specified, browserstackUser, browserStackKey and + * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. */ testobjectUser?: string; /** - * If testobjectUser and testobjectKey are specified, browserStackUser, browserStackKey and seleniumServerJar - * will be ignored. The tests will be run remotely using TestObject. + * If testobjectUser and testobjectKey are specified, browserStackUser, browserStackKey and + * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. */ testobjectKey?: string; - // ---- 5. To use remote browsers via BrowserStack --------------------------- + // ---- 5. To use remote browsers via BrowserStack --------------------------- /** * If browserstackUser and browserstackKey are specified, seleniumServerJar @@ -188,7 +188,7 @@ export interface Config { */ browserstackKey?: string; - // ---- 6. To connect directly to Drivers ------------------------------------ + // ---- 6. To connect directly to Drivers ------------------------------------ /** * If true, Protractor will connect directly to the browser Drivers diff --git a/lib/driverProviders/index.ts b/lib/driverProviders/index.ts index 7bebcb8d9..89566e72e 100644 --- a/lib/driverProviders/index.ts +++ b/lib/driverProviders/index.ts @@ -17,7 +17,7 @@ import {Hosted} from './hosted'; import {Local} from './local'; import {Mock} from './mock'; import {Sauce} from './sauce'; -import {TestObject} from "./testObject"; +import {TestObject} from './testObject'; import {Config} from '../config'; import {Logger} from '../logger'; @@ -39,11 +39,11 @@ export let buildDriverProvider = (config: Config): DriverProvider => { logWarnings('hosted', config); } } else if (config.testobjectUser && config.testobjectKey) { - driverProvider = new TestObject(config); - logWarnings('testObject', config); + driverProvider = new TestObject(config); + logWarnings('testObject', config); } else if (config.browserstackUser && config.browserstackKey) { - driverProvider = new BrowserStack(config); - logWarnings('browserStack', config); + driverProvider = new BrowserStack(config); + logWarnings('browserStack', config); } else if (config.sauceUser && config.sauceKey) { driverProvider = new Sauce(config); logWarnings('sauce', config); diff --git a/lib/driverProviders/testObject.ts b/lib/driverProviders/testObject.ts index a429bc157..8d53bc54a 100644 --- a/lib/driverProviders/testObject.ts +++ b/lib/driverProviders/testObject.ts @@ -3,15 +3,9 @@ * It is responsible for setting up the account object, tearing * it down, and setting up the driver correctly. */ -import * as https from 'https'; import * as q from 'q'; -import {Session, WebDriver} from 'selenium-webdriver'; -import * as util from 'util'; - import {Config} from '../config'; -import {BrowserError} from '../exitCodes'; import {Logger} from '../logger'; - import {DriverProvider} from './driverProvider'; let logger = new Logger('testobject'); @@ -21,66 +15,6 @@ export class TestObject extends DriverProvider { super(config); } - /** - * Hook to update the TestObject job status. - * @public - * @param {Object} update - * @return {q.promise} A promise that will resolve when the update is complete. - */ - updateJob(update: any): q.Promise { - let deferredArray = this.drivers_.map((driver: WebDriver) => { - let deferred = q.defer(); - driver.getSession().then((session: Session) => { - let headers: Object = { - 'Content-Type': 'application/json', - 'Authorization': 'Basic ' + - new Buffer(this.config_.testobjectUser + ':' + this.config_.testobjectKey) - .toString('base64') - }; - - let req = https.request(options, (res) => { - res.on('data', (data: Buffer) => { - let info = JSON.parse(data.toString()); - if (info && info.automation_session && info.automation_session.browser_url) { - logger.info( - 'TestObject results available at ' + info.automation_session.browser_url); - } else { - logger.info( - 'TestObject results available at ' + - 'https://app.testobject.com/#'); - } - }); - }); - req.end(); - req.on('error', (e: Error) => { - logger.info( - 'TestObject results available at ' + - 'https://www.browserstack.com/automate'); - }); - let jobStatus = update.passed ? 'completed' : 'error'; - options.method = 'PUT'; - let update_req = https.request(options, (res) => { - let responseStr = ''; - res.on('data', (data: Buffer) => { - responseStr += data.toString(); - }); - res.on('end', () => { - logger.info(responseStr); - deferred.resolve(); - }); - res.on('error', (e: Error) => { - throw new BrowserError( - logger, 'Error updating TestObject pass/fail status: ' + util.inspect(e)); - }); - }); - update_req.write('{"status":"' + jobStatus + '"}'); - update_req.end(); - }); - return deferred.promise; - }); - return q.all(deferredArray); - } - /** * Configure and launch (if applicable) the object's environment. * @return {q.promise} A promise which will resolve when the environment is From 33563ba971034269abd2b7d8ecdfe135cdea11a5 Mon Sep 17 00:00:00 2001 From: lt-bstevens <33468571+lt-bstevens@users.noreply.github.com> Date: Wed, 8 Nov 2017 14:42:11 -0600 Subject: [PATCH 3/9] Update testObject.ts Changed testobject.key to testobject_api_key so capabilities file reads it correctly --- lib/driverProviders/testObject.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/driverProviders/testObject.ts b/lib/driverProviders/testObject.ts index 8d53bc54a..829851e40 100644 --- a/lib/driverProviders/testObject.ts +++ b/lib/driverProviders/testObject.ts @@ -23,7 +23,7 @@ export class TestObject extends DriverProvider { protected setupDriverEnv(): q.Promise { let deferred = q.defer(); this.config_.capabilities['testobject.user'] = this.config_.testobjectUser; - this.config_.capabilities['testobject.key'] = this.config_.testobjectKey; + this.config_.capabilities['testobject_api_key'] = this.config_.testobjectKey; this.config_.seleniumAddress = 'https://us1.appium.testobject.com/wd/hub'; logger.info('Using TestObject selenium server at ' + this.config_.seleniumAddress); From ab9fd0e7c0767c436f429c871bdf799241fff6dd Mon Sep 17 00:00:00 2001 From: bstevens Date: Thu, 7 Dec 2017 14:19:42 -0600 Subject: [PATCH 4/9] feat(driverProviders): Add TestObject to driverProviders Many Sauce Labs customers are looking to test against the Real Device Cloud available through Test Object for mobile automation. These changes add that ability and will pull those credentials in to be used for remote connection, if credentials are present. --- lib/driverProviders/testObject.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/driverProviders/testObject.ts b/lib/driverProviders/testObject.ts index 8d53bc54a..617e76aa4 100644 --- a/lib/driverProviders/testObject.ts +++ b/lib/driverProviders/testObject.ts @@ -18,7 +18,7 @@ export class TestObject extends DriverProvider { /** * Configure and launch (if applicable) the object's environment. * @return {q.promise} A promise which will resolve when the environment is - * ready to test. + * ready to test. */ protected setupDriverEnv(): q.Promise { let deferred = q.defer(); From 3b2646c4c4dfc43774c6851307d15751b1b8d42f Mon Sep 17 00:00:00 2001 From: bstevens Date: Thu, 7 Dec 2017 15:05:26 -0600 Subject: [PATCH 5/9] feat(driverProviders): Add TestObject(Sauce Labs Mobile) as a driverProvider 1. Add testObject to driverProviders 2. Add testObject items to cli, config and index 3. Add instructions for using testObject to server-setup --- lib/driverProviders/testObject.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/driverProviders/testObject.ts b/lib/driverProviders/testObject.ts index 8d53bc54a..617e76aa4 100644 --- a/lib/driverProviders/testObject.ts +++ b/lib/driverProviders/testObject.ts @@ -18,7 +18,7 @@ export class TestObject extends DriverProvider { /** * Configure and launch (if applicable) the object's environment. * @return {q.promise} A promise which will resolve when the environment is - * ready to test. + * ready to test. */ protected setupDriverEnv(): q.Promise { let deferred = q.defer(); From b504b2ea1f2e7b37c6b71042d3faa65140fc54c4 Mon Sep 17 00:00:00 2001 From: bstevens Date: Mon, 18 Dec 2017 15:33:42 -0600 Subject: [PATCH 6/9] feat(driverProviders): Add TestObject and Kobiton as driverProviders 1. Add testObject and kobiton to driverProviders 2. Add testObject and kobiton items to cli, config and index 3. Add instructions for using testObject and kobiton to server-setup --- docs/server-setup.md | 10 +++++++++- lib/cli.ts | 2 ++ lib/config.ts | 21 +++++++++++++++++---- lib/driverProviders/index.ts | 11 +++++++++++ lib/driverProviders/kobiton.ts | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 lib/driverProviders/kobiton.ts diff --git a/docs/server-setup.md b/docs/server-setup.md index 13d351a55..296722d2f 100644 --- a/docs/server-setup.md +++ b/docs/server-setup.md @@ -69,7 +69,15 @@ In your config file, set these options: - `testobjectUser` - The username for your TestObject account. - `testobjectKey` - The key for your TestObject account. -Please note that if you set `testobjectUser` and `testobjectKey`, the settings for `browserstackUser`, `browserstackKey`, `seleniumServerJar`, `seleniumPort`, `seleniumArgs`, `sauceUser` and `sauceKey` will be ignored. +Please note that if you set `testobjectUser` and `testobjectKey`, the settings for `kobitonUser`, `kobitonKey`, `browserstackUser`, `browserstackKey`, `seleniumServerJar`, `seleniumPort`, `seleniumArgs`, `sauceUser` and `sauceKey` will be ignored. + +**Using Kobiton as remote Selenium Server** + +In your config file, set these options: + - `kobitonUser` - The username for your Kobiton account. + - `kobitonKey` - The API key from your Kobiton account. + +Please note that if you set `kobitonUser` and `kobitonKey`, the settings for `browserstackUser`, `browserstackKey`, `seleniumServerJar`, `seleniumPort`, `seleniumArgs`, `sauceUser` and `sauceKey` will be ignored. **Using BrowserStack as remote Selenium Server** diff --git a/lib/cli.ts b/lib/cli.ts index 79e82757b..c62f3cee8 100644 --- a/lib/cli.ts +++ b/lib/cli.ts @@ -50,6 +50,8 @@ let allowedNames = [ 'sauceSeleniumAddress', 'browserstackUser', 'browserstackKey', + 'kobitonUser', + 'kobitonKey', 'testobjectUser', 'testobjectKey', 'directConnect', diff --git a/lib/config.ts b/lib/config.ts index e62671c96..3e8dfcbe1 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -165,17 +165,30 @@ export interface Config { // ---- 4. To use remote browsers via TestObject --------------------------- /** - * If testobjectUser and testobjectKey are specified, browserstackUser, browserStackKey and + * If testobjectUser and testobjectKey are specified, kobitonUser, kobitonKey, browserstackUser, browserStackKey and * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. */ testobjectUser?: string; /** - * If testobjectUser and testobjectKey are specified, browserStackUser, browserStackKey and + * If testobjectUser and testobjectKey are specified, kobitonUser, kobitonKey, browserStackUser, browserStackKey and * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. */ testobjectKey?: string; - // ---- 5. To use remote browsers via BrowserStack --------------------------- + // ---- 5. To use remote browsers via TestObject --------------------------- + + /** + * If kobitonUser and kobitonKey are specified, testobjectUser, testojbectKey, browserstackUser, browserStackKey and + * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. + */ + kobitonUser?: string; + /** + * If kobitonUser and kobitonKey are specified, testobjectUser, testojbectKey, browserStackUser, browserStackKey and + * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. + */ + kobitonKey?: string; + + // ---- 6. To use remote browsers via BrowserStack --------------------------- /** * If browserstackUser and browserstackKey are specified, seleniumServerJar @@ -188,7 +201,7 @@ export interface Config { */ browserstackKey?: string; - // ---- 6. To connect directly to Drivers ------------------------------------ + // ---- 7. To connect directly to Drivers ------------------------------------ /** * If true, Protractor will connect directly to the browser Drivers diff --git a/lib/driverProviders/index.ts b/lib/driverProviders/index.ts index 89566e72e..6663a333e 100644 --- a/lib/driverProviders/index.ts +++ b/lib/driverProviders/index.ts @@ -7,6 +7,7 @@ export * from './local'; export * from './mock'; export * from './sauce'; export * from './testObject'; +export * from './kobiton'; import {AttachSession} from './attachSession'; @@ -18,6 +19,7 @@ import {Local} from './local'; import {Mock} from './mock'; import {Sauce} from './sauce'; import {TestObject} from './testObject'; +import {Kobiton} from "./kobiton"; import {Config} from '../config'; import {Logger} from '../logger'; @@ -41,6 +43,9 @@ export let buildDriverProvider = (config: Config): DriverProvider => { } else if (config.testobjectUser && config.testobjectKey) { driverProvider = new TestObject(config); logWarnings('testObject', config); + } else if (config.kobitonUser && config.kobitonKey ) { + driverProvider = new Kobiton(config); + logWarnings('kobiton', config); } else if (config.browserstackUser && config.browserstackKey) { driverProvider = new BrowserStack(config); logWarnings('browserStack', config); @@ -80,6 +85,12 @@ export let logWarnings = (providerType: string, config: Config): void => { if ('testObject' !== providerType && config.testObjectKey) { warnList.push('testobjectKey'); } + if ('kobitonUser' !== providerType && config.kobitonUser) { + warnList.push('kobitonUser'); + } + if ('kobitonKey' !== providerType && config.kobitonKey) { + warnList.push('kobitonKey'); + } if ('browserStack' !== providerType && config.browserstackUser) { warnList.push('browserstackUser'); } diff --git a/lib/driverProviders/kobiton.ts b/lib/driverProviders/kobiton.ts new file mode 100644 index 000000000..09fd43144 --- /dev/null +++ b/lib/driverProviders/kobiton.ts @@ -0,0 +1,33 @@ +/* + * This is an implementation of the TestObject Driver Provider. + * It is responsible for setting up the account object, tearing + * it down, and setting up the driver correctly. + */ +import * as q from 'q'; +import {Config} from '../config'; +import {Logger} from '../logger'; +import {DriverProvider} from './driverProvider'; + +let logger = new Logger('kobiton'); + +export class Kobiton extends DriverProvider { + constructor(config: Config) { + super(config); + } + + /** + * Configure and launch (if applicable) the object's environment. + * @return {q.promise} A promise which will resolve when the environment is + * ready to test. + */ + protected setupDriverEnv(): q.Promise { + let deferred = q.defer(); + this.config_.capabilities['kobitonUser'] = this.config_.testobjectUser; + this.config_.capabilities['kobitonKey'] = this.config_.testobjectKey; + this.config_.seleniumAddress = 'https://' + this.config_.testobjectUser + ':' + this.config_.testobjectKey + '@api.kobiton.com/wd/hub'; + + logger.info('Using Kobiton selenium server at ' + this.config_.seleniumAddress); + deferred.resolve(); + return deferred.promise; + } +} From a7655e17d3583e881d74cd01541084f354403c0d Mon Sep 17 00:00:00 2001 From: bstevens Date: Tue, 19 Dec 2017 08:39:03 -0600 Subject: [PATCH 7/9] feat(driverProviders): Add TestObject and Kobiton as driverProviders 1. Add testObject and kobiton to driverProviders 2. Add testObject and kobiton items to cli, config and index 3. Add instructions for using testObject and kobiton to server-setup --- lib/config.ts | 2 +- lib/driverProviders/kobiton.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/config.ts b/lib/config.ts index 3e8dfcbe1..df5a8c6cf 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -175,7 +175,7 @@ export interface Config { */ testobjectKey?: string; - // ---- 5. To use remote browsers via TestObject --------------------------- + // ---- 5. To use remote browsers via Kobiton --------------------------- /** * If kobitonUser and kobitonKey are specified, testobjectUser, testojbectKey, browserstackUser, browserStackKey and diff --git a/lib/driverProviders/kobiton.ts b/lib/driverProviders/kobiton.ts index 09fd43144..a1b2f431c 100644 --- a/lib/driverProviders/kobiton.ts +++ b/lib/driverProviders/kobiton.ts @@ -1,5 +1,5 @@ /* - * This is an implementation of the TestObject Driver Provider. + * This is an implementation of the Kobiton Driver Provider. * It is responsible for setting up the account object, tearing * it down, and setting up the driver correctly. */ From f4c82aad39ce6f59d82da1176ac25ce65a7d76cc Mon Sep 17 00:00:00 2001 From: bstevens Date: Tue, 19 Dec 2017 08:50:18 -0600 Subject: [PATCH 8/9] feat(driverProviders): Add TestObject(Sauce Labs Mobile) as a driverProvider Fixed formatting in kobiton and config files --- lib/config.ts | 20 ++++++++++++-------- lib/driverProviders/index.ts | 8 ++++---- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/config.ts b/lib/config.ts index df5a8c6cf..e07981361 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -165,26 +165,30 @@ export interface Config { // ---- 4. To use remote browsers via TestObject --------------------------- /** - * If testobjectUser and testobjectKey are specified, kobitonUser, kobitonKey, browserstackUser, browserStackKey and - * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. + * If testobjectUser and testobjectKey are specified, kobitonUser, kobitonKey, browserstackUser, + * browserStackKey and seleniumServerJar will be ignored. The tests will be run remotely using + * TestObject. */ testobjectUser?: string; /** - * If testobjectUser and testobjectKey are specified, kobitonUser, kobitonKey, browserStackUser, browserStackKey and - * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. + * If testobjectUser and testobjectKey are specified, kobitonUser, kobitonKey, browserStackUser, + * browserStackKey and seleniumServerJar will be ignored. The tests will be run remotely using + * TestObject. */ testobjectKey?: string; // ---- 5. To use remote browsers via Kobiton --------------------------- /** - * If kobitonUser and kobitonKey are specified, testobjectUser, testojbectKey, browserstackUser, browserStackKey and - * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. + * If kobitonUser and kobitonKey are specified, testobjectUser, testojbectKey, browserstackUser, + * browserStackKey and seleniumServerJar will be ignored. The tests will be run remotely using + * TestObject. */ kobitonUser?: string; /** - * If kobitonUser and kobitonKey are specified, testobjectUser, testojbectKey, browserStackUser, browserStackKey and - * seleniumServerJar will be ignored. The tests will be run remotely using TestObject. + * If kobitonUser and kobitonKey are specified, testobjectUser, testojbectKey, browserStackUser, + * browserStackKey and seleniumServerJar will be ignored. The tests will be run remotely using + * TestObject. */ kobitonKey?: string; diff --git a/lib/driverProviders/index.ts b/lib/driverProviders/index.ts index 6663a333e..25fcabcf6 100644 --- a/lib/driverProviders/index.ts +++ b/lib/driverProviders/index.ts @@ -19,7 +19,7 @@ import {Local} from './local'; import {Mock} from './mock'; import {Sauce} from './sauce'; import {TestObject} from './testObject'; -import {Kobiton} from "./kobiton"; +import {Kobiton} from './kobiton'; import {Config} from '../config'; import {Logger} from '../logger'; @@ -43,7 +43,7 @@ export let buildDriverProvider = (config: Config): DriverProvider => { } else if (config.testobjectUser && config.testobjectKey) { driverProvider = new TestObject(config); logWarnings('testObject', config); - } else if (config.kobitonUser && config.kobitonKey ) { + } else if (config.kobitonUser && config.kobitonKey) { driverProvider = new Kobiton(config); logWarnings('kobiton', config); } else if (config.browserstackUser && config.browserstackKey) { @@ -86,10 +86,10 @@ export let logWarnings = (providerType: string, config: Config): void => { warnList.push('testobjectKey'); } if ('kobitonUser' !== providerType && config.kobitonUser) { - warnList.push('kobitonUser'); + warnList.push('kobitonUser'); } if ('kobitonKey' !== providerType && config.kobitonKey) { - warnList.push('kobitonKey'); + warnList.push('kobitonKey'); } if ('browserStack' !== providerType && config.browserstackUser) { warnList.push('browserstackUser'); From ca08b133b3e922dff472001c18c39066d8fb6417 Mon Sep 17 00:00:00 2001 From: bstevens Date: Tue, 19 Dec 2017 08:54:55 -0600 Subject: [PATCH 9/9] feat(driverProviders): Add TestObject(Sauce Labs Mobile) as a driverProvider 1. Add testObject to driverProviders 2. Add testObject items to cli, config and index 3. Add instructions for using testObject to server-setup --- lib/driverProviders/kobiton.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/driverProviders/kobiton.ts b/lib/driverProviders/kobiton.ts index a1b2f431c..8bfc53ddc 100644 --- a/lib/driverProviders/kobiton.ts +++ b/lib/driverProviders/kobiton.ts @@ -22,9 +22,10 @@ export class Kobiton extends DriverProvider { */ protected setupDriverEnv(): q.Promise { let deferred = q.defer(); - this.config_.capabilities['kobitonUser'] = this.config_.testobjectUser; - this.config_.capabilities['kobitonKey'] = this.config_.testobjectKey; - this.config_.seleniumAddress = 'https://' + this.config_.testobjectUser + ':' + this.config_.testobjectKey + '@api.kobiton.com/wd/hub'; + this.config_.capabilities['kobitonUser'] = this.config_.kobitonUser; + this.config_.capabilities['kobitonKey'] = this.config_.kobitonKey; + this.config_.seleniumAddress = 'https://' + this.config_.kobitonUser + ':' + + this.config_.kobitonKey + '@api.kobiton.com/wd/hub'; logger.info('Using Kobiton selenium server at ' + this.config_.seleniumAddress); deferred.resolve();