integration/js/utils/WebdriverBrowserStack.js (152 lines of code) (raw):

const {Builder} = require('selenium-webdriver'); const {getBuildId, getRunDetails} = require('./BrowserStackLogs'); const {AppPage} = require('../pages/AppPage'); const {MeetingReadinessCheckerPage} = require('../pages/MeetingReadinessCheckerPage'); const { MessagingSessionPage } = require('../pages/MessagingSessionPage'); const { TestAppPage } = require('../pages'); const getOS = capabilities => { switch (capabilities.platform) { case 'MAC': return 'OS X'; case 'WINDOWS': return 'windows'; default: return ''; } }; const getOSVersion = capabilities => { switch (capabilities.platform) { case 'MAC': return 'Mojave'; case 'WINDOWS': return '10'; default: return ''; } }; const getFirefoxCapabilities = capabilities => { return { ...getBrowserStackOptions(capabilities), os: getOS(capabilities), os_version: getOSVersion(capabilities), browserName: 'Firefox', browser_version: capabilities.version, resolution: '1920x1080', 'browserstack.selenium_version': '3.10.0', 'moz:firefoxOptions': { prefs: { 'media.navigator.streams.fake': true, 'media.navigator.permission.disabled': true, }, }, }; }; const getChromeCapabilities = capabilities => { return { ...getBrowserStackOptions(capabilities), os: getOS(capabilities), os_version: getOSVersion(capabilities), browserName: 'Chrome', browser_version: capabilities.version, resolution: '1920x1080', 'browserstack.selenium_version': '3.5.2', chromeOptions: { args: ['--use-fake-ui-for-media-stream', '--use-fake-device-for-media-stream'], }, }; }; const getBrowserStackOptions = (capabilities) => { return { 'browserstack.local': process.env.BROWSERSTACK_LOCAL_ENABLED, 'browserstack.localIdentifier': process.env.BROWSERSTACK_LOCAL_IDENTIFIER, 'browserstack.debug': 'true', 'browserstack.networkLogs': capabilities.browserName === 'firefox', 'browserstack.console': 'verbose' }; }; const getBrowserStackUrl = () => { return ( 'https://' + process.env.BROWSER_STACK_USERNAME + ':' + process.env.BROWSER_STACK_ACCESSKEY + '@hub-cloud.browserstack.com/wd/hub' ); }; class BrowserStackSession { static async createSession(capabilities, appName) { let cap = {}; if (capabilities.browserName === 'chrome') { cap = getChromeCapabilities(capabilities); } else { cap = getFirefoxCapabilities(capabilities); } const driver = await new Builder() .usingServer(getBrowserStackUrl()) .withCapabilities(cap) .build(); return new BrowserStackSession(driver, appName); } constructor(inDriver, appName) { this.driver = inDriver; this.appName = appName; } async init() { await this.getSessionId(); this.name = ""; this.logger = (message) => { const prefix = this.name === "" ? "" : `[${this.name} App] `; console.log(`${prefix}${message}`) }; this.getAppPage(); } async getSessionId() { if (this.sessionId === undefined) { const session = await this.driver.getSession(); this.sessionId = session.getId(); } return this.sessionId } setSessionName(inName) { this.name = inName; } getAppPage() { if (this.page === undefined) { switch (this.appName) { case 'meetingReadinessChecker': this.page = new MeetingReadinessCheckerPage(this.driver, this.logger); break; case 'messagingSession': this.page = new MessagingSessionPage(this.driver, this.logger); break; case 'testApp': this.page = new TestAppPage(this.driver, this.logger); break; default: this.page = new AppPage(this.driver, this.logger); break; } } } async updateTestResults(passed) { // todo: we are not using browserstack currently so this is not implemented }; async printRunDetails() { const sessionId = await this.getSessionId(); const buildId = await getBuildId(); console.log(JSON.stringify({ build_details: { buildId, sessionId } })); const run_details = await getRunDetails(sessionId); console.log("Browserstack run details :"); console.log(JSON.stringify(run_details)) } async quit() { await this.driver.quit(); } } module.exports.BrowserStackSession = BrowserStackSession; module.exports.getOS = getOS; module.exports.getOSVersion = getOSVersion;