diff --git a/.obs_test_details-vyrldntqoixceupb6hap1twclaeqecnhgso82mfr/chrome@Samsung Galaxy S23 Ultra b/.obs_test_details-vyrldntqoixceupb6hap1twclaeqecnhgso82mfr/chrome@Samsung Galaxy S23 Ultra new file mode 100644 index 0000000..e69de29 diff --git a/.obs_test_details-vyrldntqoixceupb6hap1twclaeqecnhgso82mfr/chrome@latest b/.obs_test_details-vyrldntqoixceupb6hap1twclaeqecnhgso82mfr/chrome@latest new file mode 100644 index 0000000..e69de29 diff --git a/.obs_test_details-vyrldntqoixceupb6hap1twclaeqecnhgso82mfr/playwright-webkit@latest b/.obs_test_details-vyrldntqoixceupb6hap1twclaeqecnhgso82mfr/playwright-webkit@latest new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md deleted file mode 100644 index 58af624..0000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# node-js-playwright-browserstack -This repo contains samples for running [Playwright](https://playwright.dev/docs/intro) tests on BrowserStack using the browserstack-node-sdk. - -![BrowserStack Logo](https://d98b8t1nnulk5.cloudfront.net/production/images/layout/logo-header.png?1469004780) - -## Setup - -* Clone the repo `git clone -b sdk https://github.com/browserstack/node-js-playwright-browserstack.git` and run `cd node-js-playwright-browserstack`. -* Set `BROWSERSTACK_USERNAME` and `BROWSERSTACK_ACCESS_KEY` as environment variables with your [BrowserStack Username and Access Key](https://www.browserstack.com/accounts/settings) or update the same in `browserstack.yml` file. -* Run `npm i` to install the dependencies. - -## Running your tests - -- To run the sample tests in parallel across the platforms specified in the `browserstack.yml`, run `npm run sample-test`. -- To run the sample local tests in parallel across the platforms specified in the `browserstack.yml`, run `npm run sample-local-test`. - -## Notes -* You can view your test results on the [BrowserStack Automate dashboard](https://www.browserstack.com/automate) -* Understand how many parallel sessions you need by using our [Parallel Test Calculator](https://www.browserstack.com/automate/parallel-calculator?ref=github) diff --git a/Screenshots/Chrome on Windows/chromium/form-filled.png b/Screenshots/Chrome on Windows/chromium/form-filled.png new file mode 100644 index 0000000..f2fa9d6 Binary files /dev/null and b/Screenshots/Chrome on Windows/chromium/form-filled.png differ diff --git a/Screenshots/Chrome on Windows/chromium/home.png b/Screenshots/Chrome on Windows/chromium/home.png new file mode 100644 index 0000000..799ed22 Binary files /dev/null and b/Screenshots/Chrome on Windows/chromium/home.png differ diff --git a/Screenshots/Chrome on Windows/chromium/response.png b/Screenshots/Chrome on Windows/chromium/response.png new file mode 100644 index 0000000..5d29b06 Binary files /dev/null and b/Screenshots/Chrome on Windows/chromium/response.png differ diff --git a/Screenshots/Edge on Windows/chromium/form-filled.png b/Screenshots/Edge on Windows/chromium/form-filled.png new file mode 100644 index 0000000..4d9a53d Binary files /dev/null and b/Screenshots/Edge on Windows/chromium/form-filled.png differ diff --git a/Screenshots/Edge on Windows/chromium/home.png b/Screenshots/Edge on Windows/chromium/home.png new file mode 100644 index 0000000..5cdbdbf Binary files /dev/null and b/Screenshots/Edge on Windows/chromium/home.png differ diff --git a/Screenshots/Edge on Windows/chromium/response.png b/Screenshots/Edge on Windows/chromium/response.png new file mode 100644 index 0000000..5d29b06 Binary files /dev/null and b/Screenshots/Edge on Windows/chromium/response.png differ diff --git a/Screenshots/Firefox on Windows/firefox/form-filled.png b/Screenshots/Firefox on Windows/firefox/form-filled.png new file mode 100644 index 0000000..ef2c1e3 Binary files /dev/null and b/Screenshots/Firefox on Windows/firefox/form-filled.png differ diff --git a/Screenshots/Firefox on Windows/firefox/home.png b/Screenshots/Firefox on Windows/firefox/home.png new file mode 100644 index 0000000..8fd6102 Binary files /dev/null and b/Screenshots/Firefox on Windows/firefox/home.png differ diff --git a/Screenshots/Firefox on Windows/firefox/response.png b/Screenshots/Firefox on Windows/firefox/response.png new file mode 100644 index 0000000..78127dd Binary files /dev/null and b/Screenshots/Firefox on Windows/firefox/response.png differ diff --git a/Screenshots/Opera on Windows/chromium/form-filled.png b/Screenshots/Opera on Windows/chromium/form-filled.png new file mode 100644 index 0000000..f2fa9d6 Binary files /dev/null and b/Screenshots/Opera on Windows/chromium/form-filled.png differ diff --git a/Screenshots/Opera on Windows/chromium/home.png b/Screenshots/Opera on Windows/chromium/home.png new file mode 100644 index 0000000..a7c836a Binary files /dev/null and b/Screenshots/Opera on Windows/chromium/home.png differ diff --git a/Screenshots/Opera on Windows/chromium/response.png b/Screenshots/Opera on Windows/chromium/response.png new file mode 100644 index 0000000..8116d98 Binary files /dev/null and b/Screenshots/Opera on Windows/chromium/response.png differ diff --git a/Screenshots/Safari on macOS Big Sur/webkit/home.png b/Screenshots/Safari on macOS Big Sur/webkit/home.png new file mode 100644 index 0000000..242313c Binary files /dev/null and b/Screenshots/Safari on macOS Big Sur/webkit/home.png differ diff --git a/browserstack.yml b/browserstack.yml index 931609d..1680b91 100644 --- a/browserstack.yml +++ b/browserstack.yml @@ -1,81 +1,77 @@ -# ============================= -# Set BrowserStack Credentials -# ============================= -# Add your BrowserStack userName and accessKey here or set BROWSERSTACK_USERNAME and -# BROWSERSTACK_ACCESS_KEY as env variables -userName: YOUR_USERNAME -accessKey: YOUR_ACCESS_KEY +# userName: ammaratariq3 +# accessKey: pxpD5AzFkbpqLxfTjLrj -# ====================== -# BrowserStack Reporting -# ====================== -# The following capabilities are used to set up reporting on BrowserStack: -# Set 'projectName' to the name of your project. Example, Marketing Website -projectName: BrowserStack Samples -# Set `buildName` as the name of the job / testsuite being run -buildName: browserstack build -# `buildIdentifier` is a unique id to differentiate every execution that gets appended to -# buildName. Choose your buildIdentifier format from the available expressions: -# ${BUILD_NUMBER} (Default): Generates an incremental counter with every execution -# ${DATE_TIME}: Generates a Timestamp with every execution. Eg. 05-Nov-19:30 -# Read more about buildIdentifiers here -> https://www.browserstack.com/docs/automate/selenium/organize-tests -buildIdentifier: '#${BUILD_NUMBER}' # Supports strings along with either/both ${expression} +# platforms: +# # Windows configurations +# - os: Windows +# osVersion: 11 +# browserName: chrome +# browserVersion: latest -# ======================================= -# Platforms (Browsers / Devices to test) -# ======================================= -# Platforms object contains all the browser / device combinations you want to test on. -# Entire list available here -> (https://www.browserstack.com/list-of-browsers-and-platforms/automate) -platforms: - - os: Windows - osVersion: 11 - browserName: chrome - browserVersion: latest - - os: OS X - osVersion: Ventura - browserName: playwright-webkit - browserVersion: latest - - os: Windows - osVersion: 11 - browserName: playwright-firefox - browserVersion: latest +# - os: Windows +# osVersion: 10 +# browserName: firefox +# browserVersion: latest -# ======================= -# Parallels per Platform -# ======================= -# The number of parallel threads to be used for each platform set. -# BrowserStack's SDK runner will select the best strategy based on the configured value -# -# Example 1 - If you have configured 3 platforms and set `parallelsPerPlatform` as 2, a total of 6 (2 * 3) parallel threads will be used on BrowserStack -# -# Example 2 - If you have configured 1 platform and set `parallelsPerPlatform` as 5, a total of 5 (1 * 5) parallel threads will be used on BrowserStack -parallelsPerPlatform: 1 +# - os: Windows +# osVersion: 10 +# browserName: edge +# browserVersion: latest -# ========================================== -# BrowserStack Local -# (For localhost, staging/private websites) -# ========================================== -# Set browserStackLocal to true if your website under test is not accessible publicly over the internet -# Learn more about how BrowserStack Local works here -> https://www.browserstack.com/docs/automate/selenium/local-testing-introduction -browserstackLocal: true # (Default false) -# browserStackLocalOptions: -# Options to be passed to BrowserStack local in-case of advanced configurations - # localIdentifier: # (Default: null) Needed if you need to run multiple instances of local. - # forceLocal: true # (Default: false) Set to true if you need to resolve all your traffic via BrowserStack Local tunnel. - # Entire list of arguments available here -> https://www.browserstack.com/docs/automate/selenium/manage-incoming-connections +# # macOS configurations +# - os: OS X +# osVersion: Ventura +# browserName: playwright-webkit +# browserVersion: latest -framework: playwright -source: node-js-playwright-sample-sdk:v1 +# - os: OS X +# osVersion: Big Sur +# browserName: chrome +# browserVersion: latest -# =================== -# Debugging features -# =================== -debug: false # # Set to true if you need screenshots for every selenium command ran -networkLogs: false # Set to true to enable HAR logs capturing -consoleLogs: errors # Remote browser's console debug levels to be printed (Default: errors) -# Available options are `disable`, `errors`, `warnings`, `info`, `verbose` (Default: errors) -# CUSTOM_TAG_: # (Default: parent folder name of the test file) Custom tag for your test suite +# - os: OS X +# osVersion: Catalina +# browserName: safari +# browserVersion: latest -# Test Observability is an intelligent test reporting & debugging product. It collects data using the SDK. Read more about what data is collected at https://www.browserstack.com/docs/test-observability/references/terms-and-conditions -# Visit observability.browserstack.com to see your test reports and insights. To disable test observability, specify `testObservability: false` in the key below. -testObservability: true +# # Mobile configurations +# - deviceName: Samsung Galaxy S23 Ultra +# browserName: chrome +# osVersion: 13.0 + +# - deviceName: iPhone 14 Pro +# browserName: safari +# osVersion: 16 + +# - deviceName: Google Pixel 7 +# browserName: chrome +# osVersion: 13 + +# # Tablet configurations +# - deviceName: iPad Pro 12.9 2021 +# browserName: safari +# osVersion: 15 + +# - deviceName: Samsung Galaxy Tab S8 +# browserName: chrome +# osVersion: 12 + +common: +userName: ammaratariq3 +accessKey: pxpD5AzFkbpqLxfTjLrj + buildName: "Playwright BrowserStack Build" + projectName: "Playwright Test" + server: "hub-cloud.browserstack.com" + +environments: + - device: "iPhone 14 Pro" + os_version: "16" + browserName: "safari" + realMobile: true + name: "iPhone 14 Pro Test" + + - device: "Google Pixel 7" + os_version: "13" + browserName: "chrome" + realMobile: true + name: "Google Pixel 7 Test" diff --git a/config.js b/config.js new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json index 6e4805d..c2e2393 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,13 @@ "version": "1.0.0", "hasInstallScript": true, "license": "ISC", + "dependencies": { + "browserstack-local": "^1.5.5", + "chai": "^5.1.1", + "js-yaml": "^4.1.0" + }, "devDependencies": { - "@playwright/test": "latest", + "@playwright/test": "^1.45.3", "browserstack-node-sdk": "latest" } }, @@ -173,18 +178,18 @@ } }, "node_modules/@playwright/test": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.1.tgz", - "integrity": "sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==", + "version": "1.45.3", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.3.tgz", + "integrity": "sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==", "dev": true, "dependencies": { - "playwright": "1.40.1" + "playwright": "1.45.3" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@pnpm/config.env-replace": { @@ -492,7 +497,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "dependencies": { "debug": "4" }, @@ -591,8 +595,15 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "engines": { + "node": ">=12" + } }, "node_modules/ast-types": { "version": "0.13.4", @@ -678,8 +689,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bare-events": { "version": "2.4.2", @@ -853,7 +863,6 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.5.5.tgz", "integrity": "sha512-jKne7yosrMcptj3hqxp36TP9k0ZW2sCqhyurX24rUL4G3eT7OLgv+CSQN8iq5dtkv5IK+g+v8fWvsiC/S9KxMg==", - "dev": true, "dependencies": { "agent-base": "^6.0.2", "https-proxy-agent": "^5.0.1", @@ -863,9 +872,9 @@ } }, "node_modules/browserstack-node-sdk": { - "version": "1.34.2", - "resolved": "https://registry.npmjs.org/browserstack-node-sdk/-/browserstack-node-sdk-1.34.2.tgz", - "integrity": "sha512-fMB0StYBBgg2kE8eDtF0cA15drD4pa5q24B/HjC/L94aVlpCdlrS3C4JaLEVBkNTMCnUc9lDmnJC+5vfFlrYyA==", + "version": "1.34.4", + "resolved": "https://registry.npmjs.org/browserstack-node-sdk/-/browserstack-node-sdk-1.34.4.tgz", + "integrity": "sha512-y/5ikZ6+bkkPKxs0P4FVnn1sr+Yn3vUH1BuxlxmLMPIA0/Rf/qVosXucDrcPJe9EscTAuca5Cd1P4qizUDswJw==", "dev": true, "dependencies": { "@google-cloud/compute": "^4.0.1", @@ -1005,6 +1014,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1021,6 +1045,14 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "engines": { + "node": ">= 16" + } + }, "node_modules/cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", @@ -1231,8 +1263,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/config-chain": { "version": "1.1.13", @@ -1376,7 +1407,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1416,6 +1446,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -1579,8 +1617,7 @@ "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/duplexify": { "version": "4.1.2", @@ -1749,7 +1786,6 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, "dependencies": { "duplexer": "~0.1.1", "from": "~0", @@ -1907,8 +1943,7 @@ "node_modules/from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" }, "node_modules/fs-extra": { "version": "8.1.0", @@ -1951,8 +1986,21 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.2", @@ -2025,6 +2073,14 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", @@ -2107,7 +2163,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2127,7 +2182,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2137,7 +2191,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2496,7 +2549,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -2542,7 +2594,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2551,8 +2602,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -2692,8 +2742,7 @@ "node_modules/is-running": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", - "integrity": "sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==", - "dev": true + "integrity": "sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==" }, "node_modules/is-stream": { "version": "2.0.1", @@ -2809,7 +2858,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -3045,6 +3093,14 @@ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", "dev": true }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -3069,8 +3125,7 @@ "node_modules/map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==" }, "node_modules/matcher": { "version": "3.0.0", @@ -3205,8 +3260,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/netmask": { "version": "2.0.2", @@ -3334,7 +3388,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -3676,7 +3729,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3690,11 +3742,18 @@ "node": ">=8" } }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, "dependencies": { "through": "~2.3" } @@ -3706,47 +3765,33 @@ "dev": true }, "node_modules/playwright": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", - "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", + "version": "1.45.3", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.3.tgz", + "integrity": "sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==", "dev": true, "dependencies": { - "playwright-core": "1.40.1" + "playwright-core": "1.45.3" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", - "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", + "version": "1.45.3", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.3.tgz", + "integrity": "sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==", "dev": true, "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" - } - }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18" } }, "node_modules/process-nextick-args": { @@ -3801,7 +3846,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, "dependencies": { "event-stream": "=3.3.4" }, @@ -4042,7 +4086,6 @@ "version": "2.5.4", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", "integrity": "sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==", - "dev": true, "dependencies": { "glob": "^7.0.5" }, @@ -4300,7 +4343,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, "dependencies": { "through": "2" }, @@ -4336,7 +4378,6 @@ "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, "dependencies": { "duplexer": "~0.1.1" } @@ -4560,7 +4601,6 @@ "version": "0.9.9", "resolved": "https://registry.npmjs.org/temp-fs/-/temp-fs-0.9.9.tgz", "integrity": "sha512-WfecDCR1xC9b0nsrzSaxPf3ZuWeWLUWblW4vlDQAa1biQaKHiImHnJfeQocQe/hXKMcolRzgkcVX/7kK4zoWbw==", - "dev": true, "dependencies": { "rimraf": "~2.5.2" }, @@ -4586,8 +4626,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/tmp": { "version": "0.2.1", @@ -5060,8 +5099,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", diff --git a/package.json b/package.json index 2688f82..5b4318f 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,12 @@ "author": "", "license": "ISC", "devDependencies": { - "@playwright/test": "latest", + "@playwright/test": "^1.45.3", "browserstack-node-sdk": "latest" + }, + "dependencies": { + "browserstack-local": "^1.5.5", + "chai": "^5.1.1", + "js-yaml": "^4.1.0" } } diff --git a/playwright-browserstack-sdk.config.temp.json b/playwright-browserstack-sdk.config.temp.json new file mode 100644 index 0000000..e7beaba --- /dev/null +++ b/playwright-browserstack-sdk.config.temp.json @@ -0,0 +1 @@ +{"testDir":"./tests","use":{"browserName":"chromium","headless":true,"screenshot":"only-on-failure","video":"retain-on-failure","trace":"on-first-retry"},"projects":[{"use":{"platformCaps":{"os":"Windows","osVersion":11,"browserName":"chrome","browserVersion":"latest"},"connectOptions":{"wsEndpoint":"wss://cdp.browserstack.com/playwright?caps=%7B%22useW3C%22%3Afalse%2C%22browserstack.user%22%3A%22ammaratariq3%22%2C%22browserstack.key%22%3A%22pxpD5AzFkbpqLxfTjLrj%22%2C%22os%22%3A%22Windows%22%2C%22os_version%22%3A%2211%22%2C%22browserName%22%3A%22chrome%22%2C%22browser_version%22%3A%22latest%22%2C%22browserstack.browserstackSDK%22%3A%22playwright-nodeagent%2F1.34.4%22%2C%22browserstack.hostName%22%3A%22MUOC029%22%7D"}},"name":"chrome@latest:Windows 11@browserstack"},{"use":{"platformCaps":{"os":"OS X","osVersion":"Ventura","browserName":"playwright-webkit","browserVersion":"latest"},"connectOptions":{"wsEndpoint":"wss://cdp.browserstack.com/playwright?caps=%7B%22useW3C%22%3Afalse%2C%22browserstack.user%22%3A%22ammaratariq3%22%2C%22browserstack.key%22%3A%22pxpD5AzFkbpqLxfTjLrj%22%2C%22os%22%3A%22OS%20X%22%2C%22os_version%22%3A%22Ventura%22%2C%22browserName%22%3A%22playwright-webkit%22%2C%22browser_version%22%3A%22latest%22%2C%22browserstack.browserstackSDK%22%3A%22playwright-nodeagent%2F1.34.4%22%2C%22browserstack.hostName%22%3A%22MUOC029%22%7D"}},"name":"playwright-webkit@latest:OSX Ventura@browserstack"},{"use":{"platformCaps":{"deviceName":"Samsung Galaxy S23 Ultra","browserName":"chrome","osVersion":13},"connectOptions":{"wsEndpoint":"wss://cdp.browserstack.com/playwright?caps=%7B%22useW3C%22%3Afalse%2C%22browserstack.user%22%3A%22ammaratariq3%22%2C%22browserstack.key%22%3A%22pxpD5AzFkbpqLxfTjLrj%22%2C%22os_version%22%3A%2213%22%2C%22browserName%22%3A%22chrome%22%2C%22device%22%3A%22Samsung%20Galaxy%20S23%20Ultra%22%2C%22browserstack.browserstackSDK%22%3A%22playwright-nodeagent%2F1.34.4%22%2C%22browserstack.hostName%22%3A%22MUOC029%22%7D"}},"name":"chrome@Samsung Galaxy S23 Ultra:13@browserstack-mobile"}],"globalSetup":"C:\\Users\\AHMAD\\Desktop\\Sample\\node-js-playwright-browserstack\\node_modules\\browserstack-node-sdk\\src\\bin\\playwright\\globalSetup.js","reporter":[["C:\\Users\\AHMAD\\Desktop\\Sample\\node-js-playwright-browserstack\\node_modules\\browserstack-node-sdk\\src\\bin\\playwright\\reporter\\reporter.js"]],"workers":3} \ No newline at end of file diff --git a/playwright.config.js b/playwright.config.js index 0f3a2f4..518bf50 100644 --- a/playwright.config.js +++ b/playwright.config.js @@ -1,31 +1,142 @@ -// This is a sample config for what users might be running locally -const config = { - testDir: './tests', - testMatch: '**/bstack_test*.js', - - /* Maximum time one test can run for. */ - timeout: 90 * 1000, - expect: { - /** - * Maximum time expect() should wait for the condition to be met. - * For example in `await expect(locator).toHaveText();` - */ - timeout: 5000, - }, - /* tests in parallel */ - workers: 1, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'line', - /* Configure projects for major browsers */ - projects: [ - { - name: 'chrome', - use: { - browserName: 'chromium', - channel: 'chrome', +// const { devices } = require('@playwright/test'); + +// module.exports = { +// use: { +// trace: 'on-first-retry', +// headless: false, +// //screenshot: 'only-on-failure', +// video: 'retain-on-failure', +// ignoreHTTPSErrors: true, +// launchOptions: { +// args: ['--no-sandbox', '--disable-setuid-sandbox'], + +// }, +// }, +// projects: [ +// // { +// // name: 'Chrome on Windows', +// // use: { +// // browserName: 'chromium', +// // ...devices['Desktop Chrome'], +// // metadata: { +// // browser: 'Chrome', +// // browser_version: 'latest', +// // os: 'Windows', +// // os_version: '10', +// // }, +// // }, +// // }, +// // { +// // name: 'Firefox on Windows', +// // use: { +// // browserName: 'firefox', +// // ...devices['Desktop Firefox'], +// // metadata: { +// // browser: 'Firefox', +// // browser_version: '127', +// // os: 'Windows', +// // os_version: '10', +// // }, +// // }, +// // }, +// // { +// // name: 'Safari on macOS Big Sur', +// // use: { +// // browserName: 'webkit', +// // ...devices['Desktop Safari'], +// // metadata: { +// // browser: 'Safari', +// // browser_version: 'latest', +// // os: 'OS X', +// // os_version: 'Sonoma', +// // }, +// // }, +// // }, +// // { +// // name: 'Edge on Windows', +// // use: { +// // browserName: 'chromium', +// // ...devices['Desktop Edge'], +// // metadata: { +// // browser: 'Edge', +// // browser_version: 'latest', +// // os: 'Windows', +// // os_version: '10', +// // }, +// // }, +// // }, +// // { +// // name: 'Opera on Windows', +// // use: { +// // browserName: 'chromium', +// // ...devices['Desktop Chrome'], +// // metadata: { +// // browser: 'Opera', +// // browser_version: 'latest', +// // os: 'Windows', +// // os_version: '10', +// // }, +// // }, + +// // }, +// { +// name: 'iPhone 12 Pro', +// use: { +// browserName: 'webkit', +// ...devices['iPhone 14 Pro'], +// // Additional BrowserStack capabilities +// ...{ +// browserstack: { +// projectName: 'Playwright Test', +// buildName: 'Playwright BrowserStack Build', +// }, +// }, +// }, +// }, +// { +// name: 'Pixel 5', +// use: { +// browserName: 'chromium', +// ...devices['Pixel 5'], +// // Additional BrowserStack capabilities +// ...{ +// browserstack: { +// projectName: 'Playwright Test', +// buildName: 'Playwright BrowserStack Build', +// }, +// }, +// }, +// }, + +// ] +// }; + +const { defineConfig, devices } = require('@playwright/test'); +const yaml = require('js-yaml'); +const fs = require('fs'); +const path = require('path'); + +// Load the bs.yml file +const bsConfig = yaml.load(fs.readFileSync(path.resolve(__dirname, 'bs.yml'), 'utf8')); + +module.exports = defineConfig({ + projects: bsConfig.environments.map(env => ({ + name: env.name, + use: { + browserName: env.browserName === 'safari' ? 'webkit' : env.browserName, + // BrowserStack specific capabilities + browserstack: { + device: env.device, + os_version: env.os_version, + realMobile: env.realMobile, + name: env.name, + projectName: bsConfig.common.projectName, + buildName: bsConfig.common.buildName, + username: bsConfig.common.username, + accessKey: bsConfig.common.accessKey, }, }, - ], -}; + })), +}); + -module.exports = config; diff --git a/playwright.local.config.js b/playwright.local.config.js index e85522c..ba8e0a0 100644 --- a/playwright.local.config.js +++ b/playwright.local.config.js @@ -1,31 +1,79 @@ -// This is a sample config for what users might be running locally -const config = { - testDir: './tests', - testMatch: '**/bstack_local*.js', +const { devices } = require('@playwright/test'); - /* Maximum time one test can run for. */ - timeout: 90 * 1000, - expect: { - /** - * Maximum time expect() should wait for the condition to be met. - * For example in `await expect(locator).toHaveText();` - */ - timeout: 5000, +module.exports = { + use: { + trace: 'on-first-retry', + headless: false, + //screenshot: 'only-on-failure', + video: 'retain-on-failure', + ignoreHTTPSErrors: true, + launchOptions: { + args: ['--no-sandbox', '--disable-setuid-sandbox'], + }, }, - /* tests in parallel */ - workers: 1, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'line', - /* Configure projects for major browsers */ projects: [ { - name: 'chrome', + name: 'Chrome on Windows ', use: { browserName: 'chromium', - channel: 'chrome', + ...devices['Desktop Chrome'], + viewport: { width: 1920, height: 1080 }, + // BrowserStack capabilities + metadata: { + browser: 'Chrome', + browser_version: 'latest', + os: 'Windows', + os_version: '11', + }, + }, + }, + { + name: 'Firefox on Windows ', + use: { + browserName: 'firefox', + ...devices['Desktop Firefox'], + viewport: { width: 1660, height: 1080 }, + // BrowserStack capabilities + metadata: { + browser: 'Firefox', + browser_version: 'latest', + os: 'Windows', + os_version: '11', + }, + }, + }, + { + name: 'Safari on macOS Big Sur', + use: { + browserName: 'webkit', + ...devices['Desktop Safari'], + viewport: { width: 1440, height: 1080 }, + // BrowserStack capabilities + metadata: { + browser: 'Safari', + browser_version: 'latest', + os: 'OS X', + os_version: 'Big Sur', + }, + }, + }, + { + name: 'Edge on Windows ', + use: { + browserName: 'firefox', + ...devices['Desktop Edge'], + viewport: { width: 1280, height: 720 }, + // BrowserStack capabilities + metadata: { + browser: 'Edge', + browser_version: 'latest', + os: 'Windows', + os_version: '11', + }, }, }, ], }; -module.exports = config; + + diff --git a/tests/bstack_local_test.js b/tests/bstack_local_test.js index da663ef..8740345 100644 --- a/tests/bstack_local_test.js +++ b/tests/bstack_local_test.js @@ -1,7 +1,22 @@ -const { expect, test } = require('@playwright/test'); -const sleep = require('util').promisify(setTimeout) -test('BStack local is working', async ({ page }) => { - await page.goto('http://bs-local.com:45454/'); - const title = await page.title(); - expect(title).toContain('BrowserStack Local'); -}); +// const { test, expect } = require('@playwright/test'); + +// test('Sample Test', async ({ page }) => { +// await page.goto('https://opticommneud01stvnjnsapp.azurewebsites.net/'); + +// const cookies = await page.context().cookies(); +// console.log(cookies); + +// await page.click('#menu-item-16983 > .ekit-menu-nav-link'); + +// await page.waitForTimeout(3000); + +// await page.click('#snize-product-10793 > .snize-view-link > .snize-item > .snize-thumbnail-wrapper > .snize-thumbnail'); + +// await page.waitForSelector('.elementor-element-7905e8cb > .elementor-widget-wrap'); + +// await page.fill('#input_3_2', 'Opticommerce'); +// await page.fill('#input_3_4', '123456'); +// await page.fill('#input_3_3', 'formtest@opticommerce.co.uk'); +// await page.fill('#input_3_5', 'test'); +// await page.waitForTimeout(10000); // Wait for 10 seconds +// }); diff --git a/tests/bstack_test_add_to_cart.js b/tests/bstack_test_add_to_cart.js deleted file mode 100644 index a6b55a8..0000000 --- a/tests/bstack_test_add_to_cart.js +++ /dev/null @@ -1,18 +0,0 @@ -const { expect, test } = require('@playwright/test'); - -test('BStackDemo test add to cart', async ({ page }) => { - // visit the site - await page.goto('https://bstackdemo.com/'); - - // get name of product we want to add to cart\ - const productToAdd = await page.locator('#\\33 > p').textContent(); - - // click on add to cart - await page.click('#\\33 > .shelf-item__buy-btn'); - - // get name of item in cart - const productInCart = await page.textContent('#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title'); - - // check if product in cart is same as one added - expect(productInCart).toEqual(productToAdd); -}); diff --git a/tests/bstack_test_checkout_flow.js b/tests/bstack_test_checkout_flow.js deleted file mode 100644 index ece0b42..0000000 --- a/tests/bstack_test_checkout_flow.js +++ /dev/null @@ -1,36 +0,0 @@ -const { expect, test } = require('@playwright/test'); - -test('BStackDemo test checkout flow', async ({ page }) => { - // visit the site - await page.goto('https://bstackdemo.com/'); - - // sign in - await page.click('#signin', { delay: 100 }); - await page.fill('#react-select-2-input', 'fav_user'); - await page.press('#react-select-2-input', 'Enter'); - await page.fill('#react-select-3-input', 'testingisfun99'); - await page.press('#react-select-3-input', 'Enter'); - await page.click('#login-btn'); - await page.waitForNavigation(); - - // click on buy item - await page.click('#\\31 > .shelf-item__buy-btn'); - await page.click('div.float-cart__close-btn'); - await page.click('#\\32 > .shelf-item__buy-btn'); - await page.click('.buy-btn'); - - // add address details - await page.fill('#firstNameInput', 'first'); - await page.fill('#lastNameInput', 'last'); - await page.fill('#addressLine1Input', 'address'); - await page.fill('#provinceInput', 'province'); - await page.fill('#postCodeInput', 'pincode'); - - // checkout - await page.click('#checkout-shipping-continue'); - await page.click('text=Continue'); - await page.click('text=Orders'); - - const list = page.locator('.a-fixed-left-grid-inner'); - await expect(list).toHaveCount(2); -}); diff --git a/tests/form-data.js b/tests/form-data.js new file mode 100644 index 0000000..e4ed855 --- /dev/null +++ b/tests/form-data.js @@ -0,0 +1,7 @@ +export const formData = { + name: "Opticommerce", + email: "formtest@opticommerce.co.uk", + telephone: "123456", + message: "test" + }; + \ No newline at end of file diff --git a/tests/screenshot-utils.js b/tests/screenshot-utils.js new file mode 100644 index 0000000..25047bf --- /dev/null +++ b/tests/screenshot-utils.js @@ -0,0 +1,42 @@ +const fs = require('fs'); +const path = require('path'); + +/** + * Returns the path to the screenshots directory based on the browser and device. + * @param {string} browserName - The name of the browser. + * @param {string} projectName - The name of the project (device or browser configuration). + * @returns {string} - The path to the screenshots directory. + */ +const getScreenshotsDir = (browserName, projectName) => { + const baseDir = 'C:/Users/AHMAD/Desktop/Sample/node-js-playwright-browserstack/Screenshots'; + const deviceDir = projectName ? `/${projectName}` : ''; + const browserDir = `/${browserName}`; + return path.join(baseDir, deviceDir, browserDir); +}; + +/** + * Ensures that the specified directory exists, creating it if necessary. + * @param {string} dir - The path to the directory. + */ +const ensureScreenshotsDirExists = (dir) => { + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } +}; + +/** + * Saves a full-page screenshot to the specified directory with the given step name. + * @param {object} page - The Playwright page object. + * @param {string} step - The name of the step for the screenshot filename. + * @param {string} screenshotsDir - The directory where screenshots will be saved. + */ +const saveScreenshot = async (page, step, screenshotsDir) => { + const screenshotPath = path.join(screenshotsDir, `${step}.png`); + await page.screenshot({ path: screenshotPath, fullPage: true }); +}; + +module.exports = { + getScreenshotsDir, + ensureScreenshotsDirExists, + saveScreenshot +}; diff --git a/tests/test.spec.js b/tests/test.spec.js new file mode 100644 index 0000000..dc16c2f --- /dev/null +++ b/tests/test.spec.js @@ -0,0 +1,67 @@ +const { test, expect } = require('@playwright/test'); +const { formData } = require('./form-data'); // Ensure this path is correct +const { getScreenshotsDir, ensureScreenshotsDirExists, saveScreenshot } = require('./screenshot-utils'); // Ensure this path is correct +test.describe.configure({ timeout: 90000 }); // Setting a global timeout of 90 seconds + +test('Complete Form Submission Flow', async ({ page, browserName }, testInfo) => { + const projectName = testInfo.project.name; + const screenshotsDir = getScreenshotsDir(browserName, projectName); + ensureScreenshotsDirExists(screenshotsDir); + + // Going to Homepage + await page.goto('https://opticommneud01stvnjnsapp.azurewebsites.net/', { timeout: 100000 }); + await saveScreenshot(page, 'home', screenshotsDir); + + // // Basic Test with Assertions + + // await page.waitForSelector('#menu-item-16983 > .ekit-menu-nav-link', { timeout: 70000 }); + // await expect(page.locator('#menu-item-16983 > .ekit-menu-nav-link')).toBeVisible(); + // await page.click('#menu-item-16983 > .ekit-menu-nav-link'); + // console.log('Current URL after clicking menu item:', page.url()); + + // // Selecting the product from PLP + // await page.waitForSelector('#snize-product-10808 > .snize-view-link > .snize-item > .snize-thumbnail-wrapper > .snize-thumbnail > .snize-item-image', { timeout: 100000 }); + // await expect(page.locator('#snize-product-10808 > .snize-view-link > .snize-item > .snize-thumbnail-wrapper > .snize-thumbnail > .snize-item-image')).toBeVisible(); + // await page.click('#snize-product-10808 > .snize-view-link > .snize-item > .snize-thumbnail-wrapper > .snize-thumbnail > .snize-item-image'); + + + // await page.waitForSelector('.elementor-element-7905e8cb > .elementor-widget-wrap', { timeout: 80000 }); + // await expect(page.locator('.elementor-element-7905e8cb > .elementor-widget-wrap')).toBeVisible(); + // console.log('Current URL after waiting for element:', page.url()); + + // // Filling in the form values + // await expect(page.locator('#input_3_2')).toBeEnabled(); + // await page.fill('#input_3_2', formData.name); + // await expect(page.locator('#input_3_2')).toHaveValue(formData.name); + + // await expect(page.locator('#input_3_4')).toBeEnabled(); + // await page.fill('#input_3_4', formData.telephone); + // await expect(page.locator('#input_3_4')).toHaveValue(formData.telephone); + + // await expect(page.locator('#input_3_3')).toBeEnabled(); + // await page.fill('#input_3_3', formData.email); + // await expect(page.locator('#input_3_3')).toHaveValue(formData.email); + + // await expect(page.locator('#input_3_5')).toBeEnabled(); + // await page.fill('#input_3_5', formData.message); + // await expect(page.locator('#input_3_5')).toHaveValue(formData.message); + + // await saveScreenshot(page, 'form-filled', screenshotsDir); + // await expect(page.locator('#gform_submit_button_3')).toBeEnabled(); + // await page.click('#gform_submit_button_3'); + // console.log('Current URL after form submission:', page.url()); + + // try { + // const successMessageLocator = page.locator( + // '//div[@id="gform_confirmation_message_3" and @class="gform_confirmation_message_3 gform_confirmation_message"]' + // ); + // await successMessageLocator.waitFor({ state: 'visible', timeout: 60000 }); + // const successMessage = await successMessageLocator.textContent(); + // expect(successMessage).toContain("Thank you for contacting us! We will get in touch with you shortly."); + + // await saveScreenshot(page, 'response', screenshotsDir); + // } catch (error) { + // console.error('Error validating the form submission response:', error.message); + // await saveScreenshot(page, 'error', screenshotsDir); + // } +});