From 92cb31f6482c6e6ef5b2c784c6a2a4790e34d6ed Mon Sep 17 00:00:00 2001 From: amaanbs Date: Fri, 2 Aug 2024 06:28:35 +0530 Subject: [PATCH 1/6] changes for O11y<>ATS linking --- .../wdio-browserstack-service/src/insights-handler.ts | 8 ++++---- packages/wdio-browserstack-service/src/reporter.ts | 1 + packages/wdio-browserstack-service/src/service.ts | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/wdio-browserstack-service/src/insights-handler.ts b/packages/wdio-browserstack-service/src/insights-handler.ts index 8cce02687fb..c1cabeed9b0 100644 --- a/packages/wdio-browserstack-service/src/insights-handler.ts +++ b/packages/wdio-browserstack-service/src/insights-handler.ts @@ -63,7 +63,7 @@ class _InsightsHandler { platformName: caps?.platformName, caps: caps, sessionId, - product: isAppAutomate ? 'app-automate' : 'automate' + product: process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT } this._userCaps = _userCaps @@ -350,7 +350,7 @@ class _InsightsHandler { testData.integrations = {} if (this._browser && this._platformMeta) { const provider = getCloudProvider(this._browser) - testData.integrations[provider] = this.getIntegrationsObject() + testData.integrations[provider] = this.getIntegrationsObject() // } } @@ -665,7 +665,7 @@ class _InsightsHandler { testData.integrations = {} if (this._browser && this._platformMeta) { const provider = getCloudProvider(this._browser) - testData.integrations[provider] = this.getIntegrationsObject() + testData.integrations[provider] = this.getIntegrationsObject() // } } @@ -766,7 +766,7 @@ class _InsightsHandler { testData.integrations = {} if (this._browser && this._platformMeta) { const provider = getCloudProvider(this._browser) - testData.integrations[provider] = this.getIntegrationsObject() + testData.integrations[provider] = this.getIntegrationsObject() // } } diff --git a/packages/wdio-browserstack-service/src/reporter.ts b/packages/wdio-browserstack-service/src/reporter.ts index 29ad67c3b67..84036bbfe11 100644 --- a/packages/wdio-browserstack-service/src/reporter.ts +++ b/packages/wdio-browserstack-service/src/reporter.ts @@ -263,6 +263,7 @@ class _TestReporter extends WDIOReporter { browser: this._capabilities?.browserName, browser_version: this._capabilities?.browserVersion, platform: this._capabilities?.platformName, + product: process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT, platform_version: getPlatformVersion(this._userCaps as WebdriverIO.Capabilities) } } diff --git a/packages/wdio-browserstack-service/src/service.ts b/packages/wdio-browserstack-service/src/service.ts index e985807a6ab..e90c8fc0eaa 100644 --- a/packages/wdio-browserstack-service/src/service.ts +++ b/packages/wdio-browserstack-service/src/service.ts @@ -144,6 +144,7 @@ export default class BrowserstackService implements Services.ServiceInstance { this._config.framework, this._caps ) + process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT = this._isAppAutomate() ? 'app-automate' : (process.env.BROWSERSTACK_TURBOSCALE === 'true' ? 'turboscale' : 'automate') await this._insightsHandler.before() } From 988d7999f06dbca56a1f816187583632266e8204 Mon Sep 17 00:00:00 2001 From: amaanbs Date: Tue, 13 Aug 2024 22:11:41 +0530 Subject: [PATCH 2/6] fixes --- packages/wdio-browserstack-service/src/service.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/wdio-browserstack-service/src/service.ts b/packages/wdio-browserstack-service/src/service.ts index e90c8fc0eaa..4f3750c18e9 100644 --- a/packages/wdio-browserstack-service/src/service.ts +++ b/packages/wdio-browserstack-service/src/service.ts @@ -67,6 +67,7 @@ export default class BrowserstackService implements Services.ServiceInstance { if (process.env.BROWSERSTACK_TURBOSCALE) { this._turboScale = process.env.BROWSERSTACK_TURBOSCALE === 'true' } + process.env.BROWSERSTACK_TURBOSCALE = this._turboScale + '' // Cucumber specific const strict = Boolean(this._config.cucumberOpts && this._config.cucumberOpts.strict) @@ -138,13 +139,14 @@ export default class BrowserstackService implements Services.ServiceInstance { if (this._observability) { patchConsoleLogs() + process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT = this._isAppAutomate() ? 'app-automate' : (process.env.BROWSERSTACK_TURBOSCALE === 'true' ? 'turboscale' : 'automate') + this._insightsHandler = new InsightsHandler( this._browser, this._isAppAutomate(), this._config.framework, this._caps ) - process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT = this._isAppAutomate() ? 'app-automate' : (process.env.BROWSERSTACK_TURBOSCALE === 'true' ? 'turboscale' : 'automate') await this._insightsHandler.before() } From 65a87ae64a194b8f287242a27e6b5aef286e6cb5 Mon Sep 17 00:00:00 2001 From: amaanbs Date: Wed, 14 Aug 2024 07:45:29 +0530 Subject: [PATCH 3/6] fixes --- packages/wdio-browserstack-service/src/insights-handler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/wdio-browserstack-service/src/insights-handler.ts b/packages/wdio-browserstack-service/src/insights-handler.ts index c1cabeed9b0..cf1962620e4 100644 --- a/packages/wdio-browserstack-service/src/insights-handler.ts +++ b/packages/wdio-browserstack-service/src/insights-handler.ts @@ -350,7 +350,7 @@ class _InsightsHandler { testData.integrations = {} if (this._browser && this._platformMeta) { const provider = getCloudProvider(this._browser) - testData.integrations[provider] = this.getIntegrationsObject() // + testData.integrations[provider] = this.getIntegrationsObject() } } @@ -665,7 +665,7 @@ class _InsightsHandler { testData.integrations = {} if (this._browser && this._platformMeta) { const provider = getCloudProvider(this._browser) - testData.integrations[provider] = this.getIntegrationsObject() // + testData.integrations[provider] = this.getIntegrationsObject() } } @@ -766,7 +766,7 @@ class _InsightsHandler { testData.integrations = {} if (this._browser && this._platformMeta) { const provider = getCloudProvider(this._browser) - testData.integrations[provider] = this.getIntegrationsObject() // + testData.integrations[provider] = this.getIntegrationsObject() } } From f965877b690f80762bf0cc063018a451cd4d3d5c Mon Sep 17 00:00:00 2001 From: amaanbs Date: Thu, 22 Aug 2024 04:18:31 +0530 Subject: [PATCH 4/6] Unit test fixes --- packages/wdio-browserstack-service/src/service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/wdio-browserstack-service/src/service.ts b/packages/wdio-browserstack-service/src/service.ts index 4f3750c18e9..a3c89248e81 100644 --- a/packages/wdio-browserstack-service/src/service.ts +++ b/packages/wdio-browserstack-service/src/service.ts @@ -67,7 +67,7 @@ export default class BrowserstackService implements Services.ServiceInstance { if (process.env.BROWSERSTACK_TURBOSCALE) { this._turboScale = process.env.BROWSERSTACK_TURBOSCALE === 'true' } - process.env.BROWSERSTACK_TURBOSCALE = this._turboScale + '' + process.env.BROWSERSTACK_TURBOSCALE_INTERNAL = this._turboScale + '' // Cucumber specific const strict = Boolean(this._config.cucumberOpts && this._config.cucumberOpts.strict) @@ -139,7 +139,7 @@ export default class BrowserstackService implements Services.ServiceInstance { if (this._observability) { patchConsoleLogs() - process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT = this._isAppAutomate() ? 'app-automate' : (process.env.BROWSERSTACK_TURBOSCALE === 'true' ? 'turboscale' : 'automate') + process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT = this._isAppAutomate() ? 'app-automate' : (process.env.BROWSERSTACK_TURBOSCALE_INTERNAL === 'true' ? 'turboscale' : 'automate') this._insightsHandler = new InsightsHandler( this._browser, From 4026e374600584feabaea074ce8674d367393e64 Mon Sep 17 00:00:00 2001 From: amaanbs Date: Mon, 9 Sep 2024 21:15:49 +0530 Subject: [PATCH 5/6] PR review fixes --- .../src/insights-handler.ts | 19 ++++++-- .../wdio-browserstack-service/src/service.ts | 8 ++-- .../wdio-browserstack-service/src/util.ts | 10 ++++ .../tests/insights-handler.test.ts | 48 +++++++++---------- 4 files changed, 51 insertions(+), 34 deletions(-) diff --git a/packages/wdio-browserstack-service/src/insights-handler.ts b/packages/wdio-browserstack-service/src/insights-handler.ts index cf1962620e4..0821c9a4679 100644 --- a/packages/wdio-browserstack-service/src/insights-handler.ts +++ b/packages/wdio-browserstack-service/src/insights-handler.ts @@ -1,12 +1,14 @@ import path from 'node:path' -import type { Frameworks } from '@wdio/types' +import type { Frameworks, Options } from '@wdio/types' import type { BeforeCommandArgs, AfterCommandArgs } from '@wdio/reporter' import { v4 as uuidv4 } from 'uuid' import type { CucumberStore, Feature, Scenario, Step, FeatureChild, CucumberHook, CucumberHookParams, Pickle, ITestCaseHookParameter } from './cucumber-types.js' import TestReporter from './reporter.js' +import type { BrowserstackConfig } from './types.js' + import { frameworkSupportsHook, getCloudProvider, getFailureObject, @@ -20,6 +22,7 @@ import { isUndefined, o11yClassErrorHandler, removeAnsiColors, + getObservabilityProduct } from './util.js' import type { TestData, @@ -53,24 +56,30 @@ class _InsightsHandler { private _currentTestId: string | undefined private _cbtQueue: Array = [] - constructor (private _browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser, isAppAutomate?: boolean, private _framework?: string, _userCaps?: Capabilities.RemoteCapability) { + constructor (private _browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser, private _framework?: string, _userCaps?: Capabilities.RemoteCapability, _options?: BrowserstackConfig & Options.Testrunner) { const caps = (this._browser as WebdriverIO.Browser).capabilities as WebdriverIO.Capabilities const sessionId = (this._browser as WebdriverIO.Browser).sessionId + this._userCaps = _userCaps + this._platformMeta = { browserName: caps.browserName, browserVersion: caps?.browserVersion, platformName: caps?.platformName, caps: caps, sessionId, - product: process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT + product: getObservabilityProduct(_options, this._isAppAutomate()) } - this._userCaps = _userCaps - this.registerListeners() } + _isAppAutomate(): boolean { + const browserDesiredCapabilities = (this._browser?.capabilities ?? {}) as Capabilities.DesiredCapabilities + const desiredCapabilities = (this._userCaps ?? {}) as Capabilities.DesiredCapabilities + return !!browserDesiredCapabilities['appium:app'] || !!desiredCapabilities['appium:app'] || !!(( desiredCapabilities as any)['appium:options']?.app) + } + registerListeners() { if (!(this._framework === 'mocha' || this._framework === 'cucumber')) { return diff --git a/packages/wdio-browserstack-service/src/service.ts b/packages/wdio-browserstack-service/src/service.ts index a3c89248e81..344d98b1e56 100644 --- a/packages/wdio-browserstack-service/src/service.ts +++ b/packages/wdio-browserstack-service/src/service.ts @@ -67,7 +67,7 @@ export default class BrowserstackService implements Services.ServiceInstance { if (process.env.BROWSERSTACK_TURBOSCALE) { this._turboScale = process.env.BROWSERSTACK_TURBOSCALE === 'true' } - process.env.BROWSERSTACK_TURBOSCALE_INTERNAL = this._turboScale + '' + process.env.BROWSERSTACK_TURBOSCALE_INTERNAL = String(this._turboScale) // Cucumber specific const strict = Boolean(this._config.cucumberOpts && this._config.cucumberOpts.strict) @@ -139,13 +139,11 @@ export default class BrowserstackService implements Services.ServiceInstance { if (this._observability) { patchConsoleLogs() - process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT = this._isAppAutomate() ? 'app-automate' : (process.env.BROWSERSTACK_TURBOSCALE_INTERNAL === 'true' ? 'turboscale' : 'automate') - this._insightsHandler = new InsightsHandler( this._browser, - this._isAppAutomate(), this._config.framework, - this._caps + this._caps, + this._options ) await this._insightsHandler.before() } diff --git a/packages/wdio-browserstack-service/src/util.ts b/packages/wdio-browserstack-service/src/util.ts index 31e0c54dc03..22be67ce632 100644 --- a/packages/wdio-browserstack-service/src/util.ts +++ b/packages/wdio-browserstack-service/src/util.ts @@ -1339,3 +1339,13 @@ export const getErrorString = (err: unknown) => { return err.message // works, `e` narrowed to Error } } + +export function isTurboScale(options: (BrowserstackConfig & Options.Testrunner) | undefined): boolean { + return Boolean(options?.turboScale) +} + +export function getObservabilityProduct(options: (BrowserstackConfig & Options.Testrunner) | undefined, isAppAutomate: boolean | undefined): string { + return isAppAutomate + ? 'app-automate' + : (isTurboScale(options) ? 'turboscale' : 'automate') +} diff --git a/packages/wdio-browserstack-service/tests/insights-handler.test.ts b/packages/wdio-browserstack-service/tests/insights-handler.test.ts index 5c38be99e45..a3613182170 100644 --- a/packages/wdio-browserstack-service/tests/insights-handler.test.ts +++ b/packages/wdio-browserstack-service/tests/insights-handler.test.ts @@ -62,11 +62,11 @@ beforeEach(() => { execute: vi.fn(), on: vi.fn(), } as any as WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') }) it('should initialize correctly', () => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') expect(insightsHandler['_tests']).toEqual({}) expect(insightsHandler['_hooks']).toEqual({}) expect(insightsHandler['_commands']).toEqual({}) @@ -77,7 +77,7 @@ describe('before', () => { const isBrowserstackSessionSpy = vi.spyOn(utils, 'isBrowserstackSession') beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') isBrowserstackSessionSpy.mockClear() }) @@ -97,7 +97,7 @@ describe('beforeScenario', () => { let insightsHandler: InsightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') vi.spyOn(utils, 'getUniqueIdentifierForCucumber').mockReturnValue('test title') insightsHandler['getTestRunDataForCucumber'] = vi.fn() insightsHandler['_tests'] = {} @@ -125,7 +125,7 @@ describe('afterScenario', () => { let insightsHandler: InsightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') insightsHandler['getTestRunDataForCucumber'] = vi.fn() insightsHandler['_tests'] = {} }) @@ -152,7 +152,7 @@ describe('beforeStep', () => { let insightsHandler: InsightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') vi.spyOn(utils, 'getUniqueIdentifierForCucumber').mockReturnValue('test title') insightsHandler['getHierarchy'] = vi.fn().mockImplementation(() => { return [] }) }) @@ -205,7 +205,7 @@ describe('afterStep', () => { let insightsHandler: InsightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') vi.spyOn(utils, 'getUniqueIdentifierForCucumber').mockReturnValue('test title') insightsHandler['getHierarchy'] = vi.fn().mockImplementation(() => { return [] }) }) @@ -328,7 +328,7 @@ describe('attachHookData', () => { let insightsHandler: InsightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') }) it('add hooks data in test', () => { @@ -377,7 +377,7 @@ describe('attachHookData', () => { describe('setHooksFromSuite', () => { let insightsHandler: InsightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') insightsHandler['_hooks'] = {} }) @@ -405,7 +405,7 @@ describe('getHierarchy', () => { let insightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') }) it('return array of getHierarchy when context present', () => { @@ -431,7 +431,7 @@ describe('getHierarchy', () => { describe('getTestRunId', function () { let insightsHandler: InsightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') }) it('should return if null context', () => { @@ -468,7 +468,7 @@ describe('getTestRunId', function () { describe('getTestRunIdFromSuite', function () { let insightsHandler: InsightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') }) it('should return null if parent null', function () { @@ -494,7 +494,7 @@ describe('beforeTest', () => { describe('mocha', () => { beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'mocha') + insightsHandler = new InsightsHandler(browser, 'mocha') insightsHandler['getRunData'] = vi.fn().mockImplementation(() => { return [] }) vi.spyOn(utils, 'getUniqueIdentifier').mockReturnValue('test title') insightsHandler['_tests'] = {} @@ -512,7 +512,7 @@ describe('beforeTest', () => { describe('jasmine', () => { beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'jasmine') + insightsHandler = new InsightsHandler(browser, 'jasmine') insightsHandler['getRunData'] = vi.fn().mockImplementation(() => { return [] }) insightsHandler['_tests'] = {} }) @@ -530,7 +530,7 @@ describe('beforeHook', () => { describe('mocha', () => { beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'mocha') + insightsHandler = new InsightsHandler(browser, 'mocha') insightsHandler['getRunData'] = vi.fn().mockImplementation(() => { return [] }) insightsHandler['attachHookData'] = vi.fn().mockImplementation(() => { return [] }) insightsHandler['_tests'] = {} @@ -552,7 +552,7 @@ describe('beforeHook', () => { describe('cucumber', () => { beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'cucumber') + insightsHandler = new InsightsHandler(browser, 'cucumber') insightsHandler['processCucumberHook'] = vi.fn().mockImplementation(() => { return [] }) insightsHandler['_framework'] = 'cucumber' }) @@ -569,7 +569,7 @@ describe('afterHook', () => { describe('mocha', () => { beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'mocha') + insightsHandler = new InsightsHandler(browser, 'mocha') insightsHandler['getRunData'] = vi.fn().mockImplementation(() => { return [] }) insightsHandler['attachHookData'] = vi.fn().mockImplementation(() => { return [] }) @@ -596,7 +596,7 @@ describe('afterHook', () => { describe('cucumber', () => { beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'cucumber') + insightsHandler = new InsightsHandler(browser, 'cucumber') insightsHandler['processCucumberHook'] = vi.fn().mockImplementation(() => { return [] }) }) @@ -616,7 +616,7 @@ describe('getIntegrationsObject', () => { }) beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') insightsHandler['_platformMeta'] = { caps: {}, sessionId: '', browserName: '', browserVersion: '', platformName: '', product: '' } }) @@ -649,7 +649,7 @@ describe('browserCommand', () => { let commandSpy beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') insightsHandler['getIdentifier'] = vi.fn().mockImplementation(() => { return 'test title' }) insightsHandler['_tests'] = { 'test title': { 'uuid': 'uuid' } } insightsHandler['_commands'] = { 's_m_e': {} as any } @@ -695,7 +695,7 @@ describe('getIdentifier', () => { let getUniqueIdentifierForCucumberSpy beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') insightsHandler['_tests'] = { 'test title': { 'uuid': 'uuid' } } getUniqueIdentifierSpy = vi.spyOn(utils, 'getUniqueIdentifier') @@ -751,7 +751,7 @@ describe('getCucumberHookType', function () { describe('getCucumberHookUniqueId', function () { let insightsHandler: InsightsHandler beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'framework') + insightsHandler = new InsightsHandler(browser, 'framework') }) it('should return hookId for each hooks', function () { @@ -780,7 +780,7 @@ describe('appendTestItemLog', function () { } let testLogObj: StdLog beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'mocha') + insightsHandler = new InsightsHandler(browser, 'mocha') sendDataSpy = vi.spyOn(insightsHandler['listener'], 'logCreated').mockImplementation(() => { return [] as any }) testLogObj = { ...logObj } }) @@ -812,7 +812,7 @@ describe('processCucumberHook', function () { let insightsHandler: InsightsHandler let getHookRunDataForCucumberSpy, cucumberHookTypeSpy, cucumberHookUniqueIdSpy beforeEach(() => { - insightsHandler = new InsightsHandler(browser, false, 'mocha') + insightsHandler = new InsightsHandler(browser, 'mocha') getHookRunDataForCucumberSpy = vi.spyOn(insightsHandler, 'getHookRunDataForCucumber').mockImplementation(() => { return [] as any }) cucumberHookTypeSpy = vi.spyOn(insightsHandler, 'getCucumberHookType') cucumberHookTypeSpy.mockImplementation(() => { return 'hii' }) From 0c7b792b798b0e6a2ccb93d2261266316f5a1a36 Mon Sep 17 00:00:00 2001 From: amaanbs Date: Mon, 9 Sep 2024 21:20:25 +0530 Subject: [PATCH 6/6] minor fixes --- packages/wdio-browserstack-service/src/reporter.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/wdio-browserstack-service/src/reporter.ts b/packages/wdio-browserstack-service/src/reporter.ts index 84036bbfe11..29ad67c3b67 100644 --- a/packages/wdio-browserstack-service/src/reporter.ts +++ b/packages/wdio-browserstack-service/src/reporter.ts @@ -263,7 +263,6 @@ class _TestReporter extends WDIOReporter { browser: this._capabilities?.browserName, browser_version: this._capabilities?.browserVersion, platform: this._capabilities?.platformName, - product: process.env.BROWSERSTACK_OBSERVABILITY_PRODUCT, platform_version: getPlatformVersion(this._userCaps as WebdriverIO.Capabilities) } }