From 8fc2bdfa18eb1c028ceabb90207e7d2b012161a0 Mon Sep 17 00:00:00 2001 From: nesrineabdmouleh Date: Wed, 29 May 2024 15:53:42 +0200 Subject: [PATCH 1/6] Refacto cart interface --- src/interfaces/FO/cart/index.ts | 31 +++++++++++++++++++ .../develop/pages/FO/classic/cart/index.ts | 14 ++++----- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/interfaces/FO/cart/index.ts b/src/interfaces/FO/cart/index.ts index 4263c3c6..34a90ae0 100644 --- a/src/interfaces/FO/cart/index.ts +++ b/src/interfaces/FO/cart/index.ts @@ -1,8 +1,39 @@ import {FOBasePagePageInterface} from '@interfaces/FO'; +import type {ProductAttribute} from '@data/types/product'; import type {Page} from '@playwright/test'; export interface FoCartPageInterface extends FOBasePagePageInterface { + readonly alertChooseDeliveryAddressWarningText: string; + readonly cartRuleAlertMessageText: string; + readonly cartRuleAlreadyInYourCartErrorText: string; + readonly cartRuleAlreadyUsedErrorText: string; + readonly cartRuleLimitUsageErrorText: string; + readonly cartRuleMustEnterVoucherErrorText: string; + readonly cartRuleNotExistingErrorText: string; + readonly noItemsInYourCartMessage: string; readonly pageTitle: string; + addPromoCode(page: Page, code: string, clickOnPromoCodeLink?: boolean): Promise; clickOnProceedToCheckout(page: Page): Promise; + clickOnPromoCode(page: Page): Promise; + deleteProduct(page: Page, productID: number): Promise; + editProductQuantity(page: Page, productID: number, quantity: number | string): Promise; + getATIPrice(page: Page): Promise; + getAlertWarning(page: Page): Promise; + getAlertWarningForPromoCode(page: Page): Promise; + getCartRuleErrorMessage(page: Page): Promise; + getCartRuleName(page: Page, line?: number): Promise; + getDiscountValue(page: Page, line?: number): Promise; + getHighlightPromoCode(page: Page): Promise; + getNoItemsInYourCartMessage(page: Page): Promise; + getNotificationMessage(page: Page): Promise; + getProductAttributes(page: Page, row: number): Promise; + getProductDetail(page: Page, row: number): Promise; + getProductsNumber(page: Page): Promise; + getSubtotalDiscountValue(page: Page): Promise; + isAlertWarningForMinimumPurchaseVisible(page: Page): Promise; + isCartRuleNameVisible(page: Page, line?: number): Promise; + isProceedToCheckoutButtonDisabled(page: Page): Promise; + removeVoucher(page: Page, line?: number): Promise; + setProductQuantity(page: Page, productRow?: number, quantity?: number): Promise; } diff --git a/src/versions/develop/pages/FO/classic/cart/index.ts b/src/versions/develop/pages/FO/classic/cart/index.ts index 26c5dd76..3d216b4d 100644 --- a/src/versions/develop/pages/FO/classic/cart/index.ts +++ b/src/versions/develop/pages/FO/classic/cart/index.ts @@ -337,7 +337,7 @@ class CartPage extends FOBasePage implements FoCartPageInterface { * @param page {Page} Browser tab * @returns {boolean} */ - isProceedToCheckoutButtonDisabled(page: Page): Promise { + async isProceedToCheckoutButtonDisabled(page: Page): Promise { return this.elementVisible(page, this.disabledProceedToCheckoutButton, 1000); } @@ -346,7 +346,7 @@ class CartPage extends FOBasePage implements FoCartPageInterface { * @param page {Page} Browser tab * @returns {boolean} */ - isAlertWarningForMinimumPurchaseVisible(page: Page): Promise { + async isAlertWarningForMinimumPurchaseVisible(page: Page): Promise { return this.elementVisible(page, this.alertWarning, 1000); } @@ -355,7 +355,7 @@ class CartPage extends FOBasePage implements FoCartPageInterface { * @param page {Page} Browser tab * @returns {Promise} */ - getAlertWarning(page: Page): Promise { + async getAlertWarning(page: Page): Promise { return this.getTextContent(page, this.alertWarning); } @@ -364,7 +364,7 @@ class CartPage extends FOBasePage implements FoCartPageInterface { * @param page {Page} Browser tab * @returns {Promise} */ - getAlertWarningForPromoCode(page: Page): Promise { + async getAlertWarningForPromoCode(page: Page): Promise { return this.getTextContent(page, this.alertPromoCode); } @@ -374,7 +374,7 @@ class CartPage extends FOBasePage implements FoCartPageInterface { * @param line {number} Cart summary line * @returns {Promise} */ - isCartRuleNameVisible(page: Page, line: number = 1): Promise { + async isCartRuleNameVisible(page: Page, line: number = 1): Promise { return this.elementVisible(page, this.cartRuleName(line), 1000); } @@ -419,7 +419,7 @@ class CartPage extends FOBasePage implements FoCartPageInterface { * @param line {number} Cart summary line * @returns {Promise} */ - getCartRuleName(page: Page, line: number = 1): Promise { + async getCartRuleName(page: Page, line: number = 1): Promise { return this.getTextContent(page, this.cartRuleName(line)); } @@ -438,7 +438,7 @@ class CartPage extends FOBasePage implements FoCartPageInterface { * @param line {number} Cart summary line * @returns {Promise} */ - getDiscountValue(page: Page, line: number = 1): Promise { + async getDiscountValue(page: Page, line: number = 1): Promise { return this.getPriceFromText(page, this.discountValue(line), 2000); } From 3ef3cc6f44a0a154f31f62cd191b28cae381777c Mon Sep 17 00:00:00 2001 From: nesrineabdmouleh Date: Wed, 29 May 2024 15:53:53 +0200 Subject: [PATCH 2/6] Refacto home interface --- src/interfaces/FO/home/index.ts | 40 +++++++++++++++++++ .../develop/pages/FO/classic/home/index.ts | 3 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/interfaces/FO/home/index.ts b/src/interfaces/FO/home/index.ts index bb252a2a..9198bc1d 100644 --- a/src/interfaces/FO/home/index.ts +++ b/src/interfaces/FO/home/index.ts @@ -1,10 +1,50 @@ import {FOBasePagePageInterface} from '@interfaces/FO'; +// Import data +import type {CartProductDetails} from '@data/types/cart'; +import type {ProductAttribute} from '@data/types/product'; + import type {Page} from '@playwright/test'; export interface FoHomePageInterface extends FOBasePagePageInterface { + readonly pageTitle: string; + readonly successAddToCartMessage: string; + addProductToCartByQuickView(page: Page, id: number, quantityWanted?: number): Promise; + addToCartByQuickView(page: Page): Promise; + changeAttributes(page: Page, attributes: ProductAttribute): Promise; + changeAttributesAndAddToCart(page: Page, attributes: ProductAttribute[], quantity: number): Promise; + changeQuantity(page: Page, quantity: number): Promise; + clickOnLeftOrRightArrow(page: Page, direction: string): Promise; + closeBlockCartModal(page: Page): Promise; + closeQuickViewModal(page: Page): Promise; + continueShopping(page: Page): Promise; + getBlockTitle(page: Page, blockID?: number): Promise; + getProductAttributesFromBlockCartModal(page: Page): Promise; + getProductAttributesFromQuickViewModal(page: Page): Promise; + getProductAvailabilityText(page: Page): Promise; + getProductDetailsFromBlockCartModal(page: Page): Promise; + getProductDetailsFromQuickViewModal(page: Page): Promise; + getProductWithDiscountDetailsFromQuickViewModal(page: Page): Promise; + getProductsBlockNumber(page: Page, blockID?: number): Promise; + getProductsNumber(page: Page): Promise + getSelectedAttributesFromQuickViewModal(page: Page, attribute: ProductAttribute): Promise; + getSliderURL(page: Page): Promise; + getSocialSharingLink(page: Page, socialSharing: string): Promise; + goToAllProductsBlockPage(page: Page, blockID?: number): Promise; goToAllProductsPage(page: Page): Promise; goToProductPage(page: Page, id: number): Promise; + isAddToCartButtonDisabled(page: Page): Promise; + isAddToCartButtonEnabled(page: Page): Promise; + isBannerVisible(page: Page): Promise; + isBlockCartModalVisible(page: Page): Promise; + isCustomTextBlockVisible(page: Page): Promise; isHomePage(page: Page): Promise; + isNewFlagVisible(page: Page, id?: number): Promise; + isPriceVisible(page: Page, id?: number): Promise; + isQuickViewProductModalVisible(page: Page): Promise; + isSliderVisible(page: Page, position: number): Promise; proceedToCheckout(page: Page): Promise; + quickViewProduct(page: Page, id: number): Promise; + selectProductColor(page: Page, id: number, color: string): Promise; + subscribeToNewsletter(page: Page, email: string): Promise; } diff --git a/src/versions/develop/pages/FO/classic/home/index.ts b/src/versions/develop/pages/FO/classic/home/index.ts index 99ed1844..c18d381b 100644 --- a/src/versions/develop/pages/FO/classic/home/index.ts +++ b/src/versions/develop/pages/FO/classic/home/index.ts @@ -775,7 +775,7 @@ class HomePage extends FOBasePage implements FoHomePageInterface { * @param page {Page} Browser tab * @returns {Promise} */ - isBlockCartModalVisible(page: Page): Promise { + async isBlockCartModalVisible(page: Page): Promise { return this.elementVisible(page, this.blockCartModalDiv, 2000); } @@ -831,6 +831,7 @@ class HomePage extends FOBasePage implements FoHomePageInterface { */ async continueShopping(page: Page): Promise { await this.waitForSelectorAndClick(page, this.continueShoppingButton); + return this.elementNotVisible(page, this.blockCartModalDiv, 2000); } From 01c1e9feda9e6329117fddcd58c5505465c1b0cc Mon Sep 17 00:00:00 2001 From: nesrineabdmouleh Date: Wed, 29 May 2024 15:54:17 +0200 Subject: [PATCH 3/6] Refacto product and common page interface --- src/interfaces/FO/product/index.ts | 8 ++--- src/interfaces/index.ts | 49 ++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/interfaces/FO/product/index.ts b/src/interfaces/FO/product/index.ts index fc0f6302..836d5668 100644 --- a/src/interfaces/FO/product/index.ts +++ b/src/interfaces/FO/product/index.ts @@ -17,10 +17,10 @@ export interface FoProductPageInterface extends FOBasePagePageInterface { addProductReview(page: Page, productReviewData: FakerProductReview): Promise; addProductToTheCart( page: Page, - quantity: number | string, - combination: ProductAttribute[], - proceedToCheckout: boolean | null, - customizedText: string) + quantity?: number | string, + combination?: ProductAttribute[], + proceedToCheckout?: boolean | null, + customizedText?: string) : Promise clickAddReviewButton(page: Page): Promise; clickOnAddToCartButton(page: Page): Promise; diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index b0c8e8c6..5ac8c37a 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -1,14 +1,57 @@ -import type {PageWaitForSelectorOptionsState} from '@data/types/playwright'; -import type {BrowserContext, Frame, Page} from '@playwright/test'; +import type {PageWaitForSelectorOptionsState, WaitForNavigationWaitUntil} from '@data/types/playwright'; +import type { + BrowserContext, ElementHandle, Frame, JSHandle, Locator, Page, +} from '@playwright/test'; export interface CommonPageInterface { changePage(browserContext: BrowserContext, tabId?: number): Promise; + clearInput(page: Frame | Page, selector: string): Promise; + clickAndWaitForDownload(page: Page, selector: string, targetBlank?: boolean): Promise; + clickAndWaitForLoadState(page: Frame | Page, selector: string, state?: string, timeout?: number): Promise; + clickAndWaitForURL(page: Frame | Page, selector: string, waitUntil?: WaitForNavigationWaitUntil, timeout?: number) + : Promise closePage(browserContext: BrowserContext, page: Page, tabId?: number): Promise; + dialogListener(page: Page, accept?: boolean, text?: string): Promise; + dragAndDrop(page: Page, source: string, target: string): Promise; + elementNotVisible(page: Frame | Page, selector: string, timeout?: number): Promise; + elementVisible(page: Frame | Page, selector: string, timeout?: number): Promise; + getAttributeContent(page: Frame | Page, selector: string, attribute: string): Promise; + getClipboardText(page: Page): Promise; + getCurrentURL(page: Page): Promise; + getInputValue(page: Page, selector: string): Promise; + getNumberFromText(page: Page | Frame, selector: string, timeout?: number): Promise; getPageTitle(page: Page): Promise; + getParentElement(page: Frame | Page, selector: string) + : Promise | JSHandle | JSHandle>; + getPriceFromText(page: Frame|Page, selector: string, timeout?: number, waitForSelector?: boolean): Promise; + getTextContent(page: Page | Frame, selector: string, waitForSelector?: boolean): Promise; goTo(page: Page, url: string): Promise; + goToBO(page: Page): Promise; goToFo(page: Page): Promise; + goToPreviousPage(page: Page, waitUntil?: WaitForNavigationWaitUntil): Promise; + isChecked(page: Frame | Page, selector: string): Promise; + isDisabled(page: Page, selector: string): Promise; + openLinkWithTargetBlank(page: Page, selector: string, newPageSelector?: string, state?:string): Promise; + reloadPage(page: Page): Promise; reloadPage(page: Page): Promise; resize(page: Page, mobileSize: boolean): Promise; - waitForSelector(page: Page | Frame, selector: string, state: PageWaitForSelectorOptionsState, timeout?: number): Promise + scrollTo(page: Page, selector: string): Promise; + selectByValue(page: Frame | Page, selector: string, valueToSelect: number|string, force?: boolean): Promise; + selectByVisibleText(page: Frame | Page, selector: string, textValue: string | number, force?: boolean,): Promise; + setChecked(page: Frame | Page, checkboxSelector: string, valueWanted?: boolean, force?: boolean): Promise; + setCheckedWithIcon(page: Frame | Page, checkboxSelector: string, valueWanted?: boolean): Promise; + setHiddenCheckboxValue(page: Frame | Page, checkboxSelector: string, valueWanted?: boolean): Promise; + setInputValue(page: Page, selector: string, value: string): Promise; + setValue(page: Frame | Page, selector: string, value: string | number): Promise; + uploadFile(page: Page | Frame, selector: string, filePath: string): Promise; + uploadOnFileChooser(page: Page, selector: string, filePath: string[]): Promise; + waitForAttachedSelector(page: Page, selector: string, timeout?: number): Promise; + waitForHiddenSelector(page: Frame | Page, selector: string, timeout?: number): Promise; + waitForPageTitleToLoad(page: Page): Promise; + waitForSelector(page: Page | Frame, selector: string, state: PageWaitForSelectorOptionsState, timeout?: number) + : Promise; waitForSelectorAndClick(page: Frame | Page, selector: string, timeout?: number): Promise + waitForSelectorAndClick(page: Frame | Page, selector: string, timeout?: number): Promise; + waitForVisibleLocator(locator: Locator, timeout?: number): Promise; + waitForVisibleSelector(page: Page | Frame, selector: string, timeout?: number): Promise; } From 1caf918aefa28c875efc3fbffe4db4eb11318449 Mon Sep 17 00:00:00 2001 From: nesrineabdmouleh Date: Wed, 29 May 2024 16:03:33 +0200 Subject: [PATCH 4/6] Delete duplicated method --- src/interfaces/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 5ac8c37a..c600e934 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -51,7 +51,6 @@ export interface CommonPageInterface { waitForSelector(page: Page | Frame, selector: string, state: PageWaitForSelectorOptionsState, timeout?: number) : Promise; waitForSelectorAndClick(page: Frame | Page, selector: string, timeout?: number): Promise - waitForSelectorAndClick(page: Frame | Page, selector: string, timeout?: number): Promise; waitForVisibleLocator(locator: Locator, timeout?: number): Promise; waitForVisibleSelector(page: Page | Frame, selector: string, timeout?: number): Promise; } From d9cf6ca51d0bd3c673e3f793777d85b7f173fb50 Mon Sep 17 00:00:00 2001 From: nesrineabdmouleh Date: Wed, 29 May 2024 22:40:28 +0200 Subject: [PATCH 5/6] Fix lint error --- src/pages/BO/catalog/products/index.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/pages/BO/catalog/products/index.ts b/src/pages/BO/catalog/products/index.ts index eb3227c2..7eac3bba 100644 --- a/src/pages/BO/catalog/products/index.ts +++ b/src/pages/BO/catalog/products/index.ts @@ -1,9 +1,17 @@ import type {BOProductsPageInterface} from '@interfaces/BO/catalog/products'; +import semver from 'semver'; +import testContext from '@utils/test'; + +const psVersion = testContext.getPSVersion(); /* eslint-disable global-require */ function requirePage(): BOProductsPageInterface { - return require('@versions/develop/pages/BO/catalog/products').productsPage; + if (semver.gte(psVersion, '0.0.0')) { + return require('@versions/develop/pages/BO/catalog/products').productsPage; + } + return require('@versions/develop/pages/BO/catalog/products'); } + /* eslint-enable global-require */ export default requirePage(); From b260f7d5c5dacb0a51aacb5b8866da4384c67e34 Mon Sep 17 00:00:00 2001 From: nesrineabdmouleh Date: Wed, 29 May 2024 23:24:37 +0200 Subject: [PATCH 6/6] Fix lint error --- src/pages/BO/catalog/products/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/BO/catalog/products/index.ts b/src/pages/BO/catalog/products/index.ts index 7eac3bba..181bdc8a 100644 --- a/src/pages/BO/catalog/products/index.ts +++ b/src/pages/BO/catalog/products/index.ts @@ -6,10 +6,10 @@ const psVersion = testContext.getPSVersion(); /* eslint-disable global-require */ function requirePage(): BOProductsPageInterface { - if (semver.gte(psVersion, '0.0.0')) { - return require('@versions/develop/pages/BO/catalog/products').productsPage; - } + if (semver.gte(psVersion, '0.0.0')) { return require('@versions/develop/pages/BO/catalog/products'); + } + return require('@versions/develop/pages/BO/catalog/products'); } /* eslint-enable global-require */