diff --git a/lerna.json b/lerna.json index f5dab0dfec2..bb4849bc88d 100644 --- a/lerna.json +++ b/lerna.json @@ -3,7 +3,7 @@ "packages": [ "packages/*" ], - "version": "8.47.0", + "version": "8.47.1", "command": { "bootstrap": { "npmClientArgs": [ diff --git a/package-lock.json b/package-lock.json index 7480b56051b..83e4c395ec2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31597,7 +31597,7 @@ }, "packages/wdio-browserstack-service": { "name": "@wdio/browserstack-service", - "version": "8.47.0", + "version": "8.47.1", "license": "MIT", "dependencies": { "@browserstack/ai-sdk-node": "1.5.17", diff --git a/packages/wdio-browserstack-service/package.json b/packages/wdio-browserstack-service/package.json index 7fe272edc7b..368b6b3b3d3 100644 --- a/packages/wdio-browserstack-service/package.json +++ b/packages/wdio-browserstack-service/package.json @@ -1,6 +1,6 @@ { "name": "@wdio/browserstack-service", - "version": "8.47.0", + "version": "8.47.1", "description": "WebdriverIO service for better Browserstack integration", "author": "Adam Bjerstedt ", "homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-browserstack-service", diff --git a/packages/wdio-browserstack-service/src/cli/cliUtils.ts b/packages/wdio-browserstack-service/src/cli/cliUtils.ts index 16c34ae7a94..ee6bf2e2c88 100644 --- a/packages/wdio-browserstack-service/src/cli/cliUtils.ts +++ b/packages/wdio-browserstack-service/src/cli/cliUtils.ts @@ -174,7 +174,8 @@ export class CLIUtils { sdk_language: this.getSdkLanguage(), } if (!isNullOrEmpty(existingCliPath)) { - queryParams.cli_version = await this.runShellCommand(`${existingCliPath} version`) + const nullDevice = platform() === 'win32' ? 'NUL' : '/dev/null' + queryParams.cli_version = await this.runShellCommand(`${existingCliPath} version 2>${nullDevice}`) } const response = await this.requestToUpdateCLI(queryParams, config) if (nestedKeyValue(response, ['updated_cli_version'])) { diff --git a/packages/wdio-browserstack-service/src/cli/modules/accessibilityModule.ts b/packages/wdio-browserstack-service/src/cli/modules/accessibilityModule.ts index 754aed7c7db..bbe5f5a42e8 100644 --- a/packages/wdio-browserstack-service/src/cli/modules/accessibilityModule.ts +++ b/packages/wdio-browserstack-service/src/cli/modules/accessibilityModule.ts @@ -31,6 +31,8 @@ export default class AccessibilityModule extends BaseModule { static MODULE_NAME = 'AccessibilityModule' accessibilityMap: Map LOG_DISABLED_SHOWN: Map + centralAuthA11yConfig: Record = {} + centralAuthConfigFetched: boolean = false constructor(accessibilityConfig: Accessibility, isNonBstackA11y: boolean) { super() @@ -245,7 +247,7 @@ export default class AccessibilityModule extends BaseModule { 'thBuildUuid': process.env.BROWSERSTACK_TESTHUB_UUID, 'thJwtToken': process.env.BROWSERSTACK_TESTHUB_JWT } - const driverExecuteParams = await this.getDriverExecuteParams() + const driverExecuteParams = await this.getDriverExecuteParams('saveResults') dataForExtension = { ...dataForExtension, ...driverExecuteParams } // final scan and saving the results @@ -307,13 +309,26 @@ export default class AccessibilityModule extends BaseModule { PERFORMANCE_SDK_EVENTS.A11Y_EVENTS.PERFORM_SCAN, async () => { try { + // Fetch central auth accessibility configuration + const centralAuthConfig = await this.fetchCentralAuthA11yConfig('scan') if (!this.accessibility) { this.logger.debug('Not an Accessibility Automation session.') return } if (this.isAppAccessibility) { + // Get app accessibility params and merge with central auth config + const appAccessibilityParams = _getParamsForAppAccessibility(commandName) + + // Merge with central auth config + const mergedParams: Record = { ...appAccessibilityParams, ...centralAuthConfig } + + // Use centralAuthToken if available + if (centralAuthConfig.centralAuthToken) { + // Set the auth header with the token value + mergedParams.centralAuthHeader = centralAuthConfig.centralAuthToken + } const results: unknown = await (browser as WebdriverIO.Browser).execute( - formatString(this.scriptInstance.performScan, JSON.stringify(_getParamsForAppAccessibility(commandName))) as string, + formatString(this.scriptInstance.performScan, JSON.stringify(mergedParams)) as string, {} ) BStackLogger.debug(util.format(results as string)) @@ -399,10 +414,10 @@ export default class AccessibilityModule extends BaseModule { )() } - async getDriverExecuteParams() { + async getDriverExecuteParams(scriptName: string) { const payload: Omit = { product: 'accessibility', - scriptName: 'saveResults' + scriptName: scriptName } const response: FetchDriverExecuteParamsEventResponse = await GrpcClient.getInstance().fetchDriverExecuteParamsEvent(payload) if (response.success) { @@ -412,4 +427,25 @@ export default class AccessibilityModule extends BaseModule { return {} } + /** + * Fetch central auth accessibility configuration for the given script name. + * Returns cached config if already fetched, otherwise loads and caches it. + * + * @param scriptName - Name of the script to fetch config for + * @returns Configuration object, empty object if error occurs + */ + async fetchCentralAuthA11yConfig(scriptName: string): Promise> { + try { + if (this.centralAuthConfigFetched) { + return this.centralAuthA11yConfig + } + this.centralAuthA11yConfig = await this.getDriverExecuteParams(scriptName) + this.centralAuthConfigFetched = true + return this.centralAuthA11yConfig + } catch (error) { + this.logger.error(`fetchCentralAuthA11yConfig: Failed to fetch driver execute params for ${scriptName}: ${util.format(error)}`) + return {} + } + } + }