From c468b36425a7ead4a82e7be20731e9153550f636 Mon Sep 17 00:00:00 2001 From: tech-sushant Date: Wed, 15 Oct 2025 15:00:34 +0530 Subject: [PATCH 1/4] refactor: Update Python instructions --- src/tools/sdk-utils/bstack/constants.ts | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/tools/sdk-utils/bstack/constants.ts b/src/tools/sdk-utils/bstack/constants.ts index 161be95..22fc9a9 100644 --- a/src/tools/sdk-utils/bstack/constants.ts +++ b/src/tools/sdk-utils/bstack/constants.ts @@ -12,13 +12,6 @@ Install the BrowserStack SDK: \`\`\`bash python3 -m pip install browserstack-sdk \`\`\` - ----STEP--- - -Setup the BrowserStack SDK with your credentials: -\`\`\`bash -browserstack-sdk setup --username "${username}" --key "${accessKey}" -\`\`\` `; const run = ` @@ -26,7 +19,12 @@ browserstack-sdk setup --username "${username}" --key "${accessKey}" Run your tests on BrowserStack: \`\`\`bash -browserstack-sdk python +browserstack-sdk pytest -s tests/.py +\`\`\` + +Or run all tests in a directory: +\`\`\`bash +browserstack-sdk pytest \`\`\` `; @@ -43,13 +41,6 @@ Install the BrowserStack SDK: \`\`\`bash python3 -m pip install browserstack-sdk \`\`\` - ----STEP--- - -Setup the BrowserStack SDK with framework-specific configuration: -\`\`\`bash -browserstack-sdk setup --framework "${framework}" --username "${username}" --key "${accessKey}" -\`\`\` `; const run = ` @@ -655,4 +646,4 @@ export const SUPPORTED_CONFIGURATIONS: ConfigMapping = { cypress: { instructions: cypressInstructions }, }, }, -}; +}; \ No newline at end of file From aedc11b424e6444d25c64230faa34298e0b0e5f4 Mon Sep 17 00:00:00 2001 From: tech-sushant Date: Wed, 15 Oct 2025 15:03:08 +0530 Subject: [PATCH 2/4] refactor: Simplify pythonInstructions by removing unused parameters --- src/tools/automate-utils/fetch-screenshots.ts | 6 +++--- src/tools/sdk-utils/bstack/constants.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tools/automate-utils/fetch-screenshots.ts b/src/tools/automate-utils/fetch-screenshots.ts index 935ec4a..46eff51 100644 --- a/src/tools/automate-utils/fetch-screenshots.ts +++ b/src/tools/automate-utils/fetch-screenshots.ts @@ -59,9 +59,9 @@ async function convertUrlsToBase64( ): Promise> { const screenshots = await Promise.all( urls.map(async (url) => { - const response = await apiClient.get({ - url, - responseType: "arraybuffer" + const response = await apiClient.get({ + url, + responseType: "arraybuffer", }); // Axios returns response.data as a Buffer for binary data const base64 = Buffer.from(response.data).toString("base64"); diff --git a/src/tools/sdk-utils/bstack/constants.ts b/src/tools/sdk-utils/bstack/constants.ts index 22fc9a9..b801bd7 100644 --- a/src/tools/sdk-utils/bstack/constants.ts +++ b/src/tools/sdk-utils/bstack/constants.ts @@ -4,7 +4,7 @@ import { ConfigMapping } from "../common/types.js"; * ---------- PYTHON INSTRUCTIONS ---------- */ -export const pythonInstructions = (username: string, accessKey: string) => { +export const pythonInstructions = () => { const setup = ` ---STEP--- @@ -32,7 +32,7 @@ browserstack-sdk pytest }; export const generatePythonFrameworkInstructions = - (framework: string) => (username: string, accessKey: string) => { + (framework: string) => () => { const setup = ` ---STEP--- @@ -646,4 +646,4 @@ export const SUPPORTED_CONFIGURATIONS: ConfigMapping = { cypress: { instructions: cypressInstructions }, }, }, -}; \ No newline at end of file +}; From 47c707eb25651fd2a5d4200ebeb36b8e00de9669 Mon Sep 17 00:00:00 2001 From: tech-sushant Date: Wed, 15 Oct 2025 15:09:31 +0530 Subject: [PATCH 3/4] Add Python SDK setup instructions to commands --- src/tools/sdk-utils/bstack/commands.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/tools/sdk-utils/bstack/commands.ts b/src/tools/sdk-utils/bstack/commands.ts index 1f600d7..224b248 100644 --- a/src/tools/sdk-utils/bstack/commands.ts +++ b/src/tools/sdk-utils/bstack/commands.ts @@ -99,6 +99,18 @@ Alternative setup for Gradle users: ${GRADLE_SETUP_INSTRUCTIONS}`; } +function getPythonSDKInstructions( + username: string, + accessKey: string, +): string { + return `---STEP--- +Install BrowserStack Python SDK and setup: +\`\`\`bash +pip install browserstack-sdk +browserstack-sdk setup --username "${username}" --key "${accessKey}" +\`\`\``; +} + // Main function to get SDK setup commands based on language and framework export function getSDKPrefixCommand( language: SDKSupportedLanguage, @@ -112,7 +124,8 @@ export function getSDKPrefixCommand( case "java": return getJavaSDKInstructions(framework, username, accessKey); - + case "python": + return getPythonSDKInstructions(username, accessKey); default: return ""; } From d1f4a9991b60392c12993fe5ca11936091598394 Mon Sep 17 00:00:00 2001 From: tech-sushant Date: Thu, 16 Oct 2025 02:12:44 +0530 Subject: [PATCH 4/4] update browser configuration instructions --- src/lib/version-resolver.ts | 7 +++++++ src/tools/sdk-utils/bstack/commands.ts | 5 +---- src/tools/sdk-utils/bstack/configUtils.ts | 2 +- src/tools/sdk-utils/common/device-validator.ts | 8 ++++++++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/lib/version-resolver.ts b/src/lib/version-resolver.ts index 1530ae0..14ca3cb 100644 --- a/src/lib/version-resolver.ts +++ b/src/lib/version-resolver.ts @@ -27,6 +27,13 @@ export function resolveVersion(requested: string, available: string[]): string { return requested; } + const caseInsensitiveMatch = uniq.find( + (v) => v.toLowerCase() === requested.toLowerCase(), + ); + if (caseInsensitiveMatch) { + return caseInsensitiveMatch; + } + // Try major version matching (e.g., "14" matches "14.0", "14.1", etc.) const reqNum = parseFloat(requested); if (!isNaN(reqNum)) { diff --git a/src/tools/sdk-utils/bstack/commands.ts b/src/tools/sdk-utils/bstack/commands.ts index 224b248..ff71f0d 100644 --- a/src/tools/sdk-utils/bstack/commands.ts +++ b/src/tools/sdk-utils/bstack/commands.ts @@ -99,10 +99,7 @@ Alternative setup for Gradle users: ${GRADLE_SETUP_INSTRUCTIONS}`; } -function getPythonSDKInstructions( - username: string, - accessKey: string, -): string { +function getPythonSDKInstructions(username: string, accessKey: string): string { return `---STEP--- Install BrowserStack Python SDK and setup: \`\`\`bash diff --git a/src/tools/sdk-utils/bstack/configUtils.ts b/src/tools/sdk-utils/bstack/configUtils.ts index ac2b1a9..0439104 100644 --- a/src/tools/sdk-utils/bstack/configUtils.ts +++ b/src/tools/sdk-utils/bstack/configUtils.ts @@ -13,7 +13,7 @@ export function generateBrowserStackYMLInstructions(config: { const platformConfigs = generatePlatformConfigs(config); const stepTitle = - "Create a browserstack.yml file in the project root with your validated device configurations:"; + "Create a browserstack.yml file in the project root with your validated device configurations:If already exists, update it with the following content for devices and project details."; const buildName = `${projectName}-Build`; diff --git a/src/tools/sdk-utils/common/device-validator.ts b/src/tools/sdk-utils/common/device-validator.ts index fe097cc..d2047b2 100644 --- a/src/tools/sdk-utils/common/device-validator.ts +++ b/src/tools/sdk-utils/common/device-validator.ts @@ -316,6 +316,14 @@ export async function validateDevices( validatedEnvironments.push(validatedEnv); } + if (framework === SDKSupportedBrowserAutomationFrameworkEnum.playwright) { + validatedEnvironments.forEach((env) => { + if (env.browser) { + env.browser = env.browser.toLowerCase(); + } + }); + } + return validatedEnvironments; }