From 712c16a4ef80d626f05d162e8563f7f4b6157ad6 Mon Sep 17 00:00:00 2001 From: Lukasz Jagiela Date: Fri, 28 Feb 2025 17:01:43 +0100 Subject: [PATCH] test: lw-12373 add e2e support for Firefox --- .github/actions/test/reports/action.yml | 81 +++++++++ .github/actions/test/smoke/action.yml | 59 +++++++ .github/workflows/ci.yml | 157 ++++++++++-------- packages/e2e-tests/README.md | 9 +- packages/e2e-tests/package.json | 2 + .../src/features/AddNewWalletConnect.feature | 1 + .../features/OnboardingHardwareWallet.feature | 1 + .../AnalyticsActivityExtended.feature | 1 + .../analytics/AnalyticsActivityPopup.feature | 1 + .../AnalyticsAddressBookExtended.feature | 1 + .../AnalyticsAddressBookPopup.feature | 1 + .../AnalyticsEventPropertiesExtended.feature | 1 + .../AnalyticsEventPropertiesPopup.feature | 1 + .../AnalyticsFiatOnRampOffRamp.feature | 1 + .../analytics/AnalyticsForgotPassword.feature | 1 + .../analytics/AnalyticsNFTsExtended.feature | 1 + .../analytics/AnalyticsNFTsPopup.feature | 1 + .../AnalyticsNavigationMainExtended.feature | 1 + .../AnalyticsNavigationMainPopup.feature | 1 + .../AnalyticsNavigationTopExtended.feature | 1 + .../AnalyticsNavigationTopPopup.feature | 1 + .../AnalyticsOnboardingEvents.feature | 1 + .../analytics/AnalyticsSendExtended.feature | 1 + .../analytics/AnalyticsSendPopup.feature | 1 + .../AnalyticsSettingsExtended.feature | 1 + .../analytics/AnalyticsSettingsPopup.feature | 1 + .../AnalyticsStakingExtended.feature | 1 + ...yticsStakingSwitchingPoolsExtended.feature | 1 + .../AnalyticsToggleSettingsExtended.feature | 1 + .../AnalyticsToggleSettingsPopup.feature | 1 + .../analytics/AnalyticsTokensExtended.feature | 1 + .../analytics/AnalyticsTokensPopup.feature | 1 + .../AnalyticsVotingCenterExtended.feature | 1 + .../AnalyticsVotingCenterPopup.feature | 1 + .../e2e-tests/src/hooks/beforeTagHooks.ts | 10 ++ .../e2e-tests/src/hooks/scenarioTagRunner.ts | 7 +- packages/e2e-tests/src/page/extendedView.ts | 9 +- packages/e2e-tests/src/page/popupView.ts | 31 ++-- .../e2e-tests/src/utils/browserStorage.ts | 43 +++-- .../e2e-tests/src/utils/consoleManager.ts | 48 +++--- packages/e2e-tests/src/utils/firefoxUtils.ts | 14 ++ .../e2e-tests/src/utils/networkManager.ts | 141 +++++++++------- packages/e2e-tests/wdio.conf.base.ts | 4 +- packages/e2e-tests/wdio.conf.firefox.ts | 43 +++++ yarn.lock | 54 ++++++ 45 files changed, 550 insertions(+), 191 deletions(-) create mode 100644 .github/actions/test/reports/action.yml create mode 100644 .github/actions/test/smoke/action.yml create mode 100644 packages/e2e-tests/src/utils/firefoxUtils.ts create mode 100755 packages/e2e-tests/wdio.conf.firefox.ts diff --git a/.github/actions/test/reports/action.yml b/.github/actions/test/reports/action.yml new file mode 100644 index 0000000000..ecfc76cf8d --- /dev/null +++ b/.github/actions/test/reports/action.yml @@ -0,0 +1,81 @@ +name: process-smoke-reports + +inputs: + BROWSER: + description: 'browser' + required: true + type: string + default: chrome + SMOKE_TESTS_RESULT: + required: true + type: string + GH_TOKEN: + description: 'Github token' + required: true + E2E_AWS_ACCESS_KEY_ID: + required: true + E2E_AWS_SECRET_ACCESS_KEY: + required: true + E2E_REPORTS_USER: + required: true + E2E_REPORTS_PASSWORD: + required: true + E2E_REPORTS_URL: + required: true +runs: + using: 'composite' + + steps: + - name: Download all smoke tests artifacts + uses: actions/download-artifact@v4 + with: + path: . + pattern: 'runner-artifacts-*' + merge-multiple: true + + - name: Create allure properties + shell: bash + if: always() + working-directory: ./reports/allure/results + run: | + echo " + branch=${{ github.ref_name }} + browser= ${{ inputs.BROWSER }} + tags= '@Smoke' + platform=Linux + " > environment.properties + + - name: Publish allure report to S3 + uses: andrcuns/allure-publish-action@v2.9.0 + if: always() + env: + GITHUB_AUTH_TOKEN: ${{ inputs.GH_TOKEN }} + AWS_ACCESS_KEY_ID: ${{ inputs.E2E_AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ inputs.E2E_AWS_SECRET_ACCESS_KEY }} + with: + storageType: s3 + resultsGlob: './reports/allure/results' + bucket: lace-e2e-test-results + prefix: 'smoke/linux/${{ inputs.BROWSER }}/${{ github.run_number }}' + copyLatest: true + ignoreMissingResults: true + updatePr: comment + baseUrl: 'https://${{ inputs.E2E_REPORTS_USER }}:${{ inputs.E2E_REPORTS_PASSWORD }}@${{ inputs.E2E_REPORTS_URL }}' + + - name: Publish artifacts (logs, reports, screenshots) + uses: actions/upload-artifact@v4 + if: always() + with: + name: test-artifacts + path: | + ./packages/e2e-tests/screenshots + ./packages/e2e-tests/logs + ./packages/e2e-tests/reports + retention-days: 5 + + - run: | + if [[ "${{ inputs.SMOKE_TESTS_RESULT }}" == "success" ]]; then + exit 0 + else + exit 1 + fi diff --git a/.github/actions/test/smoke/action.yml b/.github/actions/test/smoke/action.yml new file mode 100644 index 0000000000..66f894c7ea --- /dev/null +++ b/.github/actions/test/smoke/action.yml @@ -0,0 +1,59 @@ +name: run-smoke-e2e + +inputs: + BROWSER: + description: 'browser' + required: true + type: string + default: 'chrome' + BATCH: + description: 'Tests batch' + required: true + type: number + WALLET_PASSWORD: + description: 'Test wallet password' + required: true + GH_TOKEN: + description: 'Github token' + required: true + TEST_DAPP_URL: + description: 'Test DApp Url' + required: true + +runs: + using: 'composite' + + steps: + - name: Setup Node.js and install dependencies + uses: ./.github/actions/install + with: + WALLET_PASSWORD: ${{ inputs.WALLET_PASSWORD }} + GITHUB_TOKEN: ${{ inputs.GH_TOKEN }} + + - name: Download Lace build artifact + uses: actions/download-artifact@v4 + with: + name: '${{ env.BUILD_ARTIFACT_NAME }}-${{ inputs.BROWSER }}' + path: ./apps/browser-extension-wallet/dist + + - name: Setup Firefox Developer Edition + id: setup-firefox + uses: browser-actions/setup-firefox@v1 + with: + firefox-version: 'latest-devedition' + if: inputs.BROWSER == 'firefox' + + - name: Verify Firefox Installation + if: inputs.BROWSER == 'firefox' + run: | + echo Installed firefox versions: ${{ steps.setup-firefox.outputs.firefox-version }} + ${{ steps.setup-firefox.outputs.firefox-path }} --version + + - name: Execute E2E tests for ${{ inputs.BROWSER }} + uses: ./.github/actions/test/e2e + with: + BATCH: ${{ inputs.BATCH }} + SMOKE_ONLY: true + TEST_DAPP_URL: ${{ inputs.TEST_DAPP_URL }} + WALLET_PASSWORD: ${{ inputs.WALLET_PASSWORD }} + SERVICE_WORKER_LOGS: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f52fc102bc..678d21a21b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -230,7 +230,7 @@ jobs: SENTRY_PROJECT: ${{ startsWith(github.ref, 'refs/heads/release') && vars.SENTRY_PROJECT || ''}} SENTRY_ENVIRONMENT: 'production' DAPP_RADAR_API_KEY: ${{ startsWith(github.ref, 'refs/heads/release') && secrets.DAPP_RADAR_API_KEY || '' }} - + build: name: Build Lace runs-on: ubuntu-22.04 @@ -239,9 +239,33 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Build Lace artifact + - name: Build Lace chrome artifact + uses: ./.github/shared/build + with: + BROWSER_TARGET: 'chromium' + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + LACE_EXTENSION_KEY: ${{ secrets.MANIFEST_PUBLIC_KEY }} + BLOCKFROST_PROJECT_ID_MAINNET: ${{ secrets.BLOCKFROST_PROJECT_ID_MAINNET }} + BLOCKFROST_PROJECT_ID_PREPROD: ${{ secrets.BLOCKFROST_PROJECT_ID_PREPROD }} + BLOCKFROST_PROJECT_ID_PREVIEW: ${{ secrets.BLOCKFROST_PROJECT_ID_PREVIEW }} + BLOCKFROST_PROJECT_ID_SANCHONET: ${{ secrets.BLOCKFROST_PROJECT_ID_SANCHONET }} + SENTRY_AUTH_TOKEN: ${{ startsWith(github.ref, 'refs/heads/release') && secrets.SENTRY_AUTH_TOKEN || '' }} + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SENTRY_ORG: ${{ startsWith(github.ref, 'refs/heads/release') && vars.SENTRY_ORG || '' }} + SENTRY_PROJECT: ${{ startsWith(github.ref, 'refs/heads/release') && vars.SENTRY_PROJECT || ''}} + SENTRY_ENVIRONMENT: 'smoke-tests' + WALLET_POLLING_INTERVAL_IN_SEC: 5 + + - name: Upload chrome artifact + uses: actions/upload-artifact@v4 + with: + name: '${{ env.BUILD_ARTIFACT_NAME }}-chrome' + path: ./apps/browser-extension-wallet/dist + + - name: Build Lace firefox artifact uses: ./.github/shared/build with: + BROWSER_TARGET: 'firefox' GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} LACE_EXTENSION_KEY: ${{ secrets.MANIFEST_PUBLIC_KEY }} BLOCKFROST_PROJECT_ID_MAINNET: ${{ secrets.BLOCKFROST_PROJECT_ID_MAINNET }} @@ -255,104 +279,91 @@ jobs: SENTRY_ENVIRONMENT: 'smoke-tests' WALLET_POLLING_INTERVAL_IN_SEC: 5 - - name: Upload build artifact + - name: Upload firefox artifact uses: actions/upload-artifact@v4 with: - name: '${{ env.BUILD_ARTIFACT_NAME }}' + name: '${{ env.BUILD_ARTIFACT_NAME }}-firefox' path: ./apps/browser-extension-wallet/dist - smokeTests: - name: Smoke e2e tests + smokeTests-chrome: + name: Smoke e2e tests - Chrome runs-on: ubuntu-22.04 needs: build strategy: fail-fast: false matrix: batch: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] + steps: - name: Checkout repository uses: actions/checkout@v4 - - name: Setup Node.js and install dependencies - uses: ./.github/actions/install + - name: Execute E2E tests + uses: ./.github/actions/test/smoke with: + BROWSER: "chrome" + BATCH: ${{ matrix.batch }} + TEST_DAPP_URL: ${{ secrets.TEST_DAPP_URL }} WALLET_PASSWORD: ${{ secrets.WALLET_PASSWORD_TESTNET }} - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} - - name: Download Lace build artifact - uses: actions/download-artifact@v4 - with: - name: '${{ env.BUILD_ARTIFACT_NAME }}' - path: ./apps/browser-extension-wallet/dist + processReports-chrome: + name: Process smoke e2e test reports - Chrome + runs-on: ubuntu-22.04 + needs: smokeTests-chrome + if: always() + steps: + - name: Call process reports workflow + uses: ./.github/actions/test/reports + with: + BROWSER: 'chrome' + SMOKE_TESTS_RESULT: ${{ needs.smokeTests-chrome.result }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} + E2E_AWS_ACCESS_KEY_ID: ${{ secrets.E2E_AWS_ACCESS_KEY_ID }} + E2E_AWS_SECRET_ACCESS_KEY: ${{ secrets.E2E_AWS_SECRET_ACCESS_KEY }} + E2E_REPORTS_USER: ${{ secrets.E2E_REPORTS_USER }} + E2E_REPORTS_PASSWORD: ${{ secrets.E2E_REPORTS_PASSWORD }} + E2E_REPORTS_URL: ${{ secrets.E2E_REPORTS_URL }} + + smokeTests-firefox: + name: Smoke e2e tests - Firefox + runs-on: ubuntu-22.04 + needs: smokeTests-chrome + strategy: + fail-fast: false + matrix: + batch: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 - name: Execute E2E tests - uses: ./.github/actions/test/e2e + uses: ./.github/actions/test/smoke with: + BROWSER: 'firefox' BATCH: ${{ matrix.batch }} - SMOKE_ONLY: true TEST_DAPP_URL: ${{ secrets.TEST_DAPP_URL }} WALLET_PASSWORD: ${{ secrets.WALLET_PASSWORD_TESTNET }} - SERVICE_WORKER_LOGS: true + GH_TOKEN: ${{ secrets.GH_TOKEN }} - processReports: - name: Process smoke e2e test reports + processReports-firefox: + name: Process smoke e2e test reports - Firefox runs-on: ubuntu-22.04 - needs: smokeTests + needs: smokeTests-firefox if: always() steps: - - name: Download all smoke tests artifacts - uses: actions/download-artifact@v4 - with: - path: . - pattern: 'runner-artifacts-*' - merge-multiple: true - - - name: Create allure properties - shell: bash - if: always() - working-directory: ./reports/allure/results - run: | - echo " - branch=${{ github.ref_name }} - browser= 'Chrome' - tags= '@Smoke' - platform=Linux - " > environment.properties - - - name: Publish allure report to S3 - uses: andrcuns/allure-publish-action@v2.9.0 - if: always() - env: - GITHUB_AUTH_TOKEN: ${{ secrets.GH_TOKEN }} - AWS_ACCESS_KEY_ID: ${{ secrets.E2E_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.E2E_AWS_SECRET_ACCESS_KEY }} - with: - storageType: s3 - resultsGlob: './reports/allure/results' - bucket: lace-e2e-test-results - prefix: 'smoke/linux/chrome/${{ github.run_number }}' - copyLatest: true - ignoreMissingResults: true - updatePr: comment - baseUrl: 'https://${{ secrets.E2E_REPORTS_USER }}:${{ secrets.E2E_REPORTS_PASSWORD }}@${{ secrets.E2E_REPORTS_URL }}' - - - name: Publish artifacts (logs, reports, screenshots) - uses: actions/upload-artifact@v4 - if: always() - with: - name: test-artifacts - path: | - ./packages/e2e-tests/screenshots - ./packages/e2e-tests/logs - ./packages/e2e-tests/reports - retention-days: 5 - - - run: | - if [[ ${{ needs.smokeTests.result }} == "success" ]]; then - exit 0 - else - exit 1 - fi + - name: Call process reports workflow + uses: ./.github/actions/test/reports + with: + BROWSER: 'firefox' + SMOKE_TESTS_RESULT: ${{ needs.smokeTests-firefox.result }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} + E2E_AWS_ACCESS_KEY_ID: ${{ secrets.E2E_AWS_ACCESS_KEY_ID }} + E2E_AWS_SECRET_ACCESS_KEY: ${{ secrets.E2E_AWS_SECRET_ACCESS_KEY }} + E2E_REPORTS_USER: ${{ secrets.E2E_REPORTS_USER }} + E2E_REPORTS_PASSWORD: ${{ secrets.E2E_REPORTS_PASSWORD }} + E2E_REPORTS_URL: ${{ secrets.E2E_REPORTS_URL }} if-core-changed: name: When core changed diff --git a/packages/e2e-tests/README.md b/packages/e2e-tests/README.md index 7e541a0442..caf7851ca2 100755 --- a/packages/e2e-tests/README.md +++ b/packages/e2e-tests/README.md @@ -9,6 +9,7 @@ UI-mapped gherkin tests for the Lace browser extension with [selenium-standalone](https://github.com/webdriverio/selenium-standalone/blob/main/docs/java-versions.md) - On macOS, you can install it easily with homebrew: `brew install openjdk` - gpg +- Firefox Developer Edition (for running tests on Firefox) ## Running tests locally @@ -32,6 +33,7 @@ UI-mapped gherkin tests for the Lace browser extension - Run tests (from the `packages/e2e-tests` directory) - `yarn test:local:chrome` - `yarn test:local:edge` + - `yarn test:local:firefox` ## Selective gherkin scenario runs by tag matching @@ -43,11 +45,15 @@ UI-mapped gherkin tests for the Lace browser extension - chrome - edge +- firefox + - does not support network interception or console log collection, so some tests/features are disabled (using the @SkipFirefox tag) + - works only with Firefox Developer Edition, as the regular version does not allow the use of extensions + - does not support device emulation, so popup mode is simulated by simply resizing the window, which is not an ideal method of simulation ## Supported params - `STANDALONE_DRIVER=true|false` default = false (optional) - - true = use already running chromedriver on port 4444 + - true = use already running chromedriver/geckodriver on port 4444 - false = use webdriver manager - `ENV=(mainnet|preprod|preview)`default = preprod (optional) - determines default network used for tests @@ -58,6 +64,7 @@ UI-mapped gherkin tests for the Lace browser extension - url for test DApp (only for DApp Connector tests) - `SERVICE_WORKER_LOGS=true|false` default=false (optional) - enables service worker logs collection + - not supported for Firefox ## Run single feature file with params diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json index 46146a3e80..3e23a6779d 100755 --- a/packages/e2e-tests/package.json +++ b/packages/e2e-tests/package.json @@ -9,6 +9,7 @@ "test": "echo \"@lace/e2e-tests: no test command specified\"", "test:local:chrome": "../../node_modules/.bin/wdio run wdio.conf.chrome.ts", "test:local:edge": "../../node_modules/.bin/wdio run wdio.conf.edge.ts", + "test:local:firefox": "../../node_modules/.bin/wdio run wdio.conf.firefox.ts", "cleanup": "rm -rf logs node_modules reports screenshots", "lint": "run -T eslint -c .eslintrc.cjs .", "lint:fix": "run -T eslint -c .eslintrc.cjs . --fix", @@ -41,6 +42,7 @@ "@wdio/config": "8.40.6", "@wdio/cucumber-framework": "8.40.6", "@wdio/devtools-service": "8.40.6", + "@wdio/firefox-profile-service": "8.40.6", "@wdio/local-runner": "8.40.6", "@wdio/spec-reporter": "8.40.6", "@wdio/types": "8.40.6", diff --git a/packages/e2e-tests/src/features/AddNewWalletConnect.feature b/packages/e2e-tests/src/features/AddNewWalletConnect.feature index 6f64d45053..de7d3fb5e4 100644 --- a/packages/e2e-tests/src/features/AddNewWalletConnect.feature +++ b/packages/e2e-tests/src/features/AddNewWalletConnect.feature @@ -1,4 +1,5 @@ @AddNewWalletConnect @Testnet @Mainnet +@SkipFirefox Feature: Add new wallet - Connect hardware wallet @LW-9358 diff --git a/packages/e2e-tests/src/features/OnboardingHardwareWallet.feature b/packages/e2e-tests/src/features/OnboardingHardwareWallet.feature index 0a5b85a7cf..ecd43bf22a 100755 --- a/packages/e2e-tests/src/features/OnboardingHardwareWallet.feature +++ b/packages/e2e-tests/src/features/OnboardingHardwareWallet.feature @@ -1,4 +1,5 @@ @OnboardingHardwareWallet @Onboarding @Testnet @Mainnet +@SkipFirefox Feature: Onboarding - Hardware wallet @LW-3367 diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsActivityExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsActivityExtended.feature index 4d877b8cdf..a1f23a02dd 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsActivityExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsActivityExtended.feature @@ -1,4 +1,5 @@ @Transactions-Extended @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Transactions - Extended view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsActivityPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsActivityPopup.feature index 59385f9324..32b1aad6e3 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsActivityPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsActivityPopup.feature @@ -1,4 +1,5 @@ @Transactions-Popup @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Transactions - Extended view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsAddressBookExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsAddressBookExtended.feature index 3e3fb4e4fa..b12c87c8a8 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsAddressBookExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsAddressBookExtended.feature @@ -1,4 +1,5 @@ @AddressBook-extended @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Posthog - Address book - Extended view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsAddressBookPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsAddressBookPopup.feature index 046113378c..fdda0d8dda 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsAddressBookPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsAddressBookPopup.feature @@ -1,4 +1,5 @@ @AddressBook-popup @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Posthog - Address book - Popup view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsEventPropertiesExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsEventPropertiesExtended.feature index 7cb049ece2..2842450da5 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsEventPropertiesExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsEventPropertiesExtended.feature @@ -1,4 +1,5 @@ @NFTs-Extended @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Posthog - Event properties Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsEventPropertiesPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsEventPropertiesPopup.feature index b57c4e3165..165570ee3d 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsEventPropertiesPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsEventPropertiesPopup.feature @@ -1,4 +1,5 @@ @NFTs-Popup @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Posthog - Event properties Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsFiatOnRampOffRamp.feature b/packages/e2e-tests/src/features/analytics/AnalyticsFiatOnRampOffRamp.feature index 0a8c55e10c..28e81c5336 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsFiatOnRampOffRamp.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsFiatOnRampOffRamp.feature @@ -1,4 +1,5 @@ @Analytics @Banxa-Extended @Testnet +@SkipFirefox Feature: Analytics - Fiat On Ramp & Off Ramp - Banxa Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsForgotPassword.feature b/packages/e2e-tests/src/features/analytics/AnalyticsForgotPassword.feature index f8d5a47f8e..7c5e92ee23 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsForgotPassword.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsForgotPassword.feature @@ -1,4 +1,5 @@ @ForgotPassword @Analytics @Mainnet @Testnet @Pending +@SkipFirefox Feature: Analytics - Forgot Password Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsNFTsExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsNFTsExtended.feature index c35cf76fc7..12fba9fd7e 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsNFTsExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsNFTsExtended.feature @@ -1,4 +1,5 @@ @NFT-Folders-Extended @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Posthog - NFTs - Extended view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsNFTsPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsNFTsPopup.feature index 692d2777f6..f3b8024d7e 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsNFTsPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsNFTsPopup.feature @@ -1,4 +1,5 @@ @NFTs-Popup @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Posthog - NFTs - Popup view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsNavigationMainExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsNavigationMainExtended.feature index 4ef445d568..ac04b3f014 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsNavigationMainExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsNavigationMainExtended.feature @@ -1,4 +1,5 @@ @MainNavigation-Extended @Analytics @Mainnet @Testnet +@SkipFirefox Feature: Analytics - Main Navigation - Extended view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsNavigationMainPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsNavigationMainPopup.feature index 600314538a..952eb1c309 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsNavigationMainPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsNavigationMainPopup.feature @@ -1,4 +1,5 @@ @MainNavigation-Popup @Analytics @Mainnet @Testnet +@SkipFirefox Feature: Analytics - Main Navigation - Popup view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsNavigationTopExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsNavigationTopExtended.feature index d34a6734b3..78f9eb2198 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsNavigationTopExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsNavigationTopExtended.feature @@ -1,4 +1,5 @@ @Top-Navigation-Extended @Analytics @Mainnet @Testnet +@SkipFirefox Feature: Analytics - Top Navigation - Extended view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsNavigationTopPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsNavigationTopPopup.feature index 254a270a99..945987c784 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsNavigationTopPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsNavigationTopPopup.feature @@ -1,4 +1,5 @@ @Top-Navigation-Popup @Analytics @Mainnet @Testnet +@SkipFirefox Feature: Analytics - Top Navigation - Popup view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsOnboardingEvents.feature b/packages/e2e-tests/src/features/analytics/AnalyticsOnboardingEvents.feature index 1f43b1fa58..608b6888e4 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsOnboardingEvents.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsOnboardingEvents.feature @@ -1,4 +1,5 @@ @OnboardingCreateWallet @Analytics @Testnet +@SkipFirefox Feature: Analytics - Posthog - Onboarding - Extended View @LW-8311 diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsSendExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsSendExtended.feature index dc88dc78bf..6cf9274df8 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsSendExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsSendExtended.feature @@ -1,4 +1,5 @@ @Analytics-SendSimpleTransaction-Extended-E2E @Analytics @Testnet +@SkipFirefox Feature: Analytics - Posthog - Sending - Extended View Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsSendPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsSendPopup.feature index 8499988bb1..6c53cdff11 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsSendPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsSendPopup.feature @@ -1,4 +1,5 @@ @Analytics-SendSimpleTransaction-Popup-E2E @Analytics @Testnet +@SkipFirefox Feature: Analytics - Posthog - Sending - Popup View Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsSettingsExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsSettingsExtended.feature index bc5386e561..61e60155e2 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsSettingsExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsSettingsExtended.feature @@ -1,4 +1,5 @@ @Analytics-Settings-Extended @Analytics @Testnet +@SkipFirefox Feature: Analytics - Settings - Extended View Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsSettingsPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsSettingsPopup.feature index dd92bb537a..98bee34c71 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsSettingsPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsSettingsPopup.feature @@ -1,4 +1,5 @@ @Analytics-Settings-Popup @Analytics @Mainnet @Testnet +@SkipFirefox Feature: Analytics - Settings - Popup View Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsStakingExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsStakingExtended.feature index 1d5bcc4619..33c89e7169 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsStakingExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsStakingExtended.feature @@ -1,4 +1,5 @@ @Staking-NonDelegatedFunds-Extended @Analytics @Testnet +@SkipFirefox Feature: Analytics - PostHog - Staking - Extended View Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsStakingSwitchingPoolsExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsStakingSwitchingPoolsExtended.feature index 62b5aeb223..c47a71547b 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsStakingSwitchingPoolsExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsStakingSwitchingPoolsExtended.feature @@ -1,4 +1,5 @@ @Analytics-Staking-SwitchingPools-Extended-E2E @Analytics @Testnet @Pending @E2E +@SkipFirefox Feature: Analytics - Posthog - Switching pools - Extended View Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsToggleSettingsExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsToggleSettingsExtended.feature index dd7cfed4a9..fc40d66258 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsToggleSettingsExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsToggleSettingsExtended.feature @@ -1,4 +1,5 @@ @Settings-Extended @Analytics @Testnet +@SkipFirefox Feature: Analytics - Settings Toggle - Extended View Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsToggleSettingsPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsToggleSettingsPopup.feature index d4eb43afdd..98879a3b75 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsToggleSettingsPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsToggleSettingsPopup.feature @@ -1,4 +1,5 @@ @Settings-Popup @Analytics @Mainnet @Testnet +@SkipFirefox Feature: Analytics - Settings Toggle - Popup View Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsTokensExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsTokensExtended.feature index 4400ed2bb4..89627f1f54 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsTokensExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsTokensExtended.feature @@ -1,4 +1,5 @@ @Tokens-extended @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Tokens tab - extended view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsTokensPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsTokensPopup.feature index fa027c7531..661ca0aee9 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsTokensPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsTokensPopup.feature @@ -1,4 +1,5 @@ @Tokens-popup @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Tokens tab - Popup view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsVotingCenterExtended.feature b/packages/e2e-tests/src/features/analytics/AnalyticsVotingCenterExtended.feature index bc95368539..2c586745ae 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsVotingCenterExtended.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsVotingCenterExtended.feature @@ -1,4 +1,5 @@ @VotingCenterExtended @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Voting Center - Extended view Background: diff --git a/packages/e2e-tests/src/features/analytics/AnalyticsVotingCenterPopup.feature b/packages/e2e-tests/src/features/analytics/AnalyticsVotingCenterPopup.feature index 8e80417bfc..e6e84905fb 100644 --- a/packages/e2e-tests/src/features/analytics/AnalyticsVotingCenterPopup.feature +++ b/packages/e2e-tests/src/features/analytics/AnalyticsVotingCenterPopup.feature @@ -1,4 +1,5 @@ @VotingCenterPopup @Analytics @Testnet @Mainnet +@SkipFirefox Feature: Analytics - Voting Center - Popup view Background: diff --git a/packages/e2e-tests/src/hooks/beforeTagHooks.ts b/packages/e2e-tests/src/hooks/beforeTagHooks.ts index 6b69f0035c..aca86c318b 100644 --- a/packages/e2e-tests/src/hooks/beforeTagHooks.ts +++ b/packages/e2e-tests/src/hooks/beforeTagHooks.ts @@ -27,6 +27,16 @@ const popupViewRepositoryWalletInitialization = async (walletNames: TestWalletNa Before({ tags: '@pending or @Pending' }, async () => 'skipped'); +Before(({ pickle }) => { + const scenarioTags = pickle.tags.map((tag) => tag.name); + const browserName = (browser.capabilities as Record).browserName; + + if (scenarioTags.includes('@SkipFirefox') && browserName === 'firefox') { + return 'skipped'; + } + return pickle; +}); + Before( { tags: '@OnboardingCreateWallet or @Staking-initial-E2E or @OnboardingRestoreWallet or @OnboardingHardwareWallet or @TrezorOnboarding or @OnboardingCreatePaperWallet or @OnboardingRestorePaperWallet' diff --git a/packages/e2e-tests/src/hooks/scenarioTagRunner.ts b/packages/e2e-tests/src/hooks/scenarioTagRunner.ts index bc0b1c62b4..98051c4a4e 100644 --- a/packages/e2e-tests/src/hooks/scenarioTagRunner.ts +++ b/packages/e2e-tests/src/hooks/scenarioTagRunner.ts @@ -10,6 +10,7 @@ import consoleManager from '../utils/consoleManager'; import { clearWalletRepository } from '../fixture/walletRepositoryInitializer'; import allure from '@wdio/allure-reporter'; +import extensionUtils from '../utils/utils'; // eslint-disable-next-line no-unused-vars Before(async () => { @@ -18,11 +19,13 @@ Before(async () => { } }); -After({ tags: 'not @Pending and not @pending' }, async () => { +After({ tags: 'not @Pending and not @pending and not @SkipFirefox' }, async () => { await clearWalletRepository(); await networkManager.closeOpenedCdpSessions(); await consoleManager.closeOpenedCdpSessions(); - await browser.disableInterceptor(); + if ((await extensionUtils.getBrowser()) !== 'firefox') { + await browser.disableInterceptor(); + } testContext.clearContext(); await clearBackgroundStorageKey(); // FIXME: does not work for onboarding scenarios - error is thrown await localStorageManager.cleanLocalStorage(); diff --git a/packages/e2e-tests/src/page/extendedView.ts b/packages/e2e-tests/src/page/extendedView.ts index 6732b63598..833d2ba95d 100644 --- a/packages/e2e-tests/src/page/extendedView.ts +++ b/packages/e2e-tests/src/page/extendedView.ts @@ -1,7 +1,7 @@ import { LaceView, Page } from './page'; import { browser } from '@wdio/globals'; - -const EXTENSION_URL = 'chrome-extension://gafhhkghbfjjkeiendhlofajokpaflmk/app.html'; +import extensionUtils from '../utils/utils'; +import { getExtensionUUID } from '../utils/firefoxUtils'; class ExtendedView extends LaceView implements Page { async waitForPreloaderToDisappear() { @@ -12,7 +12,10 @@ class ExtendedView extends LaceView implements Page { } async getBaseUrl() { - return EXTENSION_URL; + if ((await extensionUtils.getBrowser()) !== 'firefox') { + return 'chrome-extension://gafhhkghbfjjkeiendhlofajokpaflmk/app.html'; + } + return `moz-extension://${await getExtensionUUID()}/app.html`; } async visit() { diff --git a/packages/e2e-tests/src/page/popupView.ts b/packages/e2e-tests/src/page/popupView.ts index 5f6c96ecd1..29fa3b1e2c 100644 --- a/packages/e2e-tests/src/page/popupView.ts +++ b/packages/e2e-tests/src/page/popupView.ts @@ -1,9 +1,9 @@ import { LaceView, Page } from './page'; import extensionUtils from '../utils/utils'; import { browser } from '@wdio/globals'; +import { getExtensionUUID } from '../utils/firefoxUtils'; class PopupView extends LaceView implements Page { - basePopupUrl = 'chrome-extension://gafhhkghbfjjkeiendhlofajokpaflmk/popup.html'; popupWidth = 360; popupHeight = 600; @@ -21,67 +21,76 @@ class PopupView extends LaceView implements Page { }, userAgent: `${ua}` }); + } else { + await browser.setWindowSize(this.popupWidth, this.popupHeight + 150); } } + async getBaseUrl() { + if ((await extensionUtils.getBrowser()) !== 'firefox') { + return 'chrome-extension://gafhhkghbfjjkeiendhlofajokpaflmk/popup.html'; + } + return `moz-extension://${await getExtensionUUID()}/popup.html`; + } + async visit(resize = true) { if (resize) { await this.setPopupWindowSize(); } - await browser.url(this.basePopupUrl); + await browser.url(await this.getBaseUrl()); await this.waitForPreloaderToDisappear(); } async visitTokensPage() { - await browser.url(`${this.basePopupUrl}#/assets`); + await browser.url(`${await this.getBaseUrl()}#/assets`); await this.setPopupWindowSize(); await this.waitForPreloaderToDisappear(); } async visitNFTsPage() { - await browser.url(`${this.basePopupUrl}#/nfts`); + await browser.url(`${await this.getBaseUrl()}#/nfts`); await this.setPopupWindowSize(); await this.waitForPreloaderToDisappear(); } async visitActivityPage() { - await browser.url(`${this.basePopupUrl}#/activity`); + await browser.url(`${await this.getBaseUrl()}#/activity`); await this.setPopupWindowSize(); await this.waitForPreloaderToDisappear(); } async visitStakingPage() { - await browser.url(`${this.basePopupUrl}#/staking`); + await browser.url(`${await this.getBaseUrl()}#/staking`); await this.setPopupWindowSize(); await this.waitForPreloaderToDisappear(); } async visitSettings() { - await browser.url(`${this.basePopupUrl}#/settings`); + await browser.url(`${await this.getBaseUrl()}#/settings`); await this.setPopupWindowSize(); await this.waitForPreloaderToDisappear(); } async visitAddressBook() { - await browser.url(`${this.basePopupUrl}#/address-book`); + await browser.url(`${await this.getBaseUrl()}#/address-book`); await this.setPopupWindowSize(); await this.waitForPreloaderToDisappear(); } async visitDAppExplorer() { - await browser.url(`${this.basePopupUrl}#/dapp-explorer`); + await browser.url(`${await this.getBaseUrl()}#/dapp-explorer`); await this.setPopupWindowSize(); await this.waitForPreloaderToDisappear(); } async visitVotingCenter() { - await browser.url(`${this.basePopupUrl}#/voting`); + await browser.url(`${await this.getBaseUrl()}#/voting`); await this.setPopupWindowSize(); await this.waitForPreloaderToDisappear(); } async visitNamiMode() { - await browser.url(`${this.basePopupUrl}`); + await browser.url(`${await this.getBaseUrl()}`); await this.setPopupWindowSize(); } } diff --git a/packages/e2e-tests/src/utils/browserStorage.ts b/packages/e2e-tests/src/utils/browserStorage.ts index cd6164b66c..152ce69b2f 100644 --- a/packages/e2e-tests/src/utils/browserStorage.ts +++ b/packages/e2e-tests/src/utils/browserStorage.ts @@ -4,20 +4,25 @@ import { browser } from '@wdio/globals'; const verifyBrowserStorageSupport: any = async () => { const currentBrowser = await extensionUtils.getBrowser(); - if (currentBrowser.includes('chrome') || currentBrowser.includes('MicrosoftEdge')) { + if ( + currentBrowser.includes('chrome') || + currentBrowser.includes('MicrosoftEdge') || + currentBrowser.includes('firefox') + ) { return Promise.resolve(); } return Promise.reject('Unsupported browser'); }; -export const getBackgroundStorage: any = async () => { +export const getBackgroundStorage: any = async (): Promise => { await verifyBrowserStorageSupport(); - try { - return await browser.execute( - 'const response = await chrome.storage.local.get("BACKGROUND_STORAGE"); return response.BACKGROUND_STORAGE;', - [] - ); + return await browser.execute(` + return (async () => { + const response = await chrome.storage.local.get("BACKGROUND_STORAGE"); + return response.BACKGROUND_STORAGE; + })() + `); } catch (error) { throw new Error(`Getting browser storage failed: ${error}`); } @@ -31,7 +36,11 @@ export const getBackgroundStorageItem: any = async (key: string) => { export const setMigrationState = async (): Promise => { await verifyBrowserStorageSupport(); try { - await browser.execute("await chrome.storage.local.set({ MIGRATION_STATE: { state: 'up-to-date' } })", []); + await browser.execute(` + return (async () => { + await chrome.storage.local.set({ MIGRATION_STATE: { state: 'up-to-date' } })", []); + })() + `); } catch (error) { throw new Error(`Setting browser storage failed: ${error}`); } @@ -44,8 +53,9 @@ export const setBackgroundStorage = async (data: Record): Promi const updatedBackgroundStorage = { ...backgroundStorage, ...data }; try { await browser.execute( - `await chrome.storage.local.set({ BACKGROUND_STORAGE: ${JSON.stringify(updatedBackgroundStorage)}})`, - [] + `return (async () => { await chrome.storage.local.set({ BACKGROUND_STORAGE: ${JSON.stringify( + updatedBackgroundStorage + )}}) })()` ); await setMigrationState(); } catch (error) { @@ -59,10 +69,11 @@ export const setUsePersistentUserId = async (): Promise => { const backgroundStorage = await getBackgroundStorage(); backgroundStorage.usePersistentUserId = true; try { - await browser.execute( - `await chrome.storage.local.set({ BACKGROUND_STORAGE: ${JSON.stringify(backgroundStorage)}})`, - [] - ); + await browser.execute(` + return (async () => { await chrome.storage.local.set({ BACKGROUND_STORAGE: ${JSON.stringify( + backgroundStorage + )}}) })() + `); } catch (error) { throw new Error(`Setting browser storage failed: ${error}`); } @@ -72,7 +83,7 @@ export const cleanBrowserStorage: any = async (): Promise => { await verifyBrowserStorageSupport(); try { - await browser.execute('await chrome.storage.local.clear();', []); + await browser.execute('return (async () => { await chrome.storage.local.clear(); })()', []); } catch (error) { throw new Error(`Clearing browser storage failed: ${error}`); } @@ -81,7 +92,7 @@ export const cleanBrowserStorage: any = async (): Promise => { export const clearBackgroundStorageKey: any = async (): Promise => { await verifyBrowserStorageSupport(); try { - await browser.execute('await chrome.storage.local.remove("BACKGROUND_STORAGE");', []); + await browser.execute('return (async () => { await chrome.storage.local.remove("BACKGROUND_STORAGE"); })()'); } catch (error) { Logger.warn(`Clearing background storage key failed: ${error}`); } diff --git a/packages/e2e-tests/src/utils/consoleManager.ts b/packages/e2e-tests/src/utils/consoleManager.ts index f18dffe8d6..b299b2e270 100644 --- a/packages/e2e-tests/src/utils/consoleManager.ts +++ b/packages/e2e-tests/src/utils/consoleManager.ts @@ -1,5 +1,7 @@ import { CDPSession } from 'puppeteer'; import { browser } from '@wdio/globals'; +import extensionUtils from './utils'; +import { Logger } from '../support/logger'; export interface ConsoleLogEntry { source: string; @@ -16,23 +18,27 @@ export class ConsoleManager { private static capturedLogs: ConsoleLogEntry[] = []; startLogsCollection = async (): Promise => { - await this.clearLogs(); - await browser.call(async () => { - const puppeteer = await browser.getPuppeteer(); - const targets = puppeteer - .targets() - .filter( - (target) => target.type() === 'page' || target.type() === 'service_worker' || target.type() === 'other' - ); - targets.map(async (target) => { - const client: CDPSession = (await target.createCDPSession()) as unknown as CDPSession; - ConsoleManager.cdpSessions.push(client); - await client.send(this.CONSOLE_ENABLE); - client.on('Console.messageAdded', async (entry: any) => { - ConsoleManager.capturedLogs.push(entry.message); + if ((await extensionUtils.getBrowser()) !== 'firefox') { + await this.clearLogs(); + await browser.call(async () => { + const puppeteer = await browser.getPuppeteer(); + const targets = puppeteer + .targets() + .filter( + (target) => target.type() === 'page' || target.type() === 'service_worker' || target.type() === 'other' + ); + targets.map(async (target) => { + const client: CDPSession = (await target.createCDPSession()) as unknown as CDPSession; + ConsoleManager.cdpSessions.push(client); + await client.send(this.CONSOLE_ENABLE); + client.on('Console.messageAdded', async (entry: any) => { + ConsoleManager.capturedLogs.push(entry.message); + }); }); }); - }); + } else { + Logger.log('Logs collection not available in Firefox'); + } }; clearLogs = async (): Promise => { @@ -45,11 +51,13 @@ export class ConsoleManager { ConsoleManager.capturedLogs.map(({ text }) => text).join('\n'); closeOpenedCdpSessions = async (): Promise => { - await this.clearLogs(); - ConsoleManager.cdpSessions.map(async (session) => { - if (session.connection()) await session.detach(); - }); - ConsoleManager.cdpSessions = []; + if ((await extensionUtils.getBrowser()) !== 'firefox') { + await this.clearLogs(); + ConsoleManager.cdpSessions.map(async (session) => { + if (session.connection()) await session.detach(); + }); + ConsoleManager.cdpSessions = []; + } }; } diff --git a/packages/e2e-tests/src/utils/firefoxUtils.ts b/packages/e2e-tests/src/utils/firefoxUtils.ts new file mode 100644 index 0000000000..7cd7eb6ff1 --- /dev/null +++ b/packages/e2e-tests/src/utils/firefoxUtils.ts @@ -0,0 +1,14 @@ +import fs from 'fs'; + +export const getExtensionUUID = async (): Promise => { + const filePath = (browser.capabilities as Record)['moz:profile']; + const fileName = '/prefs.js'; + const data = fs.readFileSync(filePath + fileName, 'utf8'); + + const match = data.match(/\\"lace-wallet-ext@lace\.io\\":\\"\b([\w-]+)\b\\"/); + + if (match) { + return match[1]; + } + throw new Error('UUID not found, aborting'); +}; diff --git a/packages/e2e-tests/src/utils/networkManager.ts b/packages/e2e-tests/src/utils/networkManager.ts index 088b67db75..4ee0b4c082 100644 --- a/packages/e2e-tests/src/utils/networkManager.ts +++ b/packages/e2e-tests/src/utils/networkManager.ts @@ -3,92 +3,107 @@ import { Logger } from '../support/logger'; import allure from '@wdio/allure-reporter'; import { CDPSession } from 'puppeteer'; import { browser } from '@wdio/globals'; +import extensionUtils from './utils'; export class NetworkManager { private readonly NETWORK_ENABLE = 'Network.enable'; private static cdpSessions: CDPSession[] = []; finishWithResponseCode = async (urlPattern: string, responseCode: number): Promise => { - await browser.call(async () => { - const puppeteer = await browser.getPuppeteer(); - const targets = puppeteer - .targets() - .filter((target) => ['page', 'service_worker', 'other'].includes(target.type())); - targets.map(async (target) => { - const client: CDPSession = (await target.createCDPSession()) as unknown as CDPSession; - NetworkManager.cdpSessions.push(client); - await client.send('Fetch.enable', { - patterns: [{ urlPattern }] - }); - client.on('Fetch.requestPaused', async ({ requestId, request }) => { - Logger.log(`found request: ${request.url}, returning response code: ${responseCode} `); - await client.send('Fetch.fulfillRequest', { - requestId, - responseCode: Number(responseCode), - body: Buffer.from('{"__type": "Error"}').toString('base64') + if ((await extensionUtils.getBrowser()) !== 'firefox') { + await browser.call(async () => { + const puppeteer = await browser.getPuppeteer(); + const targets = puppeteer + .targets() + .filter((target) => ['page', 'service_worker', 'other'].includes(target.type())); + targets.map(async (target) => { + const client: CDPSession = (await target.createCDPSession()) as unknown as CDPSession; + NetworkManager.cdpSessions.push(client); + await client.send('Fetch.enable', { + patterns: [{ urlPattern }] + }); + client.on('Fetch.requestPaused', async ({ requestId, request }) => { + Logger.log(`found request: ${request.url}, returning response code: ${responseCode} `); + await client.send('Fetch.fulfillRequest', { + requestId, + responseCode: Number(responseCode), + body: Buffer.from('{"__type": "Error"}').toString('base64') + }); }); }); }); - }); + } else { + Logger.log('request interception not available in Firefox'); + } }; failRequest = async (urlPattern: string): Promise => { - await browser.call(async () => { - const puppeteer = await browser.getPuppeteer(); - const targets = puppeteer - .targets() - .filter((target) => ['page', 'service_worker', 'other'].includes(target.type())); - targets.map(async (target) => { - const client: CDPSession = (await target.createCDPSession()) as unknown as CDPSession; - NetworkManager.cdpSessions.push(client); - await client.send('Fetch.enable', { - patterns: [{ urlPattern }] - }); - client.on('Fetch.requestPaused', async ({ requestId, request }) => { - Logger.log(`found request: ${request.url}, failing request`); - await client.send('Fetch.failRequest', { - requestId, - errorReason: 'Failed' + if ((await extensionUtils.getBrowser()) !== 'firefox') { + await browser.call(async () => { + const puppeteer = await browser.getPuppeteer(); + const targets = puppeteer + .targets() + .filter((target) => ['page', 'service_worker', 'other'].includes(target.type())); + targets.map(async (target) => { + const client: CDPSession = (await target.createCDPSession()) as unknown as CDPSession; + NetworkManager.cdpSessions.push(client); + await client.send('Fetch.enable', { + patterns: [{ urlPattern }] + }); + client.on('Fetch.requestPaused', async ({ requestId, request }) => { + Logger.log(`found request: ${request.url}, failing request`); + await client.send('Fetch.failRequest', { + requestId, + errorReason: 'Failed' + }); }); }); }); - }); + } else { + Logger.log('request interception not available in Firefox'); + } }; logFailedRequests = async (): Promise => { - await browser.call(async () => { - const puppeteer = await browser.getPuppeteer(); - const targets = puppeteer - .targets() - .filter( - (target) => target.type() === 'page' || target.type() === 'service_worker' || target.type() === 'other' - ); - targets.map(async (target) => { - const client: CDPSession = (await target.createCDPSession()) as unknown as CDPSession; - NetworkManager.cdpSessions.push(client); - await client.send(this.NETWORK_ENABLE); - client.on('Network.responseReceived', async (request) => { - if (request.response.status >= 400) { - const requestPayload = await this.getRequestPostData(client, request.requestId); - const responseBody = await this.getResponseBody(client, request.requestId); - const approximateTimestamp = new Date().toString(); - const combinedFailedRequestInfo = `URL:\n${request.response.url}\n\nRESPONSE CODE:\n${request.response.status}\n\nAPPROXIMATE TIME:\n${approximateTimestamp}\n\nRESPONSE BODY:\n${responseBody}\n\nREQUEST PAYLOAD:\n${requestPayload}`; - allure.addAttachment('Failed request', combinedFailedRequestInfo, 'text/plain'); - console.error( - 'Failed request', - `URL: ${request.response.url} | RESPONSE CODE: ${request.response.status}` - ); - } + if ((await extensionUtils.getBrowser()) !== 'firefox') { + await browser.call(async () => { + const puppeteer = await browser.getPuppeteer(); + const targets = puppeteer + .targets() + .filter( + (target) => target.type() === 'page' || target.type() === 'service_worker' || target.type() === 'other' + ); + targets.map(async (target) => { + const client: CDPSession = (await target.createCDPSession()) as unknown as CDPSession; + NetworkManager.cdpSessions.push(client); + await client.send(this.NETWORK_ENABLE); + client.on('Network.responseReceived', async (request) => { + if (request.response.status >= 400) { + const requestPayload = await this.getRequestPostData(client, request.requestId); + const responseBody = await this.getResponseBody(client, request.requestId); + const approximateTimestamp = new Date().toString(); + const combinedFailedRequestInfo = `URL:\n${request.response.url}\n\nRESPONSE CODE:\n${request.response.status}\n\nAPPROXIMATE TIME:\n${approximateTimestamp}\n\nRESPONSE BODY:\n${responseBody}\n\nREQUEST PAYLOAD:\n${requestPayload}`; + allure.addAttachment('Failed request', combinedFailedRequestInfo, 'text/plain'); + console.error( + 'Failed request', + `URL: ${request.response.url} | RESPONSE CODE: ${request.response.status}` + ); + } + }); }); }); - }); + } else { + Logger.log('requests logging not available in Firefox'); + } }; closeOpenedCdpSessions = async (): Promise => { - NetworkManager.cdpSessions.map(async (session) => { - if (session.connection()) await session.detach(); - }); - NetworkManager.cdpSessions = []; + if ((await extensionUtils.getBrowser()) !== 'firefox') { + NetworkManager.cdpSessions.map(async (session) => { + if (session.connection()) await session.detach(); + }); + NetworkManager.cdpSessions = []; + } }; private getRequestPostData = async (client: any, requestId: any): Promise => { diff --git a/packages/e2e-tests/wdio.conf.base.ts b/packages/e2e-tests/wdio.conf.base.ts index 90289a4792..eb7b67b49c 100755 --- a/packages/e2e-tests/wdio.conf.base.ts +++ b/packages/e2e-tests/wdio.conf.base.ts @@ -6,7 +6,7 @@ import { Logger } from './src/support/logger'; export const config: WebdriverIO.Config = { runner: 'local', - specs: ['./src/features/**/*.feature'], + specs: [['./src/features/**/*.feature']], suites: { batch1: [ './src/features/Onboarding*.feature', @@ -146,7 +146,7 @@ export const config: WebdriverIO.Config = { tags: extensionUtils.isMainnet() ? '@Mainnet' : '@Testnet', tagsInTitle: true, timeout: 200_000, - retry: 1, + retry: 0, noStrictFlaky: true } as WebdriverIO.CucumberOpts, async onPrepare() { diff --git a/packages/e2e-tests/wdio.conf.firefox.ts b/packages/e2e-tests/wdio.conf.firefox.ts new file mode 100755 index 0000000000..bb9cea974c --- /dev/null +++ b/packages/e2e-tests/wdio.conf.firefox.ts @@ -0,0 +1,43 @@ +/* eslint-disable no-undef */ +/* eslint-disable unicorn/prefer-module */ + +import { config as baseConfig } from './wdio.conf.base'; + +if (!process.env.FIREFOX_BINARY) { + throw new Error('Environment variable FIREFOX_BINARY is not set. Please set it before running tests.'); +} + +const firefoxConfig = { + capabilities: [ + { + maxInstances: 1, + browserName: 'firefox', + ...(String(process.env.STANDALONE_DRIVER) === 'true' && { hostname: 'localhost' }), + ...(String(process.env.STANDALONE_DRIVER) === 'true' && { port: 4444 }), + 'moz:debuggerAddress': true, + 'moz:firefoxOptions': { + binary: process.env.FIREFOX_BINARY, + args: [] + } + } + ], + services: [ + [ + 'firefox-profile', + { + extensions: [`${import.meta.dirname}/../../apps/browser-extension-wallet/dist`], + 'xpinstall.signatures.required': false + } + ] + ] +}; + +if (String(process.env.STANDALONE_DRIVER) === 'true') { + fetch('http://127.0.0.1:4444/wd/hub').catch(() => { + throw new Error("geckodriver doesn't seem to be running, please start it first"); + }); +} + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +export const config: WebdriverIO.Config = { ...baseConfig, ...firefoxConfig }; diff --git a/yarn.lock b/yarn.lock index f738537472..07b75f3059 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13819,6 +13819,7 @@ __metadata: "@wdio/config": 8.40.6 "@wdio/cucumber-framework": 8.40.6 "@wdio/devtools-service": 8.40.6 + "@wdio/firefox-profile-service": 8.40.6 "@wdio/local-runner": 8.40.6 "@wdio/spec-reporter": 8.40.6 "@wdio/types": 8.40.6 @@ -26456,6 +26457,16 @@ __metadata: languageName: node linkType: hard +"@wdio/firefox-profile-service@npm:8.40.6": + version: 8.40.6 + resolution: "@wdio/firefox-profile-service@npm:8.40.6" + dependencies: + "@wdio/types": 8.40.6 + firefox-profile: ^4.5.0 + checksum: c13970bc09d741fad07777c8b13ce457cd9cf3b6246b2713b462e80506486aabea16898ce792ea32f26fe80b0c8e57e1f376649a39daec883fc768a83b02390e + languageName: node + linkType: hard + "@wdio/globals@npm:8.40.6": version: 8.40.6 resolution: "@wdio/globals@npm:8.40.6" @@ -38346,6 +38357,21 @@ __metadata: languageName: node linkType: hard +"firefox-profile@npm:^4.5.0": + version: 4.7.0 + resolution: "firefox-profile@npm:4.7.0" + dependencies: + adm-zip: ~0.5.x + fs-extra: ^11.2.0 + ini: ^4.1.3 + minimist: ^1.2.8 + xml2js: ^0.6.2 + bin: + firefox-profile: lib/cli.js + checksum: 79ad4beebac44a80195c433be1142712b7af4867f0b6aa29b1c18d89cdf99c3b5887c49bab949ca6b4503052aa694d79d6140a2215b399861fb5b1ec1cf3c301 + languageName: node + linkType: hard + "first-chunk-stream@npm:3.0.0, first-chunk-stream@npm:^3.0.0": version: 3.0.0 resolution: "first-chunk-stream@npm:3.0.0" @@ -38741,6 +38767,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.2.0": + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: f983c706e0c22b0c0747a8e9c76aed6f391ba2d76734cf2757cd84da13417b402ed68fe25bace65228856c61d36d3b41da198f1ffbf33d0b34283a2f7a62c6e9 + languageName: node + linkType: hard + "fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" @@ -41294,6 +41331,13 @@ __metadata: languageName: node linkType: hard +"ini@npm:^4.1.3": + version: 4.1.3 + resolution: "ini@npm:4.1.3" + checksum: 004b2be42388877c58add606149f1a0c7985c90a0ba5dbf45a4738fdc70b0798d922caecaa54617029626505898ac451ff0537a08b949836b49d3267f66542c9 + languageName: node + linkType: hard + "init-package-json@npm:^5.0.0": version: 5.0.0 resolution: "init-package-json@npm:5.0.0" @@ -62603,6 +62647,16 @@ __metadata: languageName: node linkType: hard +"xml2js@npm:^0.6.2": + version: 0.6.2 + resolution: "xml2js@npm:0.6.2" + dependencies: + sax: ">=0.6.0" + xmlbuilder: ~11.0.0 + checksum: 458a83806193008edff44562c0bdb982801d61ee7867ae58fd35fab781e69e17f40dfeb8fc05391a4648c9c54012066d3955fe5d993ffbe4dc63399023f32ac2 + languageName: node + linkType: hard + "xml@npm:^1.0.1": version: 1.0.1 resolution: "xml@npm:1.0.1"