diff --git a/packages/wallets/src/metamask/metamask.page.ts b/packages/wallets/src/metamask/metamask.page.ts index 089e727a..3797f763 100644 --- a/packages/wallets/src/metamask/metamask.page.ts +++ b/packages/wallets/src/metamask/metamask.page.ts @@ -1,10 +1,15 @@ import { WalletConfig } from '../wallets.constants'; import { WalletPage } from '../wallet.page'; import expect from 'expect'; -import { test, BrowserContext, Page } from '@playwright/test'; +import { test, BrowserContext, Page, Locator } from '@playwright/test'; export class MetamaskPage implements WalletPage { page: Page | undefined; + networkDisplay: Locator; + networkDisplayDialog: Locator; + networkDisplayCloseBtn: Locator; + networkItemBtn: Locator; + networkItemText: Locator; constructor( private browserContext: BrowserContext, @@ -12,9 +17,22 @@ export class MetamaskPage implements WalletPage { public config: WalletConfig, ) {} + async initLocators() { + this.networkDisplay = this.page.getByTestId('network-display'); + this.networkDisplayDialog = this.page.locator('[role = "dialog"]'); + this.networkDisplayCloseBtn = this.networkDisplayDialog + .locator('[aria-label="Close"]') + .first(); + + this.networkItemBtn = + this.networkDisplayDialog.locator('div[role="button"]'); + this.networkItemText = this.networkItemBtn.locator('p'); + } + async navigate() { await test.step('Navigate to metamask', async () => { this.page = await this.browserContext.newPage(); + await this.initLocators(); await this.page.goto( this.extensionUrl + this.config.COMMON.EXTENSION_START_PATH, { waitUntil: 'load' }, @@ -23,7 +41,7 @@ export class MetamaskPage implements WalletPage { .locator('button[data-testid="app-header-logo"]') .waitFor({ state: 'visible' }); await this.unlock(); - if (await this.page.getByTestId('network-display').isVisible()) { + if (await this.networkDisplay.isVisible()) { await this.closePopover(); } }); @@ -38,7 +56,7 @@ export class MetamaskPage implements WalletPage { // added explicit route to #onboarding due to unexpected first time route from /home.html to /onboarding -> page is close await this.navigate(); if (!this.page) throw "Page isn't ready"; - if (!(await this.page.getByTestId('network-display').isVisible())) { + if (!(await this.networkDisplay.isVisible())) { await this.firstTimeSetup(); } }); @@ -159,6 +177,37 @@ export class MetamaskPage implements WalletPage { await this.page.close(); } + async setupNetwork(standConfig: Record) { + const networkDisplayText = await this.networkDisplay.textContent(); + + if (!networkDisplayText.includes(standConfig.chainName)) { + await this.networkDisplay.click(); + + const networkListText = await this.getNetworkListText(); + if (networkListText.includes(standConfig.chainName)) { + await this.networkItemBtn.getByText(standConfig.chainName).click(); + } else { + await this.networkDisplayCloseBtn.click(); + await this.addNetwork( + standConfig.chainName, + standConfig.rpcUrl, + standConfig.chainId, + standConfig.tokenSymbol, + standConfig.scan, + ); + } + } + } + + async getNetworkListText() { + const networkList = await this.networkItemText.all(); + return Promise.all( + networkList.map(async (networkType) => { + return await networkType.textContent(); + }), + ); + } + async addNetwork( networkName: string, networkUrl: string, diff --git a/packages/wallets/src/wallet.page.ts b/packages/wallets/src/wallet.page.ts index 6600de6d..f0476e04 100644 --- a/packages/wallets/src/wallet.page.ts +++ b/packages/wallets/src/wallet.page.ts @@ -31,6 +31,8 @@ export interface WalletPage { getWalletAddress?(): Promise; + setupNetwork?(standConfig: Record): Promise; + addNetwork( networkName: string, networkUrl: string,