Skip to content
This repository was archived by the owner on Jul 29, 2024. It is now read-only.

Commit 03e2209

Browse files
raghuhitqiyigg
authored andcommitted
feat(driverProvider) Adding browserstackProxy param in BrowserStack driverProvider (#4852)
1 parent ed955e5 commit 03e2209

File tree

7 files changed

+81
-51
lines changed

7 files changed

+81
-51
lines changed

lib/cli.ts

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ let allowedNames = [
5050
'sauceSeleniumAddress',
5151
'browserstackUser',
5252
'browserstackKey',
53+
'browserstackProxy',
5354
'kobitonUser',
5455
'kobitonKey',
5556
'testobjectUser',

lib/config.ts

+7
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,13 @@ export interface Config {
205205
*/
206206
browserstackKey?: string;
207207

208+
/**
209+
* Proxy server to be used for connecting to BrowserStack APIs
210+
* e.g. "http://proxy.example.com:1234".
211+
* This should be used when you are behind a proxy server.
212+
*/
213+
browserstackProxy?: string;
214+
208215
// ---- 7. To connect directly to Drivers ------------------------------------
209216

210217
/**

lib/driverProviders/browserStack.ts

+42-49
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,13 @@ import {Logger} from '../logger';
1414

1515
import {DriverProvider} from './driverProvider';
1616

17+
const BrowserstackClient = require('browserstack');
18+
1719
let logger = new Logger('browserstack');
1820

1921
export class BrowserStack extends DriverProvider {
22+
browserstackClient: any;
23+
2024
constructor(config: Config) {
2125
super(config);
2226
}
@@ -30,58 +34,41 @@ export class BrowserStack extends DriverProvider {
3034
updateJob(update: any): q.Promise<any> {
3135
let deferredArray = this.drivers_.map((driver: WebDriver) => {
3236
let deferred = q.defer();
37+
3338
driver.getSession().then((session: Session) => {
34-
let headers = {
35-
'Content-Type': 'application/json',
36-
'Authorization': 'Basic ' +
37-
new Buffer(this.config_.browserstackUser + ':' + this.config_.browserstackKey)
38-
.toString('base64')
39-
};
40-
let options = {
41-
hostname: 'www.browserstack.com',
42-
port: 443,
43-
path: '/automate/sessions/' + session.getId() + '.json',
44-
method: 'GET',
45-
headers: headers
46-
};
4739

48-
let req = https.request(options, (res) => {
49-
res.on('data', (data: Buffer) => {
50-
let info = JSON.parse(data.toString());
51-
if (info && info.automation_session && info.automation_session.browser_url) {
52-
logger.info(
53-
'BrowserStack results available at ' + info.automation_session.browser_url);
54-
} else {
55-
logger.info(
56-
'BrowserStack results available at ' +
57-
'https://www.browserstack.com/automate');
58-
}
59-
});
60-
});
61-
req.end();
62-
req.on('error', (e: Error) => {
63-
logger.info(
64-
'BrowserStack results available at ' +
65-
'https://www.browserstack.com/automate');
66-
});
40+
// Fetching BrowserStack session details.
41+
this.browserstackClient.getSession(
42+
session.getId(), function(error: Error, automate_session: any) {
43+
if (error) {
44+
logger.info(
45+
'BrowserStack results available at ' +
46+
'https://www.browserstack.com/automate');
47+
} else {
48+
if (automate_session && automate_session.browser_url) {
49+
logger.info('BrowserStack results available at ' + automate_session.browser_url);
50+
} else {
51+
logger.info(
52+
'BrowserStack results available at ' +
53+
'https://www.browserstack.com/automate');
54+
}
55+
}
56+
});
57+
6758
let jobStatus = update.passed ? 'completed' : 'error';
68-
options.method = 'PUT';
69-
let update_req = https.request(options, (res) => {
70-
let responseStr = '';
71-
res.on('data', (data: Buffer) => {
72-
responseStr += data.toString();
73-
});
74-
res.on('end', () => {
75-
logger.info(responseStr);
76-
deferred.resolve();
77-
});
78-
res.on('error', (e: Error) => {
79-
throw new BrowserError(
80-
logger, 'Error updating BrowserStack pass/fail status: ' + util.inspect(e));
81-
});
82-
});
83-
update_req.write('{"status":"' + jobStatus + '"}');
84-
update_req.end();
59+
let statusObj = {status: jobStatus};
60+
61+
// Updating status of BrowserStack session.
62+
this.browserstackClient.updateSession(
63+
session.getId(), statusObj, function(error: Error, automate_session: any) {
64+
if (error) {
65+
throw new BrowserError(
66+
logger, 'Error updating BrowserStack pass/fail status: ' + util.inspect(error));
67+
} else {
68+
logger.info(automate_session);
69+
deferred.resolve();
70+
}
71+
});
8572
});
8673
return deferred.promise;
8774
});
@@ -99,6 +86,12 @@ export class BrowserStack extends DriverProvider {
9986
this.config_.capabilities['browserstack.key'] = this.config_.browserstackKey;
10087
this.config_.seleniumAddress = 'http://hub.browserstack.com/wd/hub';
10188

89+
this.browserstackClient = BrowserstackClient.createAutomateClient({
90+
username: this.config_.browserstackUser,
91+
password: this.config_.browserstackKey,
92+
proxy: this.config_.browserstackProxy
93+
});
94+
10295
// Append filename to capabilities.name so that it's easier to identify
10396
// tests.
10497
if (this.config_.capabilities.name && this.config_.capabilities.shardTestFiles) {

package-lock.json

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"@types/q": "^0.0.32",
1717
"@types/selenium-webdriver": "~2.53.39",
1818
"blocking-proxy": "^1.0.0",
19+
"browserstack": "^1.5.1",
1920
"chalk": "^1.1.3",
2021
"glob": "^7.0.3",
2122
"jasmine": "2.8.0",

scripts/errorTest.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ var checkLogs = function(output, messages) {
2323
runProtractor = spawn('node',
2424
['bin/protractor', 'spec/errorTest/sauceLabsAuthentication.js']);
2525
output = runProtractor.stdout.toString();
26-
messages = ['WebDriverError: Sauce Labs Authentication Error.',
26+
messages = ['WebDriverError: Misconfigured -- Sauce Labs Authentication Error.',
2727
'Process exited with error code ' + exitCodes.BrowserError.CODE];
2828
checkLogs(output, messages);
2929

spec/driverprovider_test.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
* - selenium jar and chromedriver in protractor/selenium, where
77
* webdriver-manager stores them.
88
* - if you want to test saucelabs, test with --sauceUser and --sauceKey
9-
*
9+
* - if you want to test browserstack driverProvider, test with
10+
--browserstackUser and --browserstackKey
1011
* You should verify that there are no lingering processes when these tests
1112
* complete.
1213
*/
@@ -19,6 +20,7 @@ var Direct = require('../built/driverProviders/direct').Direct;
1920
var Hosted = require('../built/driverProviders/hosted').Hosted;
2021
var Local = require('../built/driverProviders/local').Local;
2122
var Sauce = require('../built/driverProviders/sauce').Sauce;
23+
var BrowserStack = require('../built/driverProviders/browserStack').BrowserStack;
2224

2325
var testDriverProvider = function(driverProvider) {
2426
return driverProvider.setupEnv().then(function() {
@@ -124,3 +126,21 @@ if (argv.sauceUser && argv.sauceKey) {
124126
console.log('sauce.dp failed with ' + err);
125127
});
126128
}
129+
130+
if (argv.browserstackUser && argv.browserstackKey) {
131+
var browserStackConfig = {
132+
browserstackUser: argv.browserstackUser,
133+
browserstackKey: argv.browserstackKey,
134+
capabilities: {
135+
'build': 'protractor-browserstack-spec',
136+
'name': 'protractor-browserstack-spec',
137+
'browserName': 'chrome',
138+
}
139+
};
140+
testDriverProvider(new BrowserStack(browserStackConfig)).
141+
then(function() {
142+
console.log('browserstack.dp working!');
143+
}, function(err) {
144+
console.log('browserstack.dp failed with ' + err);
145+
});
146+
}

0 commit comments

Comments
 (0)