diff --git a/packages/e2e-tests/src/assert/nftAssert.ts b/packages/e2e-tests/src/assert/nftAssert.ts index 40986c3c62..04157e168f 100644 --- a/packages/e2e-tests/src/assert/nftAssert.ts +++ b/packages/e2e-tests/src/assert/nftAssert.ts @@ -11,6 +11,7 @@ import testContext from '../utils/testContext'; import { Asset } from '../data/Asset'; import adaHandleAssert from './adaHandleAssert'; import { scrollToTheTop } from '../utils/scrollUtils'; +import NftsCommon from '../elements/NFTs/nftsCommon'; use(chaiSorted); @@ -23,7 +24,9 @@ class NftAssert { } async assertCounterNumberMatchesWalletNFTs() { - const nftsNumber = await NftsPage.nftContainers.length; + const nftsNumber = ( + await NftsCommon.getAllNftNamesWithScroll(`${NftsPage.LIST_CONTAINER} ${NftsPage.NFT_CONTAINER}`) + ).length; const tokensCounterValue = Number((await NftsPage.counter.getText()).slice(1, -1)); expect(nftsNumber).to.equal(tokensCounterValue); } @@ -118,13 +121,11 @@ class NftAssert { } async assertNftDisplayedOnNftsPage(nftName: string, shouldBeDisplayed: boolean) { - if (shouldBeDisplayed) { + try { await NftsPage.waitForNft(nftName); - } else { - try { - await NftsPage.waitForNft(nftName); - } catch { - await scrollToTheTop(NftsPage.NFT_CONTAINER); + } catch { + if (!shouldBeDisplayed) { + await scrollToTheTop(`${NftsPage.LIST_CONTAINER} ${NftsPage.NFT_CONTAINER}`); } } const nftItem = await NftsPage.getNftContainer(nftName); diff --git a/packages/e2e-tests/src/assert/nftCreateFolderAssert.ts b/packages/e2e-tests/src/assert/nftCreateFolderAssert.ts index 751fc1212b..3a8b3c4e3a 100644 --- a/packages/e2e-tests/src/assert/nftCreateFolderAssert.ts +++ b/packages/e2e-tests/src/assert/nftCreateFolderAssert.ts @@ -12,7 +12,8 @@ import YoullHaveToStartAgainModal from '../elements/NFTs/youllHaveToStartAgainMo import NftsFolderPage from '../elements/NFTs/nftsFolderPage'; import adaHandleAssert from './adaHandleAssert'; import { browser } from '@wdio/globals'; -import { scrollToWithYOffset } from '../utils/scrollUtils'; +import { scrollToTheTop } from '../utils/scrollUtils'; +import NftsCommon from '../elements/NFTs/nftsCommon'; class NftCreateFolderAssert { async assertSeeCreateFolderButton(shouldSee: boolean, mode: 'extended' | 'popup') { @@ -99,30 +100,12 @@ class NftCreateFolderAssert { async verifySeeAllOwnedNfts() { const ownedNftNames = testContext.load('ownedNfts'); - const displayedNftNames: string[] = []; - let previousFirstVisibleNft = ''; - let hasMoreNftsToScroll = true; - while (hasMoreNftsToScroll) { - const displayedNfts = await TokenSelectionPage.nftContainers; + await scrollToTheTop(`${TokenSelectionPage.ASSET_SELECTOR_CONTAINER} ${TokenSelectionPage.NFT_CONTAINER}`); // make sure we are starting from the top - for (const nftContainer of displayedNfts) { - const nftName = await nftContainer.getText(); - if (!displayedNftNames.includes(nftName)) { - displayedNftNames.push(nftName); - } - } - - const firstVisibleNft = displayedNfts.length > 0 ? await displayedNfts[0].getText() : 'not_found'; - if (firstVisibleNft === previousFirstVisibleNft) { - hasMoreNftsToScroll = false; - } else { - previousFirstVisibleNft = firstVisibleNft; - const lastNft = displayedNfts[displayedNfts.length - 1]; - await scrollToWithYOffset(lastNft, 30); - await browser.pause(300); - } - } + const displayedNftNames = await NftsCommon.getAllNftNamesWithScroll( + `${TokenSelectionPage.ASSET_SELECTOR_CONTAINER} ${TokenSelectionPage.NFT_CONTAINER}` + ); expect(ownedNftNames).to.have.ordered.members(displayedNftNames); } diff --git a/packages/e2e-tests/src/elements/NFTs/nftSelectNftsPage.ts b/packages/e2e-tests/src/elements/NFTs/nftSelectNftsPage.ts index 519af5a21d..636bd0f81e 100644 --- a/packages/e2e-tests/src/elements/NFTs/nftSelectNftsPage.ts +++ b/packages/e2e-tests/src/elements/NFTs/nftSelectNftsPage.ts @@ -4,7 +4,7 @@ import SearchInput from '../searchInput'; import { browser } from '@wdio/globals'; import { ChainablePromiseArray } from 'webdriverio/build/types'; import { ChainablePromiseElement } from 'webdriverio'; -import { scrollDownWithOffset, scrollToWithYOffset } from '../../utils/scrollUtils'; +import { scrollDownWithOffset } from '../../utils/scrollUtils'; class NftSelectNftsPage extends CommonDrawerElements { private COUNTER = '[data-testid="assets-counter"]'; @@ -81,16 +81,29 @@ class NftSelectNftsPage extends CommonDrawerElements { } async selectNFTs(numberOfNFTs: number) { - for (let i = 0; i < numberOfNFTs; i++) { - if (i === 5) { - const nft = await this.nfts[i]; - if (nft) { - await browser.pause(200); - await scrollToWithYOffset(nft, 30); + let selectedCount = 0; + + while (selectedCount < numberOfNFTs) { + const nfts = await this.nfts; + + for (const nft of nfts) { + const isSelected = await nft.$(this.NFT_ITEM_SELECTED_CHECKMARK).isExisting(); + if (isSelected) { + continue; } + + await nft.waitForClickable(); + await nft.click(); + selectedCount++; + + if (selectedCount >= numberOfNFTs) { + return; + } + } + + if (selectedCount < numberOfNFTs) { + await scrollDownWithOffset(nfts); } - await this.nfts[i].waitForClickable(); - await this.nfts[i].click(); } } diff --git a/packages/e2e-tests/src/elements/NFTs/nftsCommon.ts b/packages/e2e-tests/src/elements/NFTs/nftsCommon.ts new file mode 100644 index 0000000000..5c0217eaee --- /dev/null +++ b/packages/e2e-tests/src/elements/NFTs/nftsCommon.ts @@ -0,0 +1,40 @@ +/* eslint-disable no-undef */ +import { scrollToWithYOffset } from '../../utils/scrollUtils'; +import { browser } from '@wdio/globals'; + +class NftsCommon { + async getAllNftNamesWithScroll(elementSelector: string): Promise { + const nftNames: string[] = []; + let nftElements = await $$(elementSelector); + let lastNft = nftElements[nftElements.length - 1]; + let lastNftName = await lastNft.getText(); + let hasMoreItems = true; + + while (hasMoreItems) { + for (const nftElement of nftElements) { + const nftName = await nftElement.getText(); + if (!nftNames.includes(nftName)) { + nftNames.push(nftName); + } + } + + await scrollToWithYOffset(lastNft, 100); + await browser.pause(200); + + nftElements = await $$(elementSelector); + const newLastNft = nftElements[nftElements.length - 1]; + const newLastNftName = await newLastNft.getText(); + + if (newLastNftName === lastNftName) { + hasMoreItems = false; + } else { + lastNft = newLastNft; + lastNftName = newLastNftName; + } + } + + return nftNames; + } +} + +export default new NftsCommon(); diff --git a/packages/e2e-tests/src/elements/NFTs/nftsPage.ts b/packages/e2e-tests/src/elements/NFTs/nftsPage.ts index 9d43daefeb..388e1269f8 100644 --- a/packages/e2e-tests/src/elements/NFTs/nftsPage.ts +++ b/packages/e2e-tests/src/elements/NFTs/nftsPage.ts @@ -5,9 +5,10 @@ import { ChainablePromiseElement } from 'webdriverio'; import testContext from '../../utils/testContext'; import { browser } from '@wdio/globals'; import { scrollDownWithOffset } from '../../utils/scrollUtils'; +import NftsCommon from './nftsCommon'; class NftsPage { - protected LIST_CONTAINER = '[data-testid="nft-list-container"]'; + public LIST_CONTAINER = '[data-testid="nft-list-container"]'; private CREATE_FOLDER_BUTTON = '[data-testid="create-folder-button"]'; private NFT_SEARCH_INPUT = '[data-testid="nft-search-input"]'; public NFT_CONTAINER = '[data-testid="nft-item"]'; @@ -85,12 +86,8 @@ class NftsPage { } async saveNfts(): Promise { - const names: string[] = []; - - for (const nftContainer of await this.nftContainers) { - names.push(await nftContainer.getText()); - } - testContext.save('ownedNfts', names); + const ownedNfts = await NftsCommon.getAllNftNamesWithScroll(`${this.LIST_CONTAINER} ${this.NFT_NAME}`); + testContext.save('ownedNfts', ownedNfts); } async waitForNft(nftName: string) { diff --git a/packages/e2e-tests/src/elements/newTransaction/tokenSelectionPage.ts b/packages/e2e-tests/src/elements/newTransaction/tokenSelectionPage.ts index 536465bcf0..5cb2da2c19 100644 --- a/packages/e2e-tests/src/elements/newTransaction/tokenSelectionPage.ts +++ b/packages/e2e-tests/src/elements/newTransaction/tokenSelectionPage.ts @@ -11,8 +11,8 @@ class TokenSelectionPage extends CommonDrawerElements { private TOKENS_BUTTON = '//input[@data-testid="asset-selector-button-tokens"]'; private TOKEN_ROW = '//div[@data-testid="coin-search-row"]'; private NFTS_BUTTON = '//input[@data-testid="asset-selector-button-nfts"]'; - private ASSET_SELECTOR_CONTAINER = '[data-testid="asset-selector"]'; - private NFT_CONTAINER = '[data-testid="nft-item"]'; + public ASSET_SELECTOR_CONTAINER = '[data-testid="asset-selector"]'; + public NFT_CONTAINER = '[data-testid="nft-item"]'; private NFT_ITEM_NAME = '[data-testid="nft-item-name"]'; private NFT_ITEM_OVERLAY = '[data-testid="nft-item-overlay"]'; private NFT_ITEM_SELECTED_CHECKMARK = '[data-testid="nft-item-selected"]'; @@ -135,8 +135,12 @@ class TokenSelectionPage extends CommonDrawerElements { }; addAmountOfAssets = async (amount: number, assetType: string) => { - for (let i = 1; i <= amount; i++) { - assetType === 'Tokens' ? await this.tokenItem(i).container.click() : await this.nftNames[i].click(); + if (assetType === 'Tokens') { + for (let i = 1; i <= amount; i++) { + await this.tokenItem(i).container.click(); + } + } else { + await this.selectNFTs(amount); } }; @@ -220,6 +224,33 @@ class TokenSelectionPage extends CommonDrawerElements { } ); } + + async selectNFTs(numberOfNFTs: number) { + let selectedCount = 0; + + while (selectedCount < numberOfNFTs) { + const nfts = await this.nftContainers; + + for (const nft of nfts) { + const isSelected = await nft.$(this.NFT_ITEM_SELECTED_CHECKMARK).isExisting(); + if (isSelected) { + continue; + } + + await nft.waitForClickable(); + await nft.click(); + selectedCount++; + + if (selectedCount >= numberOfNFTs) { + return; + } + } + + if (selectedCount < numberOfNFTs) { + await scrollDownWithOffset(nfts); + } + } + } } export default new TokenSelectionPage(); diff --git a/packages/e2e-tests/src/pageobject/newTransactionExtendedPageObject.ts b/packages/e2e-tests/src/pageobject/newTransactionExtendedPageObject.ts index bfc958669c..92aaaea4b0 100644 --- a/packages/e2e-tests/src/pageobject/newTransactionExtendedPageObject.ts +++ b/packages/e2e-tests/src/pageobject/newTransactionExtendedPageObject.ts @@ -5,6 +5,7 @@ import extensionUtils from '../utils/utils'; import { byron, shelley } from '../data/AddressData'; import { AssetInput } from '../elements/newTransaction/assetInput'; import { AddressInput } from '../elements/AddressInput'; +import NftsCommon from '../elements/NFTs/nftsCommon'; export default new (class NewTransactionExtendedPageObject { async setTwoAssetsForBundle(bundleIndex: number, assetValue1: number, assetValue2: number) { @@ -77,7 +78,9 @@ export default new (class NewTransactionExtendedPageObject { async addAllAvailableNftTypes(bundleIndex: number) { await new AssetInput(bundleIndex).clickAddAssetButton(); await TokenSelectionPage.clickNFTsButton(); - const nftNames = await TokenSelectionPage.getNftNames(); + const nftNames = await NftsCommon.getAllNftNamesWithScroll( + `${TokenSelectionPage.ASSET_SELECTOR_CONTAINER} ${TokenSelectionPage.NFT_CONTAINER}` + ); let nftsCount = nftNames.length; for (const nftName of nftNames) { nftsCount--; diff --git a/packages/e2e-tests/src/steps/nftsCommonSteps.ts b/packages/e2e-tests/src/steps/nftsCommonSteps.ts index 202e0f1895..309e27461f 100644 --- a/packages/e2e-tests/src/steps/nftsCommonSteps.ts +++ b/packages/e2e-tests/src/steps/nftsCommonSteps.ts @@ -132,7 +132,7 @@ Then(/^A gallery view showing my NFTs is displayed$/, async () => { }); Then(/^Verify that "([^"]*)" (contains|doesn't contain) fallback image$/, async (nftName: string, contains: string) => { - await NftsPage.nftContainer.waitForDisplayed({ timeout: 15_000 }); + await NftsPage.waitForNft(nftName); await nftAssert.assertNftFallbackImage(nftName, contains === 'contains'); });