|
| 1 | +const base = require('@playwright/test'); |
| 2 | +const cp = require('child_process'); |
| 3 | +const clientPlaywrightVersion = cp |
| 4 | + .execSync('npx playwright --version') |
| 5 | + .toString() |
| 6 | + .trim() |
| 7 | + .split(' ')[1]; |
| 8 | +const BrowserStackLocal = require('browserstack-local'); |
| 9 | + |
| 10 | +const caps = { |
| 11 | + browser: 'chrome', |
| 12 | + os: 'osx', |
| 13 | + os_version: 'catalina', |
| 14 | + name: 'My first playwright test', |
| 15 | + build: 'playwright-build-1', |
| 16 | + 'browserstack.username': process.env.BROWSERSTACK_USERNAME || 'YOUR_USERNAME', |
| 17 | + 'browserstack.accessKey': |
| 18 | + process.env.BROWSERSTACK_ACCESS_KEY || 'YOUR_ACCESS_KEY', |
| 19 | + 'client.playwrightVersion': clientPlaywrightVersion, |
| 20 | +}; |
| 21 | + |
| 22 | +exports.bsLocal = new BrowserStackLocal.Local(); |
| 23 | + |
| 24 | +// replace YOUR_ACCESS_KEY with your key. You can also set an environment variable - "BROWSERSTACK_ACCESS_KEY". |
| 25 | +exports.BS_LOCAL_ARGS = { |
| 26 | + key: process.env.BROWSERSTACK_ACCESS_KEY || 'YOUR_ACCESS_KEY', |
| 27 | +}; |
| 28 | + |
| 29 | +const patchCaps = (name) => { |
| 30 | + let combination = name.split(/@browserstack/)[0]; |
| 31 | + let [browerCaps, osCaps] = combination.split(/:/); |
| 32 | + let [browser, browser_version] = browerCaps.split(/@/); |
| 33 | + let osCapsSplit = osCaps.split(/ /); |
| 34 | + let os = osCapsSplit.shift(); |
| 35 | + let os_version = osCapsSplit.join(' '); |
| 36 | + caps.browser = browser ? browser : 'chrome'; |
| 37 | + caps.browser_version = browser_version ? browser_version : 'latest'; |
| 38 | + caps.os = os ? os : 'osx'; |
| 39 | + caps.os_version = os_version ? os_version : 'catalina'; |
| 40 | + caps.name = name; |
| 41 | +}; |
| 42 | + |
| 43 | +exports.test = base.test.extend({ |
| 44 | + browser: async ({ playwright, browser }, use, workerInfo) => { |
| 45 | + if (workerInfo.project.name.match(/browserstack/)) { |
| 46 | + patchCaps(workerInfo.project.name); |
| 47 | + const vBrowser = await playwright.chromium.connect({ |
| 48 | + wsEndpoint: |
| 49 | + `wss://cdp.browserstack.com/playwright?caps=` + |
| 50 | + `${encodeURIComponent(JSON.stringify(caps))}`, |
| 51 | + }); |
| 52 | + await use(vBrowser); |
| 53 | + } else { |
| 54 | + await use(browser); |
| 55 | + } |
| 56 | + }, |
| 57 | + page: async ({ page, browser }, use, testInfo) => { |
| 58 | + if (testInfo.project.name.match(/browserstack/)) { |
| 59 | + const vPage = await browser.newPage(); |
| 60 | + await use(vPage); |
| 61 | + const testResult = { |
| 62 | + action: 'setSessionStatus', |
| 63 | + arguments: { |
| 64 | + status: testInfo.status, |
| 65 | + reason: testInfo?.error?.message, |
| 66 | + }, |
| 67 | + }; |
| 68 | + await vPage.evaluate(() => {}, |
| 69 | + `browserstack_executor: ${JSON.stringify(testResult)}`); |
| 70 | + } else { |
| 71 | + use(page); |
| 72 | + } |
| 73 | + }, |
| 74 | +}); |
0 commit comments