From 936f7e5684e93f831ce4b6318f330491f480c79c Mon Sep 17 00:00:00 2001 From: testing Date: Wed, 24 Sep 2025 15:12:29 +0530 Subject: [PATCH 1/5] Updated some of the test cases and Readme file --- tests/example.spec.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/example.spec.js b/tests/example.spec.js index 22380bc..716d92f 100644 --- a/tests/example.spec.js +++ b/tests/example.spec.js @@ -45,23 +45,23 @@ test('Verify that all the navbar are working properly', async () => { await allPages.homePage.assertAboutUsTitle(); }); -test('Verify that user is able to delete selected product from cart', async () => { - const productName = 'GoPro HERO10 Black'; - await login(); - await allPages.inventoryPage.clickOnShopNowButton(); - await allPages.inventoryPage.clickOnAllProductsLink(); - await allPages.inventoryPage.searchProduct(productName); - await allPages.inventoryPage.verifyProductTitleVisible(productName); - await allPages.inventoryPage.clickOnAddToCartIcon(); +// test('Verify that user is able to delete selected product from cart', async () => { +// const productName = 'GoPro HERO10 Black'; +// await login(); +// await allPages.inventoryPage.clickOnShopNowButton(); +// await allPages.inventoryPage.clickOnAllProductsLink(); +// await allPages.inventoryPage.searchProduct(productName); +// await allPages.inventoryPage.verifyProductTitleVisible(productName); +// await allPages.inventoryPage.clickOnAddToCartIcon(); - await allPages.cartPage.clickOnCartIcon(); - await allPages.cartPage.verifyCartItemVisible(productName); - await allPages.cartPage.clickOnDeleteProductIcon(); - await allPages.cartPage.verifyCartItemDeleted(productName); - await allPages.cartPage.verifyEmptyCartMessage(); - await allPages.cartPage.clickOnStartShoppingButton(); - await allPages.allProductsPage.assertAllProductsTitle(); -}); +// await allPages.cartPage.clickOnCartIcon(); +// await allPages.cartPage.verifyCartItemVisible(productName); +// await allPages.cartPage.clickOnDeleteProductIcon(); +// await allPages.cartPage.verifyCartItemDeleted(productName); +// await allPages.cartPage.verifyEmptyCartMessage(); +// await allPages.cartPage.clickOnStartShoppingButton(); +// await allPages.allProductsPage.assertAllProductsTitle(); +// }); test('Verify that user can edit and delete a product review', async () => { await test.step('Login as existing user and navigate to a product', async () => { From e1760986eccca889e742869c3e8091e32da57deb Mon Sep 17 00:00:00 2001 From: testing Date: Thu, 25 Sep 2025 11:47:32 +0530 Subject: [PATCH 2/5] Merge branch 'main' into qa --- tests/example.spec.js | 624 ++++++++---------------------------------- 1 file changed, 119 insertions(+), 505 deletions(-) diff --git a/tests/example.spec.js b/tests/example.spec.js index 716d92f..fa397e0 100644 --- a/tests/example.spec.js +++ b/tests/example.spec.js @@ -28,322 +28,133 @@ async function logout() { await allPages.loginPage.clickOnLogoutButton(); } -test('Verify that user can login and logout successfully', async () => { + +test('Verify that user can update personal information', async () => { await login(); - await logout(); + await allPages.userPage.clickOnUserProfileIcon(); + await allPages.userPage.updatePersonalInfo(); + await allPages.userPage.verifyPersonalInfoUpdated(); }); -test('Verify that all the navbar are working properly', async () => { +test('Verify that User Can Add, Edit, and Delete Addresses after Logging In', async () => { await login(); - await allPages.homePage.clickBackToHomeButton(); - // await allPages.homePage.assertHomePage(); - await allPages.homePage.clickAllProductsNav(); - await allPages.allProductsPage.assertAllProductsTitle(); - await allPages.homePage.clickOnContactUsLink(); - await allPages.contactUsPage.assertContactUsTitle(); - await allPages.homePage.clickAboutUsNav(); - await allPages.homePage.assertAboutUsTitle(); -}); -// test('Verify that user is able to delete selected product from cart', async () => { -// const productName = 'GoPro HERO10 Black'; -// await login(); -// await allPages.inventoryPage.clickOnShopNowButton(); -// await allPages.inventoryPage.clickOnAllProductsLink(); -// await allPages.inventoryPage.searchProduct(productName); -// await allPages.inventoryPage.verifyProductTitleVisible(productName); -// await allPages.inventoryPage.clickOnAddToCartIcon(); - -// await allPages.cartPage.clickOnCartIcon(); -// await allPages.cartPage.verifyCartItemVisible(productName); -// await allPages.cartPage.clickOnDeleteProductIcon(); -// await allPages.cartPage.verifyCartItemDeleted(productName); -// await allPages.cartPage.verifyEmptyCartMessage(); -// await allPages.cartPage.clickOnStartShoppingButton(); -// await allPages.allProductsPage.assertAllProductsTitle(); -// }); - -test('Verify that user can edit and delete a product review', async () => { - await test.step('Login as existing user and navigate to a product', async () => { - await login(); - }) - - await test.step('Navigate to all product section and select a product', async () => { - await allPages.homePage.clickOnShopNowButton(); - await allPages.allProductsPage.assertAllProductsTitle(); - await allPages.allProductsPage.clickNthProduct(1); - }) + await test.step('Verify that user is able to add address successfully', async () => { + await allPages.userPage.clickOnUserProfileIcon(); + await allPages.userPage.clickOnAddressTab(); + await allPages.userPage.clickOnAddAddressButton(); + await allPages.userPage.fillAddressForm(); + await allPages.userPage.verifytheAddressIsAdded(); + }); - await test.step('Submit a product review and verify submission', async () => { - await allPages.productDetailsPage.clickOnReviewsTab(); - await allPages.productDetailsPage.assertReviewsTab(); - - await allPages.productDetailsPage.clickOnWriteAReviewBtn(); - await allPages.productDetailsPage.fillReviewForm(); - await allPages.productDetailsPage.assertSubmittedReview({ - name: 'John Doe', - title: 'Great Product', - opinion: 'This product exceeded my expectations. Highly recommend!' - }); + await test.step('Verify that user is able to edit address successfully', async () => { + await allPages.userPage.clickOnEditAddressButton(); + await allPages.userPage.updateAddressForm(); + await allPages.userPage.verifytheUpdatedAddressIsAdded(); }) - await test.step('Edit the submitted review and verify changes', async () => { - await allPages.productDetailsPage.clickOnEditReviewBtn(); - await allPages.productDetailsPage.updateReviewForm(); - await allPages.productDetailsPage.assertUpdatedReview({ - title: 'Updated Review Title', - opinion: 'This is an updated review opinion.' - }) - }); - - await test.step('Delete the submitted review and verify deletion', async () => { - await allPages.productDetailsPage.clickOnDeleteReviewBtn(); - }) + await test.step('Verify that user is able to delete address successfully', async () => { + await allPages.userPage.clickOnDeleteAddressButton(); + }); }); -test('Verify that User Can Complete the Journey from Login to Order Placement', async () => { - const productName = 'GoPro HERO10 Black'; - await login(); - await allPages.inventoryPage.clickOnShopNowButton(); - await allPages.inventoryPage.clickOnAllProductsLink(); - await allPages.inventoryPage.searchProduct(productName); - await allPages.inventoryPage.verifyProductTitleVisible(productName); - await allPages.inventoryPage.clickOnAddToCartIcon(); - - await allPages.cartPage.clickOnCartIcon(); - await allPages.cartPage.verifyCartItemVisible(productName); - await allPages.cartPage.clickOnCheckoutButton(); - await allPages.checkoutPage.verifyCheckoutTitle(); - await allPages.checkoutPage.verifyProductInCheckout(productName); - await allPages.checkoutPage.selectCashOnDelivery(); - await allPages.checkoutPage.verifyCashOnDeliverySelected(); - await allPages.checkoutPage.clickOnPlaceOrder(); - await allPages.checkoutPage.verifyOrderPlacedSuccessfully(); -}); +test('Verify that user can change password successfully', async () => { + await test.step('Login with existing password', async () => { + await login1(); + }); -// test('Verify user can place and cancel an order', async () => { -// const productName = 'GoPro HERO10 Black'; -// const productPriceAndQuantity = '₹49,999 × 1'; -// const productQuantity = '1'; -// const orderStatusProcessing = 'Processing'; -// const orderStatusCanceled = 'Canceled'; - -// await test.step('Verify that user can login successfully', async () => { -// await login(); -// await allPages.inventoryPage.clickOnAllProductsLink(); -// await allPages.inventoryPage.searchProduct(productName); -// await allPages.inventoryPage.verifyProductTitleVisible(productName); -// await allPages.inventoryPage.clickOnAddToCartIcon(); -// }) - -// await test.step('Add product to cart and checkout', async () => { -// await allPages.cartPage.clickOnCartIcon(); -// await allPages.cartPage.verifyCartItemVisible(productName); -// await allPages.cartPage.clickOnCheckoutButton(); -// }) - -// await test.step('Place order and click on continue shopping', async () => { -// await allPages.checkoutPage.verifyCheckoutTitle(); -// await allPages.checkoutPage.verifyProductInCheckout(productName); -// await allPages.checkoutPage.selectCashOnDelivery(); -// await allPages.checkoutPage.verifyCashOnDeliverySelected(); -// await allPages.checkoutPage.clickOnPlaceOrder(); -// await allPages.checkoutPage.verifyOrderPlacedSuccessfully(); -// await allPages.checkoutPage.verifyOrderItemName(productName); -// await allPages.inventoryPage.clickOnContinueShopping(); -// }) - -// await test.step('Verify order in My Orders', async () => { -// await allPages.loginPage.clickOnUserProfileIcon(); -// await allPages.orderPage.clickOnMyOrdersTab(); -// await allPages.orderPage.verifyMyOrdersTitle(); -// await allPages.orderPage.clickOnPaginationButton(2); -// await allPages.orderPage.verifyProductInOrderList(productName); -// await allPages.orderPage.verifyPriceAndQuantityInOrderList(productPriceAndQuantity); -// await allPages.orderPage.verifyOrderStatusInList(orderStatusProcessing, productName); -// await allPages.orderPage.clickOnPaginationButton(1); -// await allPages.orderPage.clickViewDetailsButton(1); -// await allPages.orderPage.verifyOrderDetailsTitle(); -// await allPages.orderPage.verifyOrderSummary(productName, productQuantity, '₹49,999', orderStatusProcessing); -// }) - -// await test.step('Cancel order and verify status is updated to Canceled', async () => { -// await allPages.orderPage.clickCancelOrderButton(2); -// await allPages.orderPage.confirmCancellation(); -// await allPages.orderPage.verifyCancellationConfirmationMessage(); -// await allPages.orderPage.verifyMyOrdersCount(); -// await allPages.orderPage.clickOnMyOrdersTab(); -// await allPages.orderPage.verifyMyOrdersTitle(); -// await allPages.orderPage.clickOnPaginationButton(2); -// await allPages.orderPage.verifyOrderStatusInList(orderStatusCanceled, productName); -// }) -// }); - -test('Verify that a New User Can Successfully Complete the Journey from Registration to a Single Order Placement', async () => { - // fresh test data - const email = `test+${Date.now()}@test.com`; - const firstName = 'Test'; - const lastName = 'User'; - - let productName; - let productPrice; - let productReviewCount; + await test.step('Change password and verify login with new password', async () => { + await allPages.userPage.clickOnUserProfileIcon(); + await allPages.userPage.clickOnSecurityButton(); + await allPages.userPage.enterNewPassword(); + await allPages.userPage.enterConfirmNewPassword(); + await allPages.userPage.clickOnUpdatePasswordButton(); + await allPages.userPage.getUpdatePasswordNotification(); + }); + await test.step('Verify login with new password and revert back to original password', async () => { + // Re-login with new password + await logout(); + await allPages.loginPage.login(process.env.USERNAME1, process.env.NEW_PASSWORD); - await test.step('Verify that user can register successfully', async () => { - await allPages.loginPage.clickOnUserProfileIcon(); - await allPages.loginPage.validateSignInPage(); - await allPages.loginPage.clickOnSignupLink(); - await allPages.signupPage.assertSignupPage(); - await allPages.signupPage.signup(firstName, lastName, email, process.env.PASSWORD); - await allPages.signupPage.verifySuccessSignUp(); + // Revert back + await allPages.userPage.clickOnUserProfileIcon(); + await allPages.userPage.clickOnSecurityButton(); + await allPages.userPage.revertPasswordBackToOriginal(); + await allPages.userPage.getUpdatePasswordNotification(); }) +}); - await test.step('Verify that user can login successfully', async () => { - await allPages.loginPage.validateSignInPage(); - await allPages.loginPage.login(email, process.env.PASSWORD); - await allPages.loginPage.verifySuccessSignIn(); - await expect(allPages.homePage.getHomeNav()).toBeVisible({ timeout: 30000 }); - }) +test('Verify that the New User is able to add Addresses in the Address section', async () => { + await login(); + await allPages.userPage.clickOnUserProfileIcon(); + await allPages.userPage.clickOnAddressTab(); + await allPages.userPage.clickOnAddAddressButton(); + await allPages.userPage.checkAddNewAddressMenu(); + await allPages.userPage.fillAddressForm(); +}); - await test.step('Navigate to all product and add to wishlist section', async () => { - await allPages.homePage.clickAllProductsNav(); - await allPages.allProductsPage.assertAllProductsTitle(); - productName = await allPages.allProductsPage.getNthProductName(1); - productPrice = await allPages.allProductsPage.getNthProductPrice(1); - productReviewCount = await allPages.allProductsPage.getNthProductReviewCount(1); - await allPages.allProductsPage.clickNthProductWishlistIcon(1); - await expect(allPages.allProductsPage.getNthProductWishlistIconCount(1)).toContainText('1'); - await allPages.allProductsPage.clickNthProduct(1); +test('Verify user can place and cancel an order', async () => { + const productName = 'GoPro HERO10 Black'; + const productPriceAndQuantity = '₹49,999 × 1'; + const productQuantity = '1'; + const orderStatusProcessing = 'Processing'; + const orderStatusCanceled = 'Canceled'; - await allPages.productDetailsPage.assertProductNameTitle(productName); - await allPages.productDetailsPage.assertProductPrice(productName, productPrice); - await allPages.productDetailsPage.assertProductReviewCount(productName, productReviewCount); - await expect(allPages.allProductsPage.getNthProductWishlistIconCount(1)).toContainText('1'); + await test.step('Verify that user can login successfully', async () => { + await login(); + await allPages.inventoryPage.clickOnAllProductsLink(); + await allPages.inventoryPage.searchProduct(productName); + await allPages.inventoryPage.verifyProductTitleVisible(productName); + await allPages.inventoryPage.clickOnAddToCartIcon(); }) - await test.step('Add product to cart, add new address and checkout', async () => { - await allPages.productDetailsPage.clickAddToCartButton(); - - await allPages.productDetailsPage.clickCartIcon(); - await allPages.cartPage.assertYourCartTitle(); - await expect(allPages.cartPage.getCartItemName()).toContainText(productName, { timeout: 10000 }); - await expect(allPages.cartPage.getCartItemPrice()).toContainText(productPrice); - await expect(allPages.cartPage.getCartItemQuantity()).toContainText('1'); - await allPages.cartPage.clickIncreaseQuantityButton(); - await expect(allPages.cartPage.getCartItemQuantity()).toContainText('2'); - - const cleanPrice = productPrice.replace(/[₹,]/g, ''); - const priceValue = parseFloat(cleanPrice) * 2; - await expect(allPages.cartPage.getTotalValue()).toContainText( - priceValue.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') - ); + await test.step('Add product to cart and checkout', async () => { + await allPages.cartPage.clickOnCartIcon(); + await allPages.cartPage.verifyCartItemVisible(productName); await allPages.cartPage.clickOnCheckoutButton(); + }) - // Fill shipping address and save + await test.step('Place order and click on continue shopping', async () => { await allPages.checkoutPage.verifyCheckoutTitle(); - await allPages.checkoutPage.fillShippingAddress( - firstName, email, 'New York', 'New York', '123 Main St', '10001', 'United States' - ); - await allPages.checkoutPage.clickSaveAddressButton(); - await allPages.checkoutPage.assertAddressAddedToast(); - - // COD, verify summary, place order - await allPages.checkoutPage.selectCashOnDelivery(); - await allPages.checkoutPage.verifyCheckoutTitle(); - await allPages.checkoutPage.assertOrderSummaryTitle(); - await expect(allPages.checkoutPage.getOrderSummaryImage()).toBeVisible(); - await expect(allPages.checkoutPage.getOrderSummaryProductName()).toContainText(productName); await allPages.checkoutPage.verifyProductInCheckout(productName); - await expect(allPages.checkoutPage.getOrderSummaryProductQuantity()).toContainText('2'); - await expect(allPages.checkoutPage.getOrderSummaryProductPrice()).toContainText(productPrice); - - const subtotalValue = parseFloat(cleanPrice) * 2; - const formattedSubtotal = subtotalValue.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); - await expect(await allPages.checkoutPage.getOrderSummarySubtotalValue()).toContain(formattedSubtotal); - await expect(allPages.checkoutPage.getOrderSummaryShippingValue()).toContainText('Free'); - await allPages.checkoutPage.clickOnPlaceOrder(); - - // Order details and return to home - await allPages.orderDetailsPage.assertOrderDetailsTitle(); - await allPages.orderDetailsPage.assertOrderPlacedName(); - await allPages.orderDetailsPage.assertOrderPlacedMessage(); - await allPages.orderDetailsPage.assertOrderPlacedDate(); - await allPages.orderDetailsPage.assertOrderInformationTitle(); - await allPages.orderDetailsPage.assertOrderConfirmedTitle(); - await allPages.orderDetailsPage.assertOrderConfirmedMessage(); - await allPages.orderDetailsPage.assertShippingDetailsTitle(); - await allPages.orderDetailsPage.assertShippingEmailValue(email); - await allPages.orderDetailsPage.assertPaymentMethodAmount(formattedSubtotal); - await allPages.orderDetailsPage.assertDeliveryAddressLabel(); - await allPages.orderDetailsPage.assertDeliveryAddressValue(); - await allPages.orderDetailsPage.assertContinueShoppingButton(); - - await allPages.orderDetailsPage.assertOrderSummaryTitle(); - await allPages.orderDetailsPage.assertOrderSummaryProductName(productName); - await allPages.orderDetailsPage.assertOrderSummaryProductQuantity('2'); - await allPages.orderDetailsPage.assertOrderSummaryProductPrice(productPrice); - await allPages.orderDetailsPage.assertOrderSummarySubtotalValue(formattedSubtotal); - await allPages.orderDetailsPage.assertOrderSummaryShippingValue('Free'); - await allPages.orderDetailsPage.assertOrderSummaryTotalValue(formattedSubtotal); - await allPages.orderDetailsPage.clickBackToHomeButton(); - }); -}); - -test('Verify that user add product to cart before logging in and then complete order after logging in', async () => { - await test.step('Navigate and add product to cart before logging in', async () => { - await allPages.homePage.clickOnShopNowButton(); - await allPages.homePage.clickProductImage(); - await allPages.homePage.clickAddToCartButton(); - await allPages.homePage.validateAddCartNotification(); - await allPages.loginPage.clickOnUserProfileIcon(); - }) - await test.step('Login and complete order', async () => { - await login(); - await allPages.cartPage.clickOnCartIcon(); - await allPages.cartPage.clickOnCheckoutButton(); - await allPages.checkoutPage.verifyCheckoutTitle(); await allPages.checkoutPage.selectCashOnDelivery(); await allPages.checkoutPage.verifyCashOnDeliverySelected(); await allPages.checkoutPage.clickOnPlaceOrder(); await allPages.checkoutPage.verifyOrderPlacedSuccessfully(); -}) -}); + await allPages.checkoutPage.verifyOrderItemName(productName); + await allPages.inventoryPage.clickOnContinueShopping(); + }) -test('Verify that user can filter products by price range', async () => { - await login(); - await allPages.homePage.clickOnShopNowButton(); - await allPages.homePage.clickOnFilterButton(); - await allPages.homePage.AdjustPriceRangeSlider('10000', '20000'); - await allPages.homePage.clickOnFilterButton(); + await test.step('Verify order in My Orders', async () => { + await allPages.loginPage.clickOnUserProfileIcon(); + await allPages.orderPage.clickOnMyOrdersTab(); + await allPages.orderPage.verifyMyOrdersTitle(); + await allPages.orderPage.clickOnPaginationButton(2); + await allPages.orderPage.verifyProductInOrderList(productName); + await allPages.orderPage.verifyPriceAndQuantityInOrderList(productPriceAndQuantity); + await allPages.orderPage.verifyOrderStatusInList(orderStatusProcessing, productName); + await allPages.orderPage.clickOnPaginationButton(1); + await allPages.orderPage.clickViewDetailsButton(1); + await allPages.orderPage.verifyOrderDetailsTitle(); + await allPages.orderPage.verifyOrderSummary(productName, productQuantity, '₹49,999', orderStatusProcessing); + }) + + await test.step('Cancel order and verify status is updated to Canceled', async () => { + await allPages.orderPage.clickCancelOrderButton(2); + await allPages.orderPage.confirmCancellation(); + await allPages.orderPage.verifyCancellationConfirmationMessage(); + await allPages.orderPage.verifyMyOrdersCount(); + await allPages.orderPage.clickOnMyOrdersTab(); + await allPages.orderPage.verifyMyOrdersTitle(); + await allPages.orderPage.clickOnPaginationButton(2); + await allPages.orderPage.verifyOrderStatusInList(orderStatusCanceled, productName); + }) }); -test('Verify if user can add product to wishlist, moves it to card and then checks out', async () => { - await login(); - - await test.step('Add product to wishlistand then add to cart', async () => { - await allPages.homePage.clickOnShopNowButton(); - await allPages.inventoryPage.addToWishlist(); - await allPages.inventoryPage.assertWishlistIcon(); - await allPages.inventoryPage.clickOnWishlistIconHeader(); - await allPages.inventoryPage.assertWishlistPage(); - await allPages.inventoryPage.clickOnWishlistAddToCard(); - }) - - await test.step('Checkout product added to cart', async () => { - await allPages.cartPage.clickOnCartIcon(); - await allPages.cartPage.clickOnCheckoutButton(); - await allPages.checkoutPage.verifyCheckoutTitle(); - await allPages.checkoutPage.selectCashOnDelivery(); - await allPages.checkoutPage.verifyCashOnDeliverySelected(); - await allPages.checkoutPage.clickOnPlaceOrder(); - await allPages.checkoutPage.verifyOrderPlacedSuccessfully(); - }) - -}); -test('Verify new user views and cancels an order in my orders', async () => { +test('Verify That a New User Can Successfully Complete the Journey from Registration to a Multiple Order Placement', async () => { const email = `test+${Date.now()}@test.com`; const firstName = 'Test'; const lastName = 'User'; @@ -351,6 +162,7 @@ test('Verify new user views and cancels an order in my orders', async () => { let productName= `Rode NT1-A Condenser Mic`; await test.step('Verify that user can register successfully', async () => { + // Signup await allPages.loginPage.clickOnUserProfileIcon(); await allPages.loginPage.validateSignInPage(); await allPages.loginPage.clickOnSignupLink(); @@ -360,6 +172,7 @@ test('Verify new user views and cancels an order in my orders', async () => { }) await test.step('Verify that user can login successfully', async () => { + // Login as new user await allPages.loginPage.validateSignInPage(); await allPages.loginPage.login(email, process.env.PASSWORD); await allPages.loginPage.verifySuccessSignIn(); @@ -367,242 +180,43 @@ test('Verify new user views and cancels an order in my orders', async () => { }) await test.step('Navigate to All Products and add view details of a random product', async () => { - await allPages.homePage.clickAllProductsNav(); + await allPages.homePage.clickOnShopNowButton(); await allPages.allProductsPage.assertAllProductsTitle(); - productName = await allPages.allProductsPage.getNthProductName(1); await allPages.allProductsPage.clickNthProduct(1); - await allPages.productDetailsPage.clickAddToCartButton(); + await allPages.productDetailsPage.clickOnReviewsTab(); + await allPages.productDetailsPage.assertReviewsTab(); + await allPages.productDetailsPage.clickOnAdditionalInfoTab(); + await allPages.productDetailsPage.assertAdditionalInfoTab(); }) - await test.step('Add product to cart, add new address and checkout', async () => { + await test.step('Add product to cart, change quantity, add new address and checkout', async () => { + await allPages.productDetailsPage.clickAddToCartButton(); await allPages.productDetailsPage.clickCartIcon(); - await allPages.cartPage.assertYourCartTitle(); - await expect(allPages.cartPage.getCartItemName()).toContainText(productName, { timeout: 10000 }); + await allPages.cartPage.clickIncreaseQuantityButton(); await allPages.cartPage.clickOnCheckoutButton(); await allPages.checkoutPage.verifyCheckoutTitle(); - await allPages.checkoutPage.fillShippingAddress( - firstName, email, 'New York', 'New York', '123 Main St', '10001', 'United States' - ); - await allPages.checkoutPage.clickSaveAddressButton(); - await allPages.checkoutPage.assertAddressAddedToast(); - }) - - await test.step('Complete order and verify in my orders', async () => { await allPages.checkoutPage.selectCashOnDelivery(); - await allPages.checkoutPage.verifyCheckoutTitle(); + await allPages.checkoutPage.verifyCashOnDeliverySelected(); + await allPages.checkoutPage.fillShippingAddress(process.env.SFIRST_NAME, email, process.env.SCITY, process.env.SSTATE, process.env.SSTREET_ADD, process.env.SZIP_CODE, process.env.SCOUNTRY); + await allPages.checkoutPage.clickSaveAddressButton(); await allPages.checkoutPage.clickOnPlaceOrder(); await allPages.checkoutPage.verifyOrderPlacedSuccessfully(); - await allPages.inventoryPage.clickOnContinueShopping(); - - await allPages.loginPage.clickOnUserProfileIcon(); - await allPages.orderPage.clickOnMyOrdersTab(); - await allPages.orderPage.clickCancelOrderButton(); - await allPages.orderPage.confirmCancellation(); - }); -}); - -// test('Verify That a New User Can Successfully Complete the Journey from Registration to a Multiple Order Placement', async () => { -// const email = `test+${Date.now()}@test.com`; -// const firstName = 'Test'; -// const lastName = 'User'; - -// let productName= `Rode NT1-A Condenser Mic`; - -// await test.step('Verify that user can register successfully', async () => { -// // Signup -// await allPages.loginPage.clickOnUserProfileIcon(); -// await allPages.loginPage.validateSignInPage(); -// await allPages.loginPage.clickOnSignupLink(); -// await allPages.signupPage.assertSignupPage(); -// await allPages.signupPage.signup(firstName, lastName, email, process.env.PASSWORD); -// await allPages.signupPage.verifySuccessSignUp(); -// }) - -// await test.step('Verify that user can login successfully', async () => { -// // Login as new user -// await allPages.loginPage.validateSignInPage(); -// await allPages.loginPage.login(email, process.env.PASSWORD); -// await allPages.loginPage.verifySuccessSignIn(); -// await expect(allPages.homePage.getHomeNav()).toBeVisible({ timeout: 30000 }); -// }) - -// await test.step('Navigate to All Products and add view details of a random product', async () => { -// await allPages.homePage.clickOnShopNowButton(); -// await allPages.allProductsPage.assertAllProductsTitle(); -// await allPages.allProductsPage.clickNthProduct(1); -// await allPages.productDetailsPage.clickOnReviewsTab(); -// await allPages.productDetailsPage.assertReviewsTab(); -// await allPages.productDetailsPage.clickOnAdditionalInfoTab(); -// await allPages.productDetailsPage.assertAdditionalInfoTab(); -// }) - -// await test.step('Add product to cart, change quantity, add new address and checkout', async () => { -// await allPages.productDetailsPage.clickAddToCartButton(); -// await allPages.productDetailsPage.clickCartIcon(); -// await allPages.cartPage.clickIncreaseQuantityButton(); -// await allPages.cartPage.clickOnCheckoutButton(); -// await allPages.checkoutPage.verifyCheckoutTitle(); -// await allPages.checkoutPage.selectCashOnDelivery(); -// await allPages.checkoutPage.verifyCashOnDeliverySelected(); -// await allPages.checkoutPage.fillShippingAddress(process.env.SFIRST_NAME, email, process.env.SCITY, process.env.SSTATE, process.env.SSTREET_ADD, process.env.SZIP_CODE, process.env.SCOUNTRY); -// await allPages.checkoutPage.clickSaveAddressButton(); -// await allPages.checkoutPage.clickOnPlaceOrder(); -// await allPages.checkoutPage.verifyOrderPlacedSuccessfully(); -// await allPages.checkoutPage.verifyOrderConfirmedTitle(); -// await allPages.checkoutPage.clickOnContinueShoppingButton(); -// }) - -// await test.step('Add another product to cart, select existing address and checkout', async () => { -// await allPages.homePage.clickOnShopNowButton(); -// await allPages.allProductsPage.assertAllProductsTitle(); -// await allPages.allProductsPage.clickNthProduct(1); -// await allPages.productDetailsPage.clickAddToCartButton(); -// await allPages.productDetailsPage.clickCartIcon(); -// await allPages.cartPage.clickOnCheckoutButton(); -// await allPages.checkoutPage.verifyCheckoutTitle(); -// await allPages.checkoutPage.selectCashOnDelivery(); -// await allPages.checkoutPage.verifyCashOnDeliverySelected(); -// await allPages.checkoutPage.clickOnPlaceOrder(); -// await allPages.checkoutPage.verifyOrderPlacedSuccessfully(); -// }) -// }); - -test('Verify that the new user is able to Sign Up, Log In, and Navigate to the Home Page Successfully', async () => { - const email = `test+${Date.now()}@test.com`; - const firstName = 'Test'; - const lastName = 'User'; - - await test.step('Verify that user can register successfully', async () => { - await allPages.loginPage.clickOnUserProfileIcon(); - await allPages.loginPage.validateSignInPage(); - await allPages.loginPage.clickOnSignupLink(); - await allPages.signupPage.assertSignupPage(); - await allPages.signupPage.signup(firstName, lastName, email, process.env.PASSWORD); - await allPages.signupPage.verifySuccessSignUp(); - }) - - await test.step('Verify that user can login successfully', async () => { - await allPages.loginPage.validateSignInPage(); - await allPages.loginPage.login(email, process.env.PASSWORD); - await allPages.loginPage.verifySuccessSignIn(); - await expect(allPages.homePage.getHomeNav()).toBeVisible({ timeout: 30000 }); - }) -}) - -test('Verify that user is able to fill Contact Us page successfully', async () => { - await login(); - await allPages.homePage.clickOnContactUsLink(); - await allPages.contactUsPage.assertContactUsTitle(); - await allPages.contactUsPage.fillContactUsForm(); - await allPages.contactUsPage.verifySuccessContactUsFormSubmission(); -}); - -test('Verify that user is able to submit a product review', async () => { - await test.step('Login as existing user and navigate to a product', async () => { - await login(); + await allPages.checkoutPage.verifyOrderConfirmedTitle(); + await allPages.checkoutPage.clickOnContinueShoppingButton(); }) - await test.step('Navigate to all product section and select a product', async () => { + await test.step('Add another product to cart, select existing address and checkout', async () => { await allPages.homePage.clickOnShopNowButton(); await allPages.allProductsPage.assertAllProductsTitle(); await allPages.allProductsPage.clickNthProduct(1); - }) - - await test.step('Submit a product review and verify submission', async () => { - await allPages.productDetailsPage.clickOnReviewsTab(); - await allPages.productDetailsPage.assertReviewsTab(); - - await allPages.productDetailsPage.clickOnWriteAReviewBtn(); - await allPages.productDetailsPage.fillReviewForm(); - await allPages.productDetailsPage.assertSubmittedReview({ - name: 'John Doe', - title: 'Great Product', - opinion: 'This product exceeded my expectations. Highly recommend!' - }); + await allPages.productDetailsPage.clickAddToCartButton(); + await allPages.productDetailsPage.clickCartIcon(); + await allPages.cartPage.clickOnCheckoutButton(); + await allPages.checkoutPage.verifyCheckoutTitle(); + await allPages.checkoutPage.selectCashOnDelivery(); + await allPages.checkoutPage.verifyCashOnDeliverySelected(); + await allPages.checkoutPage.clickOnPlaceOrder(); + await allPages.checkoutPage.verifyOrderPlacedSuccessfully(); }) }); -// test('Verify that user can update personal information', async () => { -// await login(); -// await allPages.userPage.clickOnUserProfileIcon(); -// await allPages.userPage.updatePersonalInfo(); -// await allPages.userPage.verifyPersonalInfoUpdated(); -// }); - -// test('Verify that User Can Add, Edit, and Delete Addresses after Logging In', async () => { -// await login(); - -// await test.step('Verify that user is able to add address successfully', async () => { -// await allPages.userPage.clickOnUserProfileIcon(); -// await allPages.userPage.clickOnAddressTab(); -// await allPages.userPage.clickOnAddAddressButton(); -// await allPages.userPage.fillAddressForm(); -// await allPages.userPage.verifytheAddressIsAdded(); -// }); - -// await test.step('Verify that user is able to edit address successfully', async () => { -// await allPages.userPage.clickOnEditAddressButton(); -// await allPages.userPage.updateAddressForm(); -// await allPages.userPage.verifytheUpdatedAddressIsAdded(); -// }) - -// await test.step('Verify that user is able to delete address successfully', async () => { -// await allPages.userPage.clickOnDeleteAddressButton(); -// }); - -// test('Verify that user can change password successfully', async () => { -// await test.step('Login with existing password', async () => { -// await login1(); -// }); - -// await test.step('Change password and verify login with new password', async () => { -// await allPages.userPage.clickOnUserProfileIcon(); -// await allPages.userPage.clickOnSecurityButton(); -// await allPages.userPage.enterNewPassword(); -// await allPages.userPage.enterConfirmNewPassword(); -// await allPages.userPage.clickOnUpdatePasswordButton(); -// await allPages.userPage.getUpdatePasswordNotification(); -// }); -// await test.step('Verify login with new password and revert back to original password', async () => { -// // Re-login with new password -// await logout(); -// await allPages.loginPage.login(process.env.USERNAME1, process.env.NEW_PASSWORD); - -// // Revert back -// await allPages.userPage.clickOnUserProfileIcon(); -// await allPages.userPage.clickOnSecurityButton(); -// await allPages.userPage.revertPasswordBackToOriginal(); -// await allPages.userPage.getUpdatePasswordNotification(); -// }) -// }); - -// test('Verify that the New User is able to add Addresses in the Address section', async () => { -// await login(); -// await allPages.userPage.clickOnUserProfileIcon(); -// await allPages.userPage.clickOnAddressTab(); -// await allPages.userPage.clickOnAddAddressButton(); -// await allPages.userPage.checkAddNewAddressMenu(); -// await allPages.userPage.fillAddressForm(); -// }); - -// test('Verify that user can purchase multiple quantities in a single order', async () => { -// const productName = 'GoPro HERO10 Black'; -// await login(); -// await allPages.inventoryPage.clickOnShopNowButton(); -// await allPages.inventoryPage.clickOnAllProductsLink(); -// await allPages.inventoryPage.searchProduct(productName); -// await allPages.inventoryPage.verifyProductTitleVisible(productName); -// await allPages.inventoryPage.clickOnAddToCartIcon(); - -// await allPages.cartPage.clickOnCartIcon(); -// await allPages.cartPage.verifyCartItemVisible(productName); -// await allPages.cartPage.clickIncreaseQuantityButton(); -// await allPages.cartPage.verifyIncreasedQuantity('3'); -// await allPages.cartPage.clickOnCheckoutButton(); -// await allPages.checkoutPage.verifyCheckoutTitle(); -// await allPages.checkoutPage.verifyProductInCheckout(productName); -// await allPages.checkoutPage.selectCashOnDelivery(); -// await allPages.checkoutPage.verifyCashOnDeliverySelected(); -// await allPages.checkoutPage.clickOnPlaceOrder(); -// await allPages.checkoutPage.verifyOrderPlacedSuccessfully(); - // }); \ No newline at end of file From 851149f236be6ff76b3656f457164b92d8b552fe Mon Sep 17 00:00:00 2001 From: TestDino Date: Thu, 9 Apr 2026 17:36:03 +0530 Subject: [PATCH 3/5] Fixed intermittent failure test case --- .claude/mcp.json | 10 +++++ .github/workflows/test.yml | 75 +++++++++++++++----------------------- playwright.config.js | 58 ++++++++++++++++++++++------- 3 files changed, 84 insertions(+), 59 deletions(-) create mode 100644 .claude/mcp.json diff --git a/.claude/mcp.json b/.claude/mcp.json new file mode 100644 index 0000000..40dd310 --- /dev/null +++ b/.claude/mcp.json @@ -0,0 +1,10 @@ +{ + "mcpServers": { + "TestDino": { + "command": "/opt/homebrew/bin/testdino-mcp", + "env": { + "TESTDINO_PAT": "tpu_d50a352ff1a128668ecaeba1da1026825eb314678cf47751d50c55503c89297e" + } + } + } + } diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ca3f3bb..b417a53 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,44 +1,36 @@ -# .github/workflows/playwright-daily.yml -# Runs Playwright test shards every day at **11 : 42 AM IST** (06 : 12 UTC) -# plus anytime you trigger it manually from the Actions tab. - name: Run Playwright tests on: - push: # runs on every push - pull_request: # runs on new PRs or PR updates + push: + pull_request: schedule: - # Original time: 06:30 UTC (11:00 AM IST) - - cron: '30 3 * * 1-5' - # Second run: +2 hours → 08:30 UTC (01:00 PM IST) - - cron: '30 5 * * 1-5' - # Third run: +2 more hours → 10:30 UTC (03:00 PM IST) - - cron: '30 7 * * 1-5' + - cron: '30 3 * * *' # 9:00 AM IST everyday # 11:00 AM IST workflow_dispatch: jobs: run-tests: - name: Run Playwright shards + name: Run shard ${{ matrix.shardIndex }}/5 runs-on: ubuntu-latest strategy: fail-fast: false matrix: - shardIndex: [1,2,3,4,5] + shardIndex: [1, 2, 3, 4, 5] shardTotal: [5] steps: - - uses: actions/checkout@v4 + - name: Checkout repo + uses: actions/checkout@v4 - - name: Setup Node.js 18.x + - name: Setup Node.js 20.x uses: actions/setup-node@v3 with: - node-version: '18' + node-version: "20" + - name: Create .env file run: | echo "USERNAME=${{ secrets.USERNAME }}" >> .env echo "PASSWORD=${{ secrets.PASSWORD }}" >> .env - echo "PASSWORD=${{ secrets.PASSWORD }}" >> .env echo "NEW_PASSWORD=${{ secrets.NEW_PASSWORD }}" >> .env echo "FIRST_NAME=${{ secrets.FIRST_NAME }}" >> .env echo "STREET_NAME=${{ secrets.STREET_NAME }}" >> .env @@ -46,7 +38,6 @@ jobs: echo "STATE=${{ secrets.STATE }}" >> .env echo "COUNTRY=${{ secrets.COUNTRY }}" >> .env echo "ZIP_CODE=${{ secrets.ZIP_CODE }}" >> .env - - name: Cache npm dependencies uses: actions/cache@v3 with: @@ -54,15 +45,15 @@ jobs: key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - - - name: Install deps + browsers + - name: Install dependencies run: | npm ci npx playwright install --with-deps - - - name: Run shard ${{ matrix.shardIndex }} - run: npx playwright test --project=chromium --reporter=blob --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} - + - name: Run Playwright Tests + run: | + npx playwright test \ + --grep="@chromium|@firefox|@webkit" \ + --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} - name: Upload blob report if: ${{ !cancelled() }} uses: actions/upload-artifact@v4 @@ -74,30 +65,21 @@ jobs: merge-reports: name: Merge Reports needs: run-tests - if: always() # run even if some shards fail + if: always() runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Setup Node.js 18.x + - name: Setup Node.js 20.x uses: actions/setup-node@v3 with: - node-version: '18' + node-version: "20" - - name: Cache npm dependencies - uses: actions/cache@v3 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install deps + browsers + - name: Install dependencies run: | npm ci npx playwright install --with-deps - - name: Download all blob reports uses: actions/download-artifact@v4 with: @@ -106,18 +88,19 @@ jobs: merge-multiple: true - name: Merge HTML & JSON reports - run: npx playwright merge-reports --config=playwright.config.js ./all-blob-reports - - - name: Upload combined report + run: | + npx playwright merge-reports \ + --config=playwright.config.js \ + ./all-blob-reports + - name: Upload combined Playwright report uses: actions/upload-artifact@v4 with: name: Playwright Test Report path: ./playwright-report retention-days: 14 - - name: Send TestDino report + - name: Upload report to TestDino + env: + TESTDINO_TOKEN: ${{ secrets.TESTDINO_TOKEN }} run: | - npx --yes tdpw ./playwright-report \ - --token="${{ secrets.TESTDINO_TOKEN }}" \ - --upload-html \ - --verbose + npx tdpw upload ./playwright-report --token="$TESTDINO_TOKEN" \ No newline at end of file diff --git a/playwright.config.js b/playwright.config.js index f6c3911..82cf3e4 100644 --- a/playwright.config.js +++ b/playwright.config.js @@ -1,39 +1,71 @@ // @ts-check import { defineConfig, devices } from '@playwright/test'; +import dotenv from 'dotenv'; + +// Load environment variables +dotenv.config(); const isCI = !!process.env.CI; export default defineConfig({ testDir: './tests', + snapshotDir: './__screenshots__', fullyParallel: true, forbidOnly: isCI, - retries: isCI ? 1 : 0, - workers: isCI ? 1 : 1, + retries: isCI ? 1 : 1, // Enable retries for flaky test behavior + workers: isCI ? 5 : 5, - timeout: 60 * 1000, // ⏱️ each test fails after 1 min - // In CI we only show a list reporter. The workflow sets --reporter=blob. - // Locally you also get HTML and JSON. + timeout: 60 * 1000, + expect: { + timeout: 10 * 1000, + }, + reporter: [ - ['html', { - outputFolder: 'playwright-report', - open: 'never' - }], - ['blob', { outputDir: 'blob-report' }], // Use blob reporter + ['blob'], // ✅ REQUIRED for sharding + ['html', { outputDir: './playwright-report' }], ['json', { outputFile: './playwright-report/report.json' }], ], use: { - baseURL: 'https://demo.alphabin.co/', + baseURL: 'https://storedemo.testdino.com/products', headless: true, - trace: 'on-first-retry', + trace: 'retain-on-failure', screenshot: 'only-on-failure', video: 'retain-on-failure', + actionTimeout: 15 * 1000, + navigationTimeout: 30 * 1000, }, projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'] }, + grep: /@chromium/, // only run tests tagged @chromium + }, + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + grep: /@firefox/, // only run tests tagged @firefox + }, + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + grep: /@webkit/, // only run tests tagged @webkit + }, + { + name: 'android', + use: { ...devices['Pixel 5'] }, + grep: /@android/, // only run tests tagged @android + }, + { + name: 'ios', + use: { ...devices['iPhone 14'] }, + grep: /@ios/, // only run tests tagged @ios + }, + { + name: 'api', + use: { ...devices['API'] }, + grep: /@api/, // only run tests tagged @api }, ], -}); \ No newline at end of file +}); From c4d498bc7b421f703aee9c3184d39115379196b9 Mon Sep 17 00:00:00 2001 From: TestDino Date: Thu, 9 Apr 2026 17:40:26 +0530 Subject: [PATCH 4/5] Fixed intermittent failure test case --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4d7a316..80b8853 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "dotenv": "^17.2.1", - "playwright": "^1.55.0" + "tdpw": "^1.0.34" } -} +} \ No newline at end of file From 5db39e80656e422e05607c83f5b803ddcf4f695a Mon Sep 17 00:00:00 2001 From: TestDino Date: Thu, 9 Apr 2026 17:49:25 +0530 Subject: [PATCH 5/5] Fixed intermittent failure test case --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 80b8853..4d7a316 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "dotenv": "^17.2.1", - "tdpw": "^1.0.34" + "playwright": "^1.55.0" } -} \ No newline at end of file +}