From e242b8cc6d800be88c63d6370d45b764dd3947ad Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Thu, 20 Jul 2023 11:26:23 +0200 Subject: [PATCH 01/44] detailed extension for header test --- config/localization.yaml | 29 ++++ config/neodymium.properties | 6 +- .../components/AbstractComponent.java | 10 ++ .../pageobjects/components/Header.java | 140 +++++++++++++++++- .../pageobjects/pages/browsing/HomePage.java | 5 +- src/test/java/posters/tests/AbstractTest.java | 2 +- 6 files changed, 184 insertions(+), 8 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index f6e0b0da..87b67b1c 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -1,4 +1,33 @@ default: + header: + worldOfNature: World of Nature + animals: Animals + flowers: Flowers + trees: Trees + dining: Dining + coldCuts: Cold Cuts + mainDishes: Main Dishes + sweets: Sweets + transportation: Transportation + airTravel: Air Travel + classicCars: Classic Cars + railways: Railways + panoramas: Panoramas + architecture: Architecture + fireworks: Fireworks + landscapes: Landscapes + xxlPanoramas: XXL Panoramas + userMenu: + greeting: "WELCOME: GUEST" + createAccount: CREATE ACCOUNT + signIn: SIGN IN + shoppingCart: + itemsInCart: ITEMS IN THE CART + subtotal: SUBTOTAL + viewCart: VIEW CART + sale: + first: "25% off (Almost) Everything! Use Code: Posters Sale" + second: "Our biggest sale yet 50% off all Posters" footer: text: Copyright (c) 2013-2020 Xceptance Software Technologies GmbH -- This software is for demo purposes only and not meant to be used in production. search: diff --git a/config/neodymium.properties b/config/neodymium.properties index b922bf09..9891205d 100644 --- a/config/neodymium.properties +++ b/config/neodymium.properties @@ -1,8 +1,8 @@ neodymium.url = ${neodymium.url.protocol}://${neodymium.url.host}${neodymium.url.path} -neodymium.url.protocol = https +neodymium.url.protocol = http neodymium.url.host = localhost -neodymium.url.path = ${neodymium.url.port}/posters/ -neodymium.url.port = :8443 +neodymium.url.path = ${neodymium.url.port}/ +neodymium.url.port = :8080 neodymium.locale = en_US diff --git a/src/test/java/posters/pageobjects/components/AbstractComponent.java b/src/test/java/posters/pageobjects/components/AbstractComponent.java index 4dfcf8a0..daf8fd86 100644 --- a/src/test/java/posters/pageobjects/components/AbstractComponent.java +++ b/src/test/java/posters/pageobjects/components/AbstractComponent.java @@ -1,6 +1,16 @@ package posters.pageobjects.components; +import static com.codeborne.selenide.Selenide.actions; + +import com.codeborne.selenide.SelenideElement; + public abstract class AbstractComponent { abstract public void isComponentAvailable(); + + // move mouse cursor to specific {selector} + public void moveCursor(SelenideElement selector) + { + actions().moveToElement(selector).perform(); + } } diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index 9c0a2c3c..e2af3dbb 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -1,12 +1,148 @@ package posters.pageobjects.components; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Condition.matchesText; +import static com.codeborne.selenide.Condition.visible; +import static com.codeborne.selenide.Selenide.*; + +import com.codeborne.selenide.ElementsCollection; +import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; public class Header extends AbstractComponent { + // logo and searchbar + public SelenideElement header = $("#globalNavigation"); + public SelenideElement brand = $("#brand"); + public SelenideElement searchbar = $("#s"); + public SelenideElement searchBarButton = $("#btnSearch"); + public SelenideElement searchBarButtonIcon = $(".icon-search"); + + // navigation + public ElementsCollection navComponents = $$(".has-dropdown"); + public ElementsCollection subNavComponents = $$("ul.dropdown-menu li"); + + // user menu + public ElementsCollection userMenu = $$("#userMenu li"); + public SelenideElement user = $("#showUserMenu"); + public SelenideElement userIcon = $(".icon-user2"); + public SelenideElement addUserIcon = $("#userMenu .icon-user-add-outline"); + public SelenideElement logInIcon = $("#userMenu .icon-log-in"); + + // shopping cart + public ElementsCollection items = $$("#miniCartMenu .cartMiniHeader"); + public ElementsCollection itemCount = $$("#count_wideView"); + public ElementsCollection subtotal = $$("#miniCartMenu .cartMiniSubOrderTotal "); + public ElementsCollection viewCart = $$("#miniCartMenu .linkButton"); + public SelenideElement cart = $("#headerCartOverview"); + public SelenideElement cartIcon = $(".icon-shopping-cart"); + + public ElementsCollection saleBanner = $$(".owl-stage"); + + // validate availability header public void isComponentAvailable() { - $("#globalNavigation").should(exist); + header.should(exist); + } + + // validate name of components in navigation + private void validateNavComponent(String component) + { + navComponents.findBy(exactText(Neodymium.localizedText(component))).shouldBe(visible); + } + + // validate name of components in sub navigation + private void validateSubNavComponent(String component, String subComponent) + { + subNavComponents.findBy(matchesText(Neodymium.localizedText(subComponent))).shouldBe(visible); + } + + // validate strings in user menu + private void validateUserMenu(String text) + { + userMenu.findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); + } + + // TODO - find better solution + // validate strings sale banner + private void validateSaleBanner(String text) + { + try + { + Thread.sleep(6500); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + saleBanner.findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); + } + + public void validateStructure() + { + // validate availability header + isComponentAvailable(); + + // validate company logo + brand.shouldBe(visible); + + // validate searchbar + searchbar.shouldBe(visible); + searchBarButton.shouldBe(visible); + searchBarButtonIcon.shouldBe(visible); + + // validate navigation bar + validateNavComponent("header.worldOfNature"); + validateNavComponent("header.dining"); + validateNavComponent("header.transportation"); + validateNavComponent("header.panoramas"); + + // validate sub navigation "World Of Nature" + moveCursor(navComponents.findBy(exactText(Neodymium.localizedText("header.worldOfNature")))); + validateSubNavComponent("header.worldOfNature", "header.animals"); + validateSubNavComponent("header.worldOfNature", "header.flowers"); + validateSubNavComponent("header.worldOfNature", "header.trees"); + + // validate sub navigation "Dining" + moveCursor(navComponents.findBy(exactText(Neodymium.localizedText("header.dining")))); + validateSubNavComponent("header.worldOfNature", "header.coldCuts"); + validateSubNavComponent("header.worldOfNature", "header.mainDishes"); + validateSubNavComponent("header.worldOfNature", "header.sweets"); + + // validate sub navigation "Transportation" + moveCursor(navComponents.findBy(exactText(Neodymium.localizedText("header.transportation")))); + validateSubNavComponent("header.worldOfNature", "header.airTravel"); + validateSubNavComponent("header.worldOfNature", "header.classicCars"); + validateSubNavComponent("header.worldOfNature", "header.railways"); + + // validate sub navigation "Panoramas" + moveCursor(navComponents.findBy(exactText(Neodymium.localizedText("header.panoramas")))); + validateSubNavComponent("header.worldOfNature", "header.architecture"); + validateSubNavComponent("header.worldOfNature", "header.fireworks"); + validateSubNavComponent("header.worldOfNature", "header.landscapes"); + validateSubNavComponent("header.worldOfNature", "header.xxlPanoramas"); + + // validate user menu + userIcon.shouldBe(visible); + moveCursor(user); + validateUserMenu("header.userMenu.greeting"); + validateUserMenu("header.userMenu.createAccount"); + validateUserMenu("header.userMenu.signIn"); + addUserIcon.shouldBe(visible); + logInIcon.shouldBe(visible); + + // validate shopping cart menu + cartIcon.shouldBe(visible); + itemCount.findBy(matchesText("\\d")).shouldBe(visible); + moveCursor(cart); + items.findBy(matchesText(Neodymium.localizedText("header.shoppingCart.itemsInCart"))).shouldBe(visible); + subtotal.findBy(matchesText(Neodymium.localizedText("header.shoppingCart.subtotal"))).shouldBe(visible); + subtotal.findBy(matchesText("\\$\\d\\.\\d")).shouldBe(visible); + viewCart.findBy(exactText(Neodymium.localizedText("header.shoppingCart.viewCart"))).shouldBe(visible); + + // validate sale banner + validateSaleBanner("header.sale.second"); + validateSaleBanner("header.sale.first"); } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index 84257e65..8dedbb08 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -58,8 +58,9 @@ public void validateStructure() @Step("validate home page") public void validate() { - validateStructure(); - footer.validate(); + //validateStructure(); + //footer.validate(); + header.validateStructure(); } @Step("validate successful order on home page") diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index f5670906..af7275b3 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -11,7 +11,7 @@ * @author pfotenhauer */ @RunWith(NeodymiumRunner.class) -@Browser("Firefox_1024x768") +@Browser("Chrome_1024x768") public abstract class AbstractTest { protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTest.class); From e74e1e7722d040b3abeddc8334ae38a079a37b06 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Fri, 21 Jul 2023 09:29:32 +0200 Subject: [PATCH 02/44] improved header test --- .../components/AbstractComponent.java | 8 -- .../pageobjects/components/Header.java | 126 ++---------------- .../pageobjects/components/MiniCart.java | 28 +++- .../pageobjects/components/SaleBanner.java | 33 +++++ .../pageobjects/components/Search.java | 14 +- .../pageobjects/components/TopNavigation.java | 77 ++++++++++- .../pageobjects/components/UserMenu.java | 38 +++++- 7 files changed, 185 insertions(+), 139 deletions(-) create mode 100644 src/test/java/posters/pageobjects/components/SaleBanner.java diff --git a/src/test/java/posters/pageobjects/components/AbstractComponent.java b/src/test/java/posters/pageobjects/components/AbstractComponent.java index daf8fd86..7df941a2 100644 --- a/src/test/java/posters/pageobjects/components/AbstractComponent.java +++ b/src/test/java/posters/pageobjects/components/AbstractComponent.java @@ -1,16 +1,8 @@ package posters.pageobjects.components; -import static com.codeborne.selenide.Selenide.actions; - import com.codeborne.selenide.SelenideElement; public abstract class AbstractComponent { abstract public void isComponentAvailable(); - - // move mouse cursor to specific {selector} - public void moveCursor(SelenideElement selector) - { - actions().moveToElement(selector).perform(); - } } diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index e2af3dbb..2716faf2 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -10,139 +10,39 @@ import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; +import io.qameta.allure.Step; + public class Header extends AbstractComponent -{ - // logo and searchbar - public SelenideElement header = $("#globalNavigation"); - public SelenideElement brand = $("#brand"); - public SelenideElement searchbar = $("#s"); - public SelenideElement searchBarButton = $("#btnSearch"); - public SelenideElement searchBarButtonIcon = $(".icon-search"); - - // navigation - public ElementsCollection navComponents = $$(".has-dropdown"); - public ElementsCollection subNavComponents = $$("ul.dropdown-menu li"); - - // user menu - public ElementsCollection userMenu = $$("#userMenu li"); - public SelenideElement user = $("#showUserMenu"); - public SelenideElement userIcon = $(".icon-user2"); - public SelenideElement addUserIcon = $("#userMenu .icon-user-add-outline"); - public SelenideElement logInIcon = $("#userMenu .icon-log-in"); - - // shopping cart - public ElementsCollection items = $$("#miniCartMenu .cartMiniHeader"); - public ElementsCollection itemCount = $$("#count_wideView"); - public ElementsCollection subtotal = $$("#miniCartMenu .cartMiniSubOrderTotal "); - public ElementsCollection viewCart = $$("#miniCartMenu .linkButton"); - public SelenideElement cart = $("#headerCartOverview"); - public SelenideElement cartIcon = $(".icon-shopping-cart"); - - public ElementsCollection saleBanner = $$(".owl-stage"); - +{ // validate availability header public void isComponentAvailable() { - header.should(exist); - } - - // validate name of components in navigation - private void validateNavComponent(String component) - { - navComponents.findBy(exactText(Neodymium.localizedText(component))).shouldBe(visible); - } - - // validate name of components in sub navigation - private void validateSubNavComponent(String component, String subComponent) - { - subNavComponents.findBy(matchesText(Neodymium.localizedText(subComponent))).shouldBe(visible); - } - - // validate strings in user menu - private void validateUserMenu(String text) - { - userMenu.findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); - } - - // TODO - find better solution - // validate strings sale banner - private void validateSaleBanner(String text) - { - try - { - Thread.sleep(6500); - } - catch (InterruptedException e) - { - e.printStackTrace(); - } - saleBanner.findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); + $("#globalNavigation").should(exist); } + // extended by Jonas + @Step("validate structure header") public void validateStructure() { // validate availability header isComponentAvailable(); // validate company logo - brand.shouldBe(visible); + $("#brand").shouldBe(visible); // validate searchbar - searchbar.shouldBe(visible); - searchBarButton.shouldBe(visible); - searchBarButtonIcon.shouldBe(visible); - - // validate navigation bar - validateNavComponent("header.worldOfNature"); - validateNavComponent("header.dining"); - validateNavComponent("header.transportation"); - validateNavComponent("header.panoramas"); - - // validate sub navigation "World Of Nature" - moveCursor(navComponents.findBy(exactText(Neodymium.localizedText("header.worldOfNature")))); - validateSubNavComponent("header.worldOfNature", "header.animals"); - validateSubNavComponent("header.worldOfNature", "header.flowers"); - validateSubNavComponent("header.worldOfNature", "header.trees"); - - // validate sub navigation "Dining" - moveCursor(navComponents.findBy(exactText(Neodymium.localizedText("header.dining")))); - validateSubNavComponent("header.worldOfNature", "header.coldCuts"); - validateSubNavComponent("header.worldOfNature", "header.mainDishes"); - validateSubNavComponent("header.worldOfNature", "header.sweets"); - - // validate sub navigation "Transportation" - moveCursor(navComponents.findBy(exactText(Neodymium.localizedText("header.transportation")))); - validateSubNavComponent("header.worldOfNature", "header.airTravel"); - validateSubNavComponent("header.worldOfNature", "header.classicCars"); - validateSubNavComponent("header.worldOfNature", "header.railways"); + Search.validateStructure(); - // validate sub navigation "Panoramas" - moveCursor(navComponents.findBy(exactText(Neodymium.localizedText("header.panoramas")))); - validateSubNavComponent("header.worldOfNature", "header.architecture"); - validateSubNavComponent("header.worldOfNature", "header.fireworks"); - validateSubNavComponent("header.worldOfNature", "header.landscapes"); - validateSubNavComponent("header.worldOfNature", "header.xxlPanoramas"); + // validate top navigation + TopNavigation.validateStructure(); // validate user menu - userIcon.shouldBe(visible); - moveCursor(user); - validateUserMenu("header.userMenu.greeting"); - validateUserMenu("header.userMenu.createAccount"); - validateUserMenu("header.userMenu.signIn"); - addUserIcon.shouldBe(visible); - logInIcon.shouldBe(visible); + UserMenu.validateStructure(); // validate shopping cart menu - cartIcon.shouldBe(visible); - itemCount.findBy(matchesText("\\d")).shouldBe(visible); - moveCursor(cart); - items.findBy(matchesText(Neodymium.localizedText("header.shoppingCart.itemsInCart"))).shouldBe(visible); - subtotal.findBy(matchesText(Neodymium.localizedText("header.shoppingCart.subtotal"))).shouldBe(visible); - subtotal.findBy(matchesText("\\$\\d\\.\\d")).shouldBe(visible); - viewCart.findBy(exactText(Neodymium.localizedText("header.shoppingCart.viewCart"))).shouldBe(visible); + MiniCart.validateStructure(); // validate sale banner - validateSaleBanner("header.sale.second"); - validateSaleBanner("header.sale.first"); + SaleBanner.validateStructure(); } } diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 07b5ee55..98f5f82f 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -2,12 +2,13 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; +import static com.codeborne.selenide.Condition.matchesText; import static com.codeborne.selenide.Condition.not; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; +import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -21,18 +22,20 @@ */ public class MiniCart extends AbstractComponent { - private SelenideElement headerCart = $("#headerCartOverview"); + private static SelenideElement headerCart = $("#headerCartOverview"); private final static String miniCartSelector = "#miniCartMenu"; private SelenideElement miniCart = $(miniCartSelector); + + public static ElementsCollection subtotal = $$(miniCartSelector + " .cartMiniSubOrderTotal"); private SelenideElement subOrderPrice = $(miniCartSelector + " .subOrderPrice"); private SelenideElement totalCountElement = $("#headerCartOverview .headerCartProductCount"); private SelenideElement goToCartButton = $(".goToCart"); - + public void isComponentAvailable() { $("#btnCartOverviewForm").should(exist); @@ -122,7 +125,7 @@ public void validateMiniCart(int position, Product product) @Step("validate '{product}' in the mini cart by name") public void validateMiniCartByProduct(Product product) { - SelenideElement productContainer = $$(".cartItems").filter(matchText(product.getCartRowRegex())).shouldHaveSize(1).first(); + SelenideElement productContainer = $$(".cartItems").filter(matchesText(product.getCartRowRegex())).shouldHaveSize(1).first(); productContainer.find(".prodName").shouldHave(exactText(product.getName())); productContainer.find(".prodStyle").shouldHave(exactText(product.getStyle())); @@ -168,4 +171,21 @@ private void validateMiniCart(int position, String productName, String productSt // Close mini cart closeMiniCart(); } + + // extended by Jonas + @Step("validate shopping cart menu") + public static void validateStructure() + { + $(".icon-shopping-cart").shouldBe(visible); + $$("#count_wideView").findBy(matchesText("\\d")).shouldBe(visible); + + headerCart.hover(); + // TODO - validate item count + $$("#miniCartMenu .cartMiniHeader").findBy(matchesText(Neodymium.localizedText("header.shoppingCart.itemsInCart"))).shouldBe(visible); + subtotal.findBy(matchesText(Neodymium.localizedText("header.shoppingCart.subtotal"))).shouldBe(visible); + subtotal.findBy(matchesText("\\$\\d\\.\\d")).shouldBe(visible); + $$("#miniCartMenu .linkButton").findBy(exactText(Neodymium.localizedText("header.shoppingCart.viewCart"))).shouldBe(visible); + + $("#globalNavigation").hover(); + } } diff --git a/src/test/java/posters/pageobjects/components/SaleBanner.java b/src/test/java/posters/pageobjects/components/SaleBanner.java new file mode 100644 index 00000000..09e83f29 --- /dev/null +++ b/src/test/java/posters/pageobjects/components/SaleBanner.java @@ -0,0 +1,33 @@ +package posters.pageobjects.components; + +import static com.codeborne.selenide.Condition.exactText; +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.visible; +import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; + +import com.xceptance.neodymium.util.Neodymium; + +import io.qameta.allure.Step; + +public class SaleBanner extends AbstractComponent +{ + public void isComponentAvailable() + { + $(".sale").should(exist); + } + + // validate strings sale banner + private static void validateSaleBanner(String text) + { + $$(".owl-stage").findBy(exactText(Neodymium.localizedText(text))).waitUntil(visible, 6500); + } + + // extended by Jonas + @Step("validate sale banner") + public static void validateStructure() + { + validateSaleBanner("header.sale.second"); + validateSaleBanner("header.sale.first"); + } +} \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/components/Search.java b/src/test/java/posters/pageobjects/components/Search.java index 59660527..756f179a 100644 --- a/src/test/java/posters/pageobjects/components/Search.java +++ b/src/test/java/posters/pageobjects/components/Search.java @@ -13,7 +13,7 @@ public class Search extends AbstractComponent { - private SelenideElement searchField = $("#s"); + private static SelenideElement searchField = $("#s"); public void isComponentAvailable() { @@ -50,11 +50,17 @@ public void openSearch() @Step("validate that {searchTerm} is still visible after") public void validateSearchTerm(String searchTerm) { - // Validate the entered search phrase is still visible in the input openSearch(); - // Validate the entered search phrase is still visible in the input searchField.should(visible); - // Validate the entered search phrase is still visible in the input searchField.should(exactValue(searchTerm)); } + + @Step("validate structure search bar") + public static void validateStructure() + { + // validate search-bar, button and icon of button + searchField.shouldBe(visible); + $("#btnSearch").shouldBe(visible); + $(".icon-search").shouldBe(visible); + } } diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index 797f38b6..ad729482 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -1,6 +1,9 @@ package posters.pageobjects.components; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.matchesText; +import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; @@ -9,6 +12,7 @@ import org.openqa.selenium.By; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.CategoryPage; @@ -26,12 +30,21 @@ public void isComponentAvailable() categoryMenu.should(exist); } + // TODO - check if needed + @Step ("get the category name") + public static String getCategoryNameByPosition(int categoryPosition) + { + return $("#categoryMenu li:nth-of-type(" + categoryPosition + ") a").attr("title"); + } + + // TODO - check if needed @Step("get the subcategory name") - public String getSubCategoryNameByPosition(int categoryPosition, int subCategoryPosition) + public static String getSubCategoryNameByPosition(int categoryPosition, int subCategoryPosition) { - return $("#categoryMenu > ul > li:nth-of-type(" + categoryPosition + ") ul.dropdown li:nth-of-type(" + subCategoryPosition + ") a").attr("title"); + return $("#categoryMenu li:nth-of-type(" + categoryPosition + ") .dropdown li:nth-of-type(" + subCategoryPosition + ") a").attr("title"); } + // TODO - improve @Step("click a subcategory") public CategoryPage clickSubCategoryByPosition(int categoryPosition, int subCategoryPosition) { @@ -44,6 +57,7 @@ public CategoryPage clickSubCategoryByPosition(int categoryPosition, int subCate return new CategoryPage().isExpectedPage(); } + // TODO - check if needed @Step("click on '{categoryName}' category") public CategoryPage clickCategory(String categoryName) { @@ -51,6 +65,7 @@ public CategoryPage clickCategory(String categoryName) return new CategoryPage().isExpectedPage(); } + // TODO - check if needed @Step("click on a '{subCategoryName}' subcategory within '{categoryName}'") public CategoryPage clickSubCategoryByNames(String categoryName, String subCategoryName) { @@ -62,10 +77,7 @@ public CategoryPage clickSubCategoryByNames(String categoryName, String subCateg return new CategoryPage(); } - /** - * @param subCategoryName - * @return - */ + // TODO - check if needed @Step("click on a product by name '{productName}'") public CategoryPage clickSubcategoryByName(String subCategoryName) { @@ -75,6 +87,7 @@ public CategoryPage clickSubcategoryByName(String subCategoryName) return new CategoryPage().isExpectedPage(); } + // TODO - check if needed @Step("get a random sub category name ") public String getRandomSubcategoryName(Random random) { @@ -93,4 +106,56 @@ public String getRandomSubcategoryName(Random random) return getSubCategoryNameByPosition(categoryPositionX, categoryPositionY); } + + // extended by Jonas + @Step("validate name of components in navigation") + public static void validateNavComponent(String component) + { + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(component))).shouldBe(visible); + } + + // extended by Jonas + @Step("validate name of components in sub navigation") + public static void validateSubNavComponent(String component, String subComponent) + { + $$("ul.dropdown-menu li").findBy(matchesText(Neodymium.localizedText(subComponent))).shouldBe(visible); + } + + // extended by Jonas + @Step("validate structure top navigation") + public static void validateStructure() + { + // validate navigation bar + validateNavComponent("header.worldOfNature"); + validateNavComponent("header.dining"); + validateNavComponent("header.transportation"); + validateNavComponent("header.panoramas"); + + // validate sub navigation "World Of Nature" + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.worldOfNature"))).hover(); + validateSubNavComponent("header.worldOfNature", "header.animals"); + validateSubNavComponent("header.worldOfNature", "header.flowers"); + validateSubNavComponent("header.worldOfNature", "header.trees"); + + // validate sub navigation "Dining" + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.dining"))).hover(); + validateSubNavComponent("header.worldOfNature", "header.coldCuts"); + validateSubNavComponent("header.worldOfNature", "header.mainDishes"); + validateSubNavComponent("header.worldOfNature", "header.sweets"); + + // validate sub navigation "Transportation" + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.transportation"))).hover(); + validateSubNavComponent("header.worldOfNature", "header.airTravel"); + validateSubNavComponent("header.worldOfNature", "header.classicCars"); + validateSubNavComponent("header.worldOfNature", "header.railways"); + + // validate sub navigation "Panoramas" + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.panoramas"))).hover(); + validateSubNavComponent("header.worldOfNature", "header.architecture"); + validateSubNavComponent("header.worldOfNature", "header.fireworks"); + validateSubNavComponent("header.worldOfNature", "header.landscapes"); + validateSubNavComponent("header.worldOfNature", "header.xxlPanoramas"); + + $("#globalNavigation").hover(); + } } diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index cb604623..986e9958 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -6,7 +6,9 @@ import static com.codeborne.selenide.Condition.not; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; +import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -23,13 +25,14 @@ public class UserMenu extends AbstractComponent private final SelenideElement userMenu = $("#userMenu"); - private final SelenideElement showUserMenu = $("#showUserMenu"); + private static SelenideElement showUserMenu = $("#showUserMenu"); public void isComponentAvailable() { showUserMenu.should(exist); } + // TODO - improve @Step("open user menu") public void openUserMenu() { @@ -40,6 +43,7 @@ public void openUserMenu() userMenu.waitUntil(visible, Neodymium.configuration().selenideTimeout()); } + // TODO - check if needed @Step("close user menu") public void closeUserMenu() { @@ -52,6 +56,7 @@ public void closeUserMenu() userMenu.waitUntil(not(visible), Neodymium.configuration().selenideTimeout()); } + // TODO - check if needed @Step("open login page from user menu") public LoginPage openLogin() { @@ -60,6 +65,7 @@ public LoginPage openLogin() return new LoginPage().isExpectedPage(); } + // TODO - check if needed @Step("open account page from user menu") public AccountOverviewPage openAccountOverview() { @@ -68,6 +74,7 @@ public AccountOverviewPage openAccountOverview() return new AccountOverviewPage().isExpectedPage(); } + // TODO - check if needed @Step("open register page from user menu") public RegisterPage openRegister() { @@ -76,9 +83,7 @@ public RegisterPage openRegister() return new RegisterPage().isExpectedPage(); } - /** - * @param firstName - */ + // TODO - check if needed @Step("validate that '{firstName}' is logged in") public void validateLoggedInName(String firstName) { @@ -91,15 +96,40 @@ public void validateLoggedInName(String firstName) showUserMenu.find(".icon-user2").shouldHave(cssClass("logged")).shouldHave(exactText("")); } + // TODO - check if needed @Step("validate that nobody is logged in") public void validateNotLoggedIn() { userMenu.find(".goToLogin").should(exist); } + // TODO - check if needed @Step("validate that somebody is logged in") public boolean isLoggedIn() { return userMenu.find(".goToAccountOverview").exists(); } + + // extended by Jonas + @Step("validate strings in user menu") + private static void validateUserMenu(String text) + { + $$("#userMenu li").findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); + } + + // extended by Jonas + @Step("validate user menu") + public static void validateStructure() + { + $(".icon-user2").shouldBe(visible); + + showUserMenu.hover(); + validateUserMenu("header.userMenu.greeting"); + validateUserMenu("header.userMenu.createAccount"); + validateUserMenu("header.userMenu.signIn"); + $("#userMenu .icon-user-add-outline").shouldBe(visible); + $("#userMenu .icon-log-in").shouldBe(visible); + + $("#globalNavigation").hover(); + } } From 9a3b51d5d3b5a4685c5afd1f730bcf588bd31896 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Fri, 21 Jul 2023 14:55:33 +0200 Subject: [PATCH 03/44] extended Search(Test) --- config/localization.yaml | 2 +- .../pageobjects/components/ErrorMessage.java | 10 +- .../pageobjects/components/Footer.java | 2 +- .../pageobjects/components/Header.java | 27 +---- .../pageobjects/components/MiniCart.java | 45 ++++---- .../pageobjects/components/SaleBanner.java | 3 +- .../pageobjects/components/Search.java | 34 +++--- .../pageobjects/components/TopNavigation.java | 108 +++++++++-------- .../pageobjects/components/UserMenu.java | 53 +++++---- .../pages/browsing/CategoryPage.java | 109 ++++++------------ .../pageobjects/pages/browsing/HomePage.java | 13 +-- .../pages/browsing/NoHitsPage.java | 28 +++-- .../pages/browsing/ProductDetailPage.java | 68 ++++++----- .../pages/checkout/OrderConfirmationPage.java | 2 +- .../posters/tests/smoke/AddToCartTest.java | 2 +- .../java/posters/tests/smoke/BrowseTest.java | 2 +- .../posters/tests/smoke/GuestOrderTest.java | 4 +- .../posters/tests/smoke/HomePageTest.java | 4 +- .../tests/smoke/RegisterFromUserMenuTest.java | 2 +- .../posters/tests/smoke/RegisterTest.java | 2 +- .../tests/smoke/RegisteredOrderTest.java | 2 +- .../java/posters/tests/smoke/SearchTest.java | 28 +++-- 22 files changed, 257 insertions(+), 293 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index 87b67b1c..b5cb77e0 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -41,7 +41,7 @@ default: successfulAccountDeletion: Your account has been deleted. We hope to see you soon again! NoHitsPage: validation: - noProductsFound: Sorry! No results found matching your search. Please try again. + noProductsFound: × Sorry! No results found matching your search. Please try again. ProductdetailPage: addToCartButton: text: Add to cart diff --git a/src/test/java/posters/pageobjects/components/ErrorMessage.java b/src/test/java/posters/pageobjects/components/ErrorMessage.java index 5eac148e..41f8244f 100644 --- a/src/test/java/posters/pageobjects/components/ErrorMessage.java +++ b/src/test/java/posters/pageobjects/components/ErrorMessage.java @@ -6,6 +6,7 @@ import static com.codeborne.selenide.Selenide.$; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; @@ -13,6 +14,8 @@ public class ErrorMessage extends AbstractComponent { private SelenideElement errorMessage = $("#errorMessage"); + @Override + @Step("ensure availability error message") public void isComponentAvailable() { errorMessage.should(exist); @@ -21,17 +24,12 @@ public void isComponentAvailable() @Step("validate that the error message {message} is visible") public void validateErrorMessage(String message) { - // Wait until javascript makes the error message visible - // Waits until javascript makes the error message visible. - errorMessage.shouldBe(visible); - // Makes sure the correct text is displayed. - errorMessage.shouldHave(exactText("× " + message)); + errorMessage.shouldHave(exactText(Neodymium.localizedText(message))).shouldBe(visible); } @Step("validate that no error message is visible") public void validateNoErrorMessageOnPage() { - // Check that the error message is not visible. errorMessage.shouldNotBe(visible); } } diff --git a/src/test/java/posters/pageobjects/components/Footer.java b/src/test/java/posters/pageobjects/components/Footer.java index df657c09..053dba6c 100644 --- a/src/test/java/posters/pageobjects/components/Footer.java +++ b/src/test/java/posters/pageobjects/components/Footer.java @@ -19,7 +19,7 @@ public void isComponentAvailable() } @Step("validate the footer") - public void validate() + public void validateStructure() { isComponentAvailable(); // Asserts the footer contains the correct text. diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index 2716faf2..eff0fd89 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -1,20 +1,15 @@ package posters.pageobjects.components; -import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchesText; import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.*; - -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; -import com.xceptance.neodymium.util.Neodymium; +import static com.codeborne.selenide.Selenide.$; import io.qameta.allure.Step; public class Header extends AbstractComponent { - // validate availability header + @Override + @Step("validate availability header") public void isComponentAvailable() { $("#globalNavigation").should(exist); @@ -23,26 +18,14 @@ public void isComponentAvailable() // extended by Jonas @Step("validate structure header") public void validateStructure() - { - // validate availability header - isComponentAvailable(); - + { // validate company logo $("#brand").shouldBe(visible); - - // validate searchbar + Search.validateStructure(); - - // validate top navigation TopNavigation.validateStructure(); - - // validate user menu UserMenu.validateStructure(); - - // validate shopping cart menu MiniCart.validateStructure(); - - // validate sale banner SaleBanner.validateStructure(); } } diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 98f5f82f..64945c76 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -17,9 +17,6 @@ import posters.pageobjects.pages.checkout.CartPage; import posters.pageobjects.utility.PriceHelper; -/** - * @author pfotenhauer - */ public class MiniCart extends AbstractComponent { private static SelenideElement headerCart = $("#headerCartOverview"); @@ -36,11 +33,36 @@ public class MiniCart extends AbstractComponent private SelenideElement goToCartButton = $(".goToCart"); + @Override + @Step("ensure availability mini cart") public void isComponentAvailable() { $("#btnCartOverviewForm").should(exist); } + @Step("validate shopping cart menu") + public static void validateStructure() + { + // validate shopping cart icon, item count + $(".icon-shopping-cart").shouldBe(visible); + $$("#count_wideView").findBy(matchesText("\\d")).shouldBe(visible); + + // open cart window + headerCart.hover(); + + // validate structure cart window + // TODO - validate item count + $$("#miniCartMenu .cartMiniHeader").findBy(matchesText(Neodymium.localizedText("header.shoppingCart.itemsInCart"))).shouldBe(visible); + subtotal.findBy(matchesText(Neodymium.localizedText("header.shoppingCart.subtotal"))).shouldBe(visible); + subtotal.findBy(matchesText("\\$\\d\\.\\d")).shouldBe(visible); + $$("#miniCartMenu .linkButton").findBy(exactText(Neodymium.localizedText("header.shoppingCart.viewCart"))).shouldBe(visible); + + // close cart menu + $("#globalNavigation").hover(); + } + + // -------------------------------------------------------------- + @Step("open the mini cart") public void openMiniCart() { @@ -171,21 +193,4 @@ private void validateMiniCart(int position, String productName, String productSt // Close mini cart closeMiniCart(); } - - // extended by Jonas - @Step("validate shopping cart menu") - public static void validateStructure() - { - $(".icon-shopping-cart").shouldBe(visible); - $$("#count_wideView").findBy(matchesText("\\d")).shouldBe(visible); - - headerCart.hover(); - // TODO - validate item count - $$("#miniCartMenu .cartMiniHeader").findBy(matchesText(Neodymium.localizedText("header.shoppingCart.itemsInCart"))).shouldBe(visible); - subtotal.findBy(matchesText(Neodymium.localizedText("header.shoppingCart.subtotal"))).shouldBe(visible); - subtotal.findBy(matchesText("\\$\\d\\.\\d")).shouldBe(visible); - $$("#miniCartMenu .linkButton").findBy(exactText(Neodymium.localizedText("header.shoppingCart.viewCart"))).shouldBe(visible); - - $("#globalNavigation").hover(); - } } diff --git a/src/test/java/posters/pageobjects/components/SaleBanner.java b/src/test/java/posters/pageobjects/components/SaleBanner.java index 09e83f29..3965d3be 100644 --- a/src/test/java/posters/pageobjects/components/SaleBanner.java +++ b/src/test/java/posters/pageobjects/components/SaleBanner.java @@ -17,7 +17,8 @@ public void isComponentAvailable() $(".sale").should(exist); } - // validate strings sale banner + // extended by Jonas + @Step("validate strings sale banner") private static void validateSaleBanner(String text) { $$(".owl-stage").findBy(exactText(Neodymium.localizedText(text))).waitUntil(visible, 6500); diff --git a/src/test/java/posters/pageobjects/components/Search.java b/src/test/java/posters/pageobjects/components/Search.java index 756f179a..c893ae32 100644 --- a/src/test/java/posters/pageobjects/components/Search.java +++ b/src/test/java/posters/pageobjects/components/Search.java @@ -15,26 +15,36 @@ public class Search extends AbstractComponent { private static SelenideElement searchField = $("#s"); + @Override + @Step("validate availability search bar") public void isComponentAvailable() { searchField.should(exist); } + + @Step("validate structure search bar") + public static void validateStructure() + { + searchField.shouldBe(visible); + $("#btnSearch").shouldBe(visible); + $(".icon-search").shouldBe(visible); + } - @Step("search for '{searchTerm}' without result") - public NoHitsPage noResult(String searchTerm) + @Step("search for {searchTerm} without result") + public NoHitsPage noHitsPageResult(String searchTerm) { search(searchTerm); - return new NoHitsPage(); + return new NoHitsPage().isExpectedPage(); } - @Step("search for '{searchTerm}' with result") + @Step("search for {searchTerm} with result") public CategoryPage categoryPageResult(String searchTerm) { search(searchTerm); return new CategoryPage().isExpectedPage(); } - @Step("search for '{searchTerm}'") + @Step("search for {searchTerm}") public void search(String searchTerm) { openSearch(); @@ -44,23 +54,13 @@ public void search(String searchTerm) @Step("open search field") public void openSearch() { - $("#btnSearch").scrollTo().exists(); + searchField.scrollTo().click(); } @Step("validate that {searchTerm} is still visible after") public void validateSearchTerm(String searchTerm) { openSearch(); - searchField.should(visible); - searchField.should(exactValue(searchTerm)); - } - - @Step("validate structure search bar") - public static void validateStructure() - { - // validate search-bar, button and icon of button - searchField.shouldBe(visible); - $("#btnSearch").shouldBe(visible); - $(".icon-search").shouldBe(visible); + searchField.shouldHave(exactValue(searchTerm)); } } diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index ad729482..ddd53c3e 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -17,18 +17,68 @@ import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.CategoryPage; -/** - * @author pfotenhauer - */ public class TopNavigation extends AbstractComponent { SelenideElement categoryMenu = $("#categoryMenu"); @Override + @Step("ensure availability top navigation") public void isComponentAvailable() { categoryMenu.should(exist); } + + @Step("validate structure top navigation") + public static void validateStructure() + { + // validate navigation bar + validateNavComponent("header.worldOfNature"); + validateNavComponent("header.dining"); + validateNavComponent("header.transportation"); + validateNavComponent("header.panoramas"); + + // validate sub navigation "World Of Nature" + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.worldOfNature"))).hover(); + validateSubNavComponent("header.worldOfNature", "header.animals"); + validateSubNavComponent("header.worldOfNature", "header.flowers"); + validateSubNavComponent("header.worldOfNature", "header.trees"); + + // validate sub navigation "Dining" + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.dining"))).hover(); + validateSubNavComponent("header.worldOfNature", "header.coldCuts"); + validateSubNavComponent("header.worldOfNature", "header.mainDishes"); + validateSubNavComponent("header.worldOfNature", "header.sweets"); + + // validate sub navigation "Transportation" + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.transportation"))).hover(); + validateSubNavComponent("header.worldOfNature", "header.airTravel"); + validateSubNavComponent("header.worldOfNature", "header.classicCars"); + validateSubNavComponent("header.worldOfNature", "header.railways"); + + // validate sub navigation "Panoramas" + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.panoramas"))).hover(); + validateSubNavComponent("header.worldOfNature", "header.architecture"); + validateSubNavComponent("header.worldOfNature", "header.fireworks"); + validateSubNavComponent("header.worldOfNature", "header.landscapes"); + validateSubNavComponent("header.worldOfNature", "header.xxlPanoramas"); + + // close sub navigation + $("#globalNavigation").hover(); + } + + @Step("validate name of components in navigation") + public static void validateNavComponent(String component) + { + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(component))).shouldBe(visible); + } + + @Step("validate name of components in sub navigation") + public static void validateSubNavComponent(String component, String subComponent) + { + $$("ul.dropdown-menu li").findBy(matchesText(Neodymium.localizedText(subComponent))).shouldBe(visible); + } + + // ---------------------------------------------------------------- // TODO - check if needed @Step ("get the category name") @@ -106,56 +156,4 @@ public String getRandomSubcategoryName(Random random) return getSubCategoryNameByPosition(categoryPositionX, categoryPositionY); } - - // extended by Jonas - @Step("validate name of components in navigation") - public static void validateNavComponent(String component) - { - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(component))).shouldBe(visible); - } - - // extended by Jonas - @Step("validate name of components in sub navigation") - public static void validateSubNavComponent(String component, String subComponent) - { - $$("ul.dropdown-menu li").findBy(matchesText(Neodymium.localizedText(subComponent))).shouldBe(visible); - } - - // extended by Jonas - @Step("validate structure top navigation") - public static void validateStructure() - { - // validate navigation bar - validateNavComponent("header.worldOfNature"); - validateNavComponent("header.dining"); - validateNavComponent("header.transportation"); - validateNavComponent("header.panoramas"); - - // validate sub navigation "World Of Nature" - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.worldOfNature"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.animals"); - validateSubNavComponent("header.worldOfNature", "header.flowers"); - validateSubNavComponent("header.worldOfNature", "header.trees"); - - // validate sub navigation "Dining" - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.dining"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.coldCuts"); - validateSubNavComponent("header.worldOfNature", "header.mainDishes"); - validateSubNavComponent("header.worldOfNature", "header.sweets"); - - // validate sub navigation "Transportation" - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.transportation"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.airTravel"); - validateSubNavComponent("header.worldOfNature", "header.classicCars"); - validateSubNavComponent("header.worldOfNature", "header.railways"); - - // validate sub navigation "Panoramas" - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.panoramas"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.architecture"); - validateSubNavComponent("header.worldOfNature", "header.fireworks"); - validateSubNavComponent("header.worldOfNature", "header.landscapes"); - validateSubNavComponent("header.worldOfNature", "header.xxlPanoramas"); - - $("#globalNavigation").hover(); - } } diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index 986e9958..28fc7ea4 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -27,11 +27,41 @@ public class UserMenu extends AbstractComponent private static SelenideElement showUserMenu = $("#showUserMenu"); + @Override + @Step("ensure availability user menu") public void isComponentAvailable() { showUserMenu.should(exist); } + @Step("validate user menu") + public static void validateStructure() + { + // validate user icon + $(".icon-user2").shouldBe(visible); + + // open user window + showUserMenu.hover(); + + // validate structure user window + validateUserMenu("header.userMenu.greeting"); + validateUserMenu("header.userMenu.createAccount"); + validateUserMenu("header.userMenu.signIn"); + $("#userMenu .icon-user-add-outline").shouldBe(visible); + $("#userMenu .icon-log-in").shouldBe(visible); + + // close user window + $("#globalNavigation").hover(); + } + + @Step("validate strings in user menu") + private static void validateUserMenu(String text) + { + $$("#userMenu li").findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); + } + + // --------------------------------------------------------------------- + // TODO - improve @Step("open user menu") public void openUserMenu() @@ -109,27 +139,4 @@ public boolean isLoggedIn() { return userMenu.find(".goToAccountOverview").exists(); } - - // extended by Jonas - @Step("validate strings in user menu") - private static void validateUserMenu(String text) - { - $$("#userMenu li").findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); - } - - // extended by Jonas - @Step("validate user menu") - public static void validateStructure() - { - $(".icon-user2").shouldBe(visible); - - showUserMenu.hover(); - validateUserMenu("header.userMenu.greeting"); - validateUserMenu("header.userMenu.createAccount"); - validateUserMenu("header.userMenu.signIn"); - $("#userMenu .icon-user-add-outline").shouldBe(visible); - $("#userMenu .icon-log-in").shouldBe(visible); - - $("#globalNavigation").hover(); - } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index 853bbdd9..49d3251b 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -18,9 +18,6 @@ import io.qameta.allure.Step; import posters.pageobjects.components.Pagination; -/** - * @author pfotenhauer - */ public class CategoryPage extends AbstractBrowsingPage { public Pagination pagination = new Pagination(); @@ -35,34 +32,43 @@ public CategoryPage isExpectedPage() productOverview.should(exist); return this; } - - @Step("validate category name '{categoryName}' on category page") - public void validateCategoryName(String categoryName) - { - // Category name - // Ensures the category headline contains the category name - $("#titleCategoryName").shouldBe(text(categoryName)); - } - + @Override @Step("validate category page structure") public void validateStructure() { super.validateStructure(); - - // Amount of results - // Assures the amount of posters displayed in the headline is not 0. - $("#totalProductCount").shouldNotBe(exactText("0")); - // Results - // Assures there's at least one product shown + + // validate poster count in headline is not 0 + $("#totalProductCount").shouldNotBe(exactText("0")).shouldBe(visible); + + // validate at least 1 poster is displayed $("#product0").shouldBe(visible); } + + @Step("get a product name by position") + public String getProductNameByPosition(int position) + { + return $("#product" + (position - 1) + " h2").text(); + } + + @Step("click on a product by position") + public ProductDetailPage clickProductByPosition(int position) + { + $("#product" + (position - 1)).scrollTo().click(); + return new ProductDetailPage().isExpectedPage(); + } + + // ---------------------------------------------------------- - /** - * @param row - * @param column - * @return - */ + // TODO - check if needed + @Step("validate category name {categoryName} is on category page") + public void validateCategoryName(String categoryName) + { + $("#titleCategoryName").shouldHave(text(categoryName)); + } + + // TODO - check if needed @Step("click on a product by position in grid") public ProductDetailPage clickProductByPosition(int row, int column) { @@ -73,11 +79,7 @@ public ProductDetailPage clickProductByPosition(int row, int column) return new ProductDetailPage().isExpectedPage(); } - /** - * @param row - * @param column - * @return - */ + // TODO - check if needed @Step("get a product name by position in grid") public String getProductNameByPosition(int row, int column) { @@ -85,26 +87,7 @@ public String getProductNameByPosition(int row, int column) return rowContainer.find("h2.pName", column - 1).text(); } - /** - * @param position - * @return - */ - @Step("click on a product by position") - public ProductDetailPage clickProductByPosition(int position) - { - final int index = position - 1; - - // Open the product detail page - // Click on the product's image and open the product overview page - // Click the product link to open the product detail page - $("#product" + index + " img").scrollTo().click(); - return new ProductDetailPage().isExpectedPage(); - } - - /** - * @param productName - * @return - */ + // TODO - check if needed @Step("click on a product by name '{productName}'") public ProductDetailPage clickProductByName(String productName) { @@ -115,22 +98,7 @@ public ProductDetailPage clickProductByName(String productName) return new ProductDetailPage().isExpectedPage(); } - /** - * @param position - * @return - */ - @Step("get a product name by position") - public String getProductNameByPosition(int position) - { - final int index = position - 1; - // Get the product name - return $("#product" + index + " .desc .pName").text(); - } - - /** - * @param searchTerm - * @param searchTermExpectedCount - */ + // TODO - check if needed @Step("validate search results for '{searchTerm}' on category page") public void validateSearchHits(String searchTerm, int searchTermExpectedCount) { @@ -154,18 +122,14 @@ public void validateSearchHits(String searchTerm, int searchTermExpectedCount) $("#totalProductCount").shouldHave(exactText(Integer.toString(searchTermExpectedCount))); } - /** - * @param productName - */ + // TODO - check if needed @Step("validate product '{productName}' is visible on category page") public void validateProductVisible(String productName) { $("#productOverview .thumbnails .thumbnail a > img.pImage[title='" + productName + "']").shouldBe(visible); } - /** - * @param categoryName - */ + // TODO - check if needed @Step("validate category page of category '{categoryName}'") public void validate(String categoryName) { @@ -173,9 +137,7 @@ public void validate(String categoryName) validateCategoryName(categoryName); } - /** - * @param categoryName - */ + // TODO - check if needed @Step("validate category page of category '{categoryName}' and assert visually") public void validateAndVisualAssert(String categoryName) { @@ -183,6 +145,7 @@ public void validateAndVisualAssert(String categoryName) validateCategoryName(categoryName); } + // TODO - check if needed public String getRandomProductDetailName(Random random) { ElementsCollection rows = productOverview.findAll(".thumbnails.row"); diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index 8dedbb08..dd0350c5 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -24,7 +24,8 @@ public HomePage isExpectedPage() return this; } - @Step("validate home page structure") + @Override + @Step("validate structure home page") public void validateStructure() { super.validateStructure(); @@ -55,14 +56,6 @@ public void validateStructure() $$(".container .row-pb-md .product-entry").shouldHave(sizeGreaterThan(0)); } - @Step("validate home page") - public void validate() - { - //validateStructure(); - //footer.validate(); - header.validateStructure(); - } - @Step("validate successful order on home page") public void validateSuccessfulOrder() { @@ -104,7 +97,7 @@ public void validateSuccessfulDeletedAccount() public void validateAndVisualAssert() { validateStructureAndVisual(); - footer.validate(); + footer.validateStructure(); } public ProductDetailPage clickOnPresentedProduct(String productName) diff --git a/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java b/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java index 8f51b172..f182c3b7 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java @@ -1,28 +1,32 @@ package posters.pageobjects.pages.browsing; -import com.xceptance.neodymium.util.Neodymium; +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Selenide.$; import io.qameta.allure.Step; public class NoHitsPage extends AbstractBrowsingPage -{ - - @Step("validate no hits page structure") - public void validateStructure() +{ + @Override + @Step("ensure this is a no hits page") + public NoHitsPage isExpectedPage() { - super.validateStructure(); + super.isExpectedPage(); + $("#errorMessage").should(exist); + return this; } - + @Step("validate that no products are on no hits page") public void validateNoProductsFound() { - errorMessage.validateErrorMessage(Neodymium.localizedText("NoHitsPage.validation.noProductsFound")); + errorMessage.validateErrorMessage("NoHitsPage.validation.noProductsFound"); } - - @Step("validate no hits page") - public void validate() + + @Override + @Step("validate structure no hits page") + public void validateStructure() { - validateStructure(); + super.validateStructure(); validateNoProductsFound(); } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index 3d64f0cb..b30ceb3b 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -3,6 +3,7 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; +import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import com.codeborne.selenide.SelenideElement; @@ -11,9 +12,7 @@ import io.qameta.allure.Step; import posters.dataobjects.Product; -/** - * @author pfotenhauer - */ +// review: "Product Description:", "Select size:", "Select style:" only selectable with style class public class ProductDetailPage extends AbstractBrowsingPage { private SelenideElement addToCartButton = $("#btnAddToCart"); @@ -39,28 +38,46 @@ public void validateStructure() { super.validateStructure(); - // Title - // Make sure we have the proper headline and it is not empty, at least 4 characters, starting with uppercase - // letter, - productName.shouldBe(matchText("[A-Z].{3,}")); - // Price - // Check that the price is correct in its form. A dollar symbol, followed by 1-3 digits, optionally more groups - // of exactly 3 digits separated by a comma as separator, a period and 2 digits for the cents as the end of the - // String. - productPrice.shouldBe(matchText("\\$(\\d{1,3})(,\\d{3})*\\.\\d{2}$")); - // Add to cart button - // Make sure we got an add to cart button and the text matches. - addToCartButton.shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.addToCartButton.text"))); + // validate image + $("#prodImg").shouldBe(visible); + + // validate title + productName.shouldHave(matchText("[A-Z].{3,}")).shouldBe(visible); + + // validate product price + productPrice.shouldHave(matchText("\\$\\d+\\.\\d{2}")).shouldBe(visible); + + // validate product description + $("#prodDescriptionOverview").shouldBe(visible); + $("#prodDescriptionDetail").shouldBe(visible); + + // validate size selection + $("#selectSize").shouldBe(visible); + + // validate style selection + $("#selectStyle").shouldBe(visible); + + // validate print information + $("#prodPrintInfo").shouldBe(visible); + + // validate add to cart button + addToCartButton.shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.addToCartButton.text"))).shouldBe(visible); } - + + @Step("validate the product detail page of {productName}") + public void validate(String productName) + { + validateStructure(); + validateProductName(productName); + } + @Step("validate product name on product detail page") public void validateProductName(String name) { - // Verify product name - // compares the displayed product name to the given parameter. productName.shouldHave(exactText(name)); } - + + // ---------------------------------------------------------------------------------- @Step("select size") public void setSize(String size) { @@ -128,19 +145,6 @@ public Product getProduct() return new Product(getProductName(), getProductPrice(), getChosenStyle(), getChosenSize(), 1); } - /** - * @param productName - */ - @Step("validate the product detail page of '{productName}'") - public void validate(String productName) - { - validateStructure(); - validateProductName(productName); - } - - /** - * @param productName - */ @Step("validate the product detail page of '{productName}' and assert visually") public void validateAndVisualAssert(String productName) { diff --git a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java index 03c23cd4..ef7270ae 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java @@ -60,7 +60,7 @@ public void validateStructure() public void validate() { validateStructure(); - footer.validate(); + footer.validateStructure(); } @Step("validate successful order on Confirmation page") diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index e5887a12..66851ec5 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -24,7 +24,7 @@ public void testAddProductsToCart() // Go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validate(); + homePage.validateStructure(); homePage.miniCart.validateTotalCount(totalCount); homePage.miniCart.validateSubtotal("$0.00"); diff --git a/src/test/java/posters/tests/smoke/BrowseTest.java b/src/test/java/posters/tests/smoke/BrowseTest.java index 3e36e56e..796a0f86 100644 --- a/src/test/java/posters/tests/smoke/BrowseTest.java +++ b/src/test/java/posters/tests/smoke/BrowseTest.java @@ -22,7 +22,7 @@ public void testBrowsing() { // Go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validate(); + homePage.validateStructure(); // Go to category final String categoryName = homePage.topNav.getSubCategoryNameByPosition(1, 1); diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index 003e6cfe..e2a56786 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -34,7 +34,7 @@ public void testOrderingAsGuest() // Go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validate(); + homePage.validateStructure(); // Assure not logged in status homePage.userMenu.validateNotLoggedIn(); @@ -104,6 +104,6 @@ public void testOrderingAsGuest() //Validate home page - homePage.validate(); + homePage.validateStructure(); } } diff --git a/src/test/java/posters/tests/smoke/HomePageTest.java b/src/test/java/posters/tests/smoke/HomePageTest.java index 9e4d1cc9..15fa437f 100644 --- a/src/test/java/posters/tests/smoke/HomePageTest.java +++ b/src/test/java/posters/tests/smoke/HomePageTest.java @@ -35,7 +35,9 @@ public void testVisitingHomepage() { AllureAddons.addToReport("Find me in the report", "Some additional content. Could be the toString method of an complex object."); var homePage = OpenHomePageFlow.flow(); - homePage.validate(); homePage.title.validateTitle(Neodymium.localizedText("HomePage.title")); + homePage.validateStructure(); + homePage.header.validateStructure(); + homePage.footer.validateStructure(); } } diff --git a/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java b/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java index 41b6a3c8..98358ef6 100644 --- a/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java +++ b/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java @@ -38,7 +38,7 @@ public void testRegisteringFromUserMenu() { // Go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validate(); + homePage.validateStructure(); // Assure not logged in status homePage.userMenu.validateNotLoggedIn(); diff --git a/src/test/java/posters/tests/smoke/RegisterTest.java b/src/test/java/posters/tests/smoke/RegisterTest.java index c91c23d3..8d74e72d 100644 --- a/src/test/java/posters/tests/smoke/RegisterTest.java +++ b/src/test/java/posters/tests/smoke/RegisterTest.java @@ -47,7 +47,7 @@ public void testRegistering() { // Go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validate(); + homePage.validateStructure(); // Assure that nobody is logged in homePage.userMenu.validateNotLoggedIn(); diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 9dbba0a9..5938ce98 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -34,7 +34,7 @@ public void testOrderingAsRegisteredUser() // Go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validate(); + homePage.validateStructure(); // Assure not logged in status homePage.userMenu.validateNotLoggedIn(); diff --git a/src/test/java/posters/tests/smoke/SearchTest.java b/src/test/java/posters/tests/smoke/SearchTest.java index 6cd6c9ea..f3229bb2 100644 --- a/src/test/java/posters/tests/smoke/SearchTest.java +++ b/src/test/java/posters/tests/smoke/SearchTest.java @@ -12,11 +12,9 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; +import posters.pageobjects.pages.browsing.AbstractBrowsingPage; import posters.tests.AbstractTest; -/** - * @author pfotenhauer - */ @Owner("Tim Brown") @Severity(SeverityLevel.MINOR) @Tag("smoke") @@ -41,30 +39,38 @@ public void setup() @DataSet(1) public void testSearching() { - // Go to homepage + // go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validate(); - // Search + // go to category page var categoryPage = homePage.search.categoryPageResult(searchTerm); categoryPage.validateStructure(); categoryPage.validateSearchHits(searchTerm, searchTermExpectedCount); + validateHeaderAndFooter(categoryPage); + //go to product detail page final String productName = categoryPage.getProductNameByPosition(position); var productDetailPage = categoryPage.clickProductByPosition(position); productDetailPage.validate(productName); + validateHeaderAndFooter(productDetailPage); } @Test @DataSet(2) public void testSearchingWithoutResult() { - // Go to homepage + // go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validate(); - // Search - var noHitsPage = homePage.search.noResult(searchTerm); - noHitsPage.validate(); + // go to no hits page + var noHitsPage = homePage.search.noHitsPageResult(searchTerm); + noHitsPage.validateStructure(); + validateHeaderAndFooter(noHitsPage); + } + + public void validateHeaderAndFooter(AbstractBrowsingPage page) + { + page.header.validateStructure(); + page.footer.validateStructure(); } } From 94ef47ca802f8245deb24b0a90662bc5380c8324 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 24 Jul 2023 16:29:30 +0200 Subject: [PATCH 04/44] cleaned AddToCartPage, related pages and component --- .../java/posters/dataobjects/Product.java | 56 +++----- .../components/CheckoutHeader.java | 3 - .../pageobjects/components/Header.java | 2 - .../pageobjects/components/MiniCart.java | 128 +++++++---------- .../pageobjects/components/SaleBanner.java | 2 - .../pageobjects/components/Search.java | 38 ++--- .../pageobjects/components/TopNavigation.java | 76 +++++----- .../pages/browsing/CategoryPage.java | 40 +++--- .../pages/browsing/ProductDetailPage.java | 68 +++++---- .../pageobjects/pages/checkout/CartPage.java | 130 ++++++++---------- .../pageobjects/utility/PriceHelper.java | 47 +++---- .../posters/tests/smoke/AddToCartTest.java | 65 ++++++--- .../tests/testdata/AddToCartTestData.java | 29 ++++ .../posters/tests/smoke/AddToCartTest.json | 4 +- 14 files changed, 331 insertions(+), 357 deletions(-) create mode 100644 src/test/java/posters/tests/testdata/AddToCartTestData.java diff --git a/src/test/java/posters/dataobjects/Product.java b/src/test/java/posters/dataobjects/Product.java index debf559a..1b6abf23 100644 --- a/src/test/java/posters/dataobjects/Product.java +++ b/src/test/java/posters/dataobjects/Product.java @@ -4,9 +4,6 @@ import posters.pageobjects.utility.PriceHelper; -/** - * @author pfotenhauer - */ public class Product { String name; @@ -19,18 +16,6 @@ public class Product int amount; - /** - * @param name - * the name to set - * @param unitPrice - * the unitPrice to set - * @param style - * the style to set - * @param size - * the size to set - * @param amount - * the amount to set - */ public Product(String name, String unitPrice, String style, String size, int amount) { this.name = name; @@ -40,46 +25,47 @@ public Product(String name, String unitPrice, String style, String size, int amo this.amount = amount; } - /** - * @return the name - */ + // ----- get product data ----- // + public String getName() { return name; } - /** - * @return the unitPrice - */ public String getUnitPrice() { return unitPrice; } - /** - * @return the style - */ public String getStyle() { return style; } - /** - * @return the size - */ public String getSize() { return size; } - /** - * @return the amount - */ public int getAmount() { return amount; } + // ----- get total product price ----- // + + private double getUnitPriceDouble() + { + return Double.parseDouble(PriceHelper.removeCurrency(unitPrice)); + } + + public double getTotalPrice() + { + return amount * getUnitPriceDouble(); + } + + // ------------------------------------------------------------- + @Override public String toString() { @@ -117,14 +103,4 @@ public String getCartRowRegex() + ",\\s" + getSize() + "\\s\\)\\n\\$\\d+\\.\\d+"; } - - private double getUnitPriceDouble() - { - return Double.parseDouble(PriceHelper.removeCurrency(unitPrice)); - } - - public double getTotalPrice() - { - return amount * getUnitPriceDouble(); - } } diff --git a/src/test/java/posters/pageobjects/components/CheckoutHeader.java b/src/test/java/posters/pageobjects/components/CheckoutHeader.java index 97dc1960..6ca6a749 100644 --- a/src/test/java/posters/pageobjects/components/CheckoutHeader.java +++ b/src/test/java/posters/pageobjects/components/CheckoutHeader.java @@ -3,9 +3,6 @@ import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Selenide.$; -/** - * @author pfotenhauer - */ public class CheckoutHeader extends AbstractComponent { public void isComponentAvailable() diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index eff0fd89..fd7a9880 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -15,11 +15,9 @@ public void isComponentAvailable() $("#globalNavigation").should(exist); } - // extended by Jonas @Step("validate structure header") public void validateStructure() { - // validate company logo $("#brand").shouldBe(visible); Search.validateStructure(); diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 64945c76..e60396c8 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -39,7 +39,7 @@ public void isComponentAvailable() { $("#btnCartOverviewForm").should(exist); } - + @Step("validate shopping cart menu") public static void validateStructure() { @@ -61,37 +61,72 @@ public static void validateStructure() $("#globalNavigation").hover(); } - // -------------------------------------------------------------- + // ----- mini cart navigation ------ // @Step("open the mini cart") public void openMiniCart() { - // Hover over the cart icon headerCart.hover(); - // Wait for mini cart to appear - // Wait for the mini cart to show - miniCart.waitUntil(visible, Neodymium.configuration().selenideTimeout()); } @Step("close the mini cart") public void closeMiniCart() { - // Move the mouse out of the area $("#brand").hover(); - // Wait for mini cart to disappear - // Wait for the mini cart to disappear - miniCart.waitUntil(not(visible), Neodymium.configuration().selenideTimeout()); } - + + @Step("validate the mini cart subtotal price") + public void validateSubtotal(String subtotal) + { + openMiniCart(); + subOrderPrice.shouldHave(exactText(subtotal)); + closeMiniCart(); + } + @Step("open the cart page") public CartPage openCartPage() { - - // Open the cart - // Click on the button to go to the Cart - goToCartButton.click(); + goToCartButton.click(); return new CartPage().isExpectedPage(); } + + // ----- validate product data in mini cart ----- // + + @Step("validate data o cart item in mini cart") + private void validateMiniCart(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) + { + openMiniCart(); + + // selector for product + SelenideElement miniCartItem = $$("#miniCartMenu .cartItems").get(position - 1); + + // validate product name is same as {productName} + miniCartItem.find(".prodName").shouldHave(exactText(productName)); + + // validate product style is same as {productStyle} + miniCartItem.find(".prodStyle").shouldHave(exactText(productStyle)); + + // validate product size is same as {productSize} + miniCartItem.find(".prodSize").shouldHave(exactText(productSize)); + + // validate product count is same as {productCount} + miniCartItem.find(".prodCount").shouldHave(exactText(Integer.toString(productCount))); + + // validate product prize is same as {productPrize} + miniCartItem.find(".prodPrice").shouldHave(exactText(prodTotalPrice)); + + closeMiniCart(); + } + + @Step("validate '{product}' in the mini cart") + public void validateMiniCart(int position, Product product) + { + validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), PriceHelper.format(product.getTotalPrice())); + } + + // -------------------------------------------------------------- + + @Step("get the total product count from mini cart") public int getTotalCount() @@ -119,31 +154,6 @@ public String getSubtotal() return subtotal; } - @Step("validate the mini cart subtotal price") - public void validateSubtotal(String subtotal) - { - // Verify the mini cart shows the specified subtotal - // Open mini cart - openMiniCart(); - // Verify subtotal equals specified subtotal - // Compare the subtotal to the parameter - subOrderPrice.shouldHave(exactText(subtotal)); - // Close Mini Cart - closeMiniCart(); - } - - /** - * @param position - * @param product - */ - - @Step("validate '{product}' in the mini cart") - public void validateMiniCart(int position, Product product) - { - validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), - PriceHelper.format(product.getTotalPrice())); - } - @Step("validate '{product}' in the mini cart by name") public void validateMiniCartByProduct(Product product) { @@ -155,42 +165,4 @@ public void validateMiniCartByProduct(Product product) productContainer.find(".prodCount").shouldHave(exactText(Integer.toString(product.getAmount()))); productContainer.find(".prodPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); } - - /** - * @param position - * @param product - * @param productAmount - * @param productTotalPrice - */ - @Step("validate '{product}' in the mini cart") - public void validateMiniCart(int position, Product product, int productAmount, String productTotalPrice) - { - validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), productAmount, productTotalPrice); - } - - private void validateMiniCart(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) - { - // Open the mini cart - openMiniCart(); - // Validate data of specified item - // Product Name - // ul.cartMiniElementList li:nth-child(" + position + ") ul.cartItems - SelenideElement miniCartItem = $$("#miniCartMenu .cartItems").get(position - 1); - // Compares the name of the cart item at position @{position} to the parameter - miniCartItem.find(".prodName").shouldHave(exactText(productName)); - // Product Style - // Compares the style of the cart item at position @{position} to the parameter - miniCartItem.find(".prodStyle").shouldHave(exactText(productStyle)); - // Product Size - // Compares the style of the cart item at position @{position} to the parameter - miniCartItem.find(".prodSize").shouldHave(exactText(productSize)); - // Amount - // Compares the amount of the cart item at position @{position} to the parameter - miniCartItem.find(".prodCount").shouldHave(exactText(Integer.toString(productCount))); - // Price - // Compares the price of the cart item at position @{position} to the parameter - miniCartItem.find(".prodPrice").shouldHave(exactText(prodTotalPrice)); - // Close mini cart - closeMiniCart(); - } } diff --git a/src/test/java/posters/pageobjects/components/SaleBanner.java b/src/test/java/posters/pageobjects/components/SaleBanner.java index 3965d3be..448f7087 100644 --- a/src/test/java/posters/pageobjects/components/SaleBanner.java +++ b/src/test/java/posters/pageobjects/components/SaleBanner.java @@ -17,14 +17,12 @@ public void isComponentAvailable() $(".sale").should(exist); } - // extended by Jonas @Step("validate strings sale banner") private static void validateSaleBanner(String text) { $$(".owl-stage").findBy(exactText(Neodymium.localizedText(text))).waitUntil(visible, 6500); } - // extended by Jonas @Step("validate sale banner") public static void validateStructure() { diff --git a/src/test/java/posters/pageobjects/components/Search.java b/src/test/java/posters/pageobjects/components/Search.java index c893ae32..a3a28e5e 100644 --- a/src/test/java/posters/pageobjects/components/Search.java +++ b/src/test/java/posters/pageobjects/components/Search.java @@ -30,18 +30,12 @@ public static void validateStructure() $(".icon-search").shouldBe(visible); } - @Step("search for {searchTerm} without result") - public NoHitsPage noHitsPageResult(String searchTerm) - { - search(searchTerm); - return new NoHitsPage().isExpectedPage(); - } - - @Step("search for {searchTerm} with result") - public CategoryPage categoryPageResult(String searchTerm) + // ----- search navigation ----- // + + @Step("open search field") + public void openSearch() { - search(searchTerm); - return new CategoryPage().isExpectedPage(); + searchField.scrollTo().click(); } @Step("search for {searchTerm}") @@ -50,17 +44,25 @@ public void search(String searchTerm) openSearch(); searchField.val(searchTerm).pressEnter(); } - - @Step("open search field") - public void openSearch() - { - searchField.scrollTo().click(); - } - + @Step("validate that {searchTerm} is still visible after") public void validateSearchTerm(String searchTerm) { openSearch(); searchField.shouldHave(exactValue(searchTerm)); } + + @Step("search for {searchTerm} without result") + public NoHitsPage noHitsPageResult(String searchTerm) + { + search(searchTerm); + return new NoHitsPage().isExpectedPage(); + } + + @Step("search for {searchTerm} with result") + public CategoryPage categoryPageResult(String searchTerm) + { + search(searchTerm); + return new CategoryPage().isExpectedPage(); + } } diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index ddd53c3e..23475059 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -2,7 +2,7 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchesText; +import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; @@ -11,6 +11,7 @@ import org.openqa.selenium.By; +import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -28,6 +29,8 @@ public void isComponentAvailable() categoryMenu.should(exist); } + // ----- validate content top navigation ----- // + @Step("validate structure top navigation") public static void validateStructure() { @@ -39,43 +42,60 @@ public static void validateStructure() // validate sub navigation "World Of Nature" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.worldOfNature"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.animals"); - validateSubNavComponent("header.worldOfNature", "header.flowers"); - validateSubNavComponent("header.worldOfNature", "header.trees"); + validateSubNavComponent("header.animals"); + validateSubNavComponent("header.flowers"); + validateSubNavComponent("header.trees"); // validate sub navigation "Dining" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.dining"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.coldCuts"); - validateSubNavComponent("header.worldOfNature", "header.mainDishes"); - validateSubNavComponent("header.worldOfNature", "header.sweets"); + validateSubNavComponent("header.coldCuts"); + validateSubNavComponent("header.mainDishes"); + validateSubNavComponent("header.sweets"); // validate sub navigation "Transportation" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.transportation"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.airTravel"); - validateSubNavComponent("header.worldOfNature", "header.classicCars"); - validateSubNavComponent("header.worldOfNature", "header.railways"); + validateSubNavComponent("header.airTravel"); + validateSubNavComponent("header.classicCars"); + validateSubNavComponent("header.railways"); // validate sub navigation "Panoramas" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.panoramas"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.architecture"); - validateSubNavComponent("header.worldOfNature", "header.fireworks"); - validateSubNavComponent("header.worldOfNature", "header.landscapes"); - validateSubNavComponent("header.worldOfNature", "header.xxlPanoramas"); + validateSubNavComponent("header.architecture"); + validateSubNavComponent("header.fireworks"); + validateSubNavComponent("header.landscapes"); + validateSubNavComponent("header.xxlPanoramas"); // close sub navigation $("#globalNavigation").hover(); } @Step("validate name of components in navigation") - public static void validateNavComponent(String component) + public static void validateNavComponent(String topCategory) { - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(component))).shouldBe(visible); + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).shouldBe(visible); } @Step("validate name of components in sub navigation") - public static void validateSubNavComponent(String component, String subComponent) + public static void validateSubNavComponent(String subCategory) + { + $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).shouldBe(visible); + } + + // ----- category navigation ------ // + + @Step("click on '{categoryName}' category") + public CategoryPage clickCategory(String topCategory) + { + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).scrollTo().click(); + return new CategoryPage().isExpectedPage(); + } + + @Step("click on a '{subCategoryName}' subcategory within '{categoryName}'") + public CategoryPage clickSubCategory(String topCategory, String subCategory) { - $$("ul.dropdown-menu li").findBy(matchesText(Neodymium.localizedText(subComponent))).shouldBe(visible); + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).hover(); + $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).click(); + return new CategoryPage().isExpectedPage(); } // ---------------------------------------------------------------- @@ -107,26 +127,6 @@ public CategoryPage clickSubCategoryByPosition(int categoryPosition, int subCate return new CategoryPage().isExpectedPage(); } - // TODO - check if needed - @Step("click on '{categoryName}' category") - public CategoryPage clickCategory(String categoryName) - { - $(By.linkText(categoryName)).scrollTo().click(); - return new CategoryPage().isExpectedPage(); - } - - // TODO - check if needed - @Step("click on a '{subCategoryName}' subcategory within '{categoryName}'") - public CategoryPage clickSubCategoryByNames(String categoryName, String subCategoryName) - { - // Open the category page - categoryMenu.find(By.linkText(categoryName)).hover(); - // Clicks the subcategory with position @{subCategoryPosition} - // belonging to the category with position @{categoryPosition} - categoryMenu.find(By.linkText(subCategoryName)).click(); - return new CategoryPage(); - } - // TODO - check if needed @Step("click on a product by name '{productName}'") public CategoryPage clickSubcategoryByName(String subCategoryName) diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index 49d3251b..bc291dc1 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -33,41 +33,51 @@ public CategoryPage isExpectedPage() return this; } + // ----- validate content category page ----- // + @Override @Step("validate category page structure") public void validateStructure() { super.validateStructure(); - + // validate poster count in headline is not 0 $("#totalProductCount").shouldNotBe(exactText("0")).shouldBe(visible); - + // validate at least 1 poster is displayed $("#product0").shouldBe(visible); } + @Step("validate category name {categoryName} is on category page") + public void validateCategoryName(String categoryName) + { + $("#titleCategoryName").shouldHave(matchText(Neodymium.localizedText(categoryName))); + } + + @Step("validate category page of category '{categoryName}'") + public void validate(String categoryName) + { + validateStructure(); + validateCategoryName(categoryName); + } + + // ----- product by position ----- // + @Step("get a product name by position") public String getProductNameByPosition(int position) { return $("#product" + (position - 1) + " h2").text(); } - + @Step("click on a product by position") public ProductDetailPage clickProductByPosition(int position) { $("#product" + (position - 1)).scrollTo().click(); return new ProductDetailPage().isExpectedPage(); } - + // ---------------------------------------------------------- - // TODO - check if needed - @Step("validate category name {categoryName} is on category page") - public void validateCategoryName(String categoryName) - { - $("#titleCategoryName").shouldHave(text(categoryName)); - } - // TODO - check if needed @Step("click on a product by position in grid") public ProductDetailPage clickProductByPosition(int row, int column) @@ -129,14 +139,6 @@ public void validateProductVisible(String productName) $("#productOverview .thumbnails .thumbnail a > img.pImage[title='" + productName + "']").shouldBe(visible); } - // TODO - check if needed - @Step("validate category page of category '{categoryName}'") - public void validate(String categoryName) - { - validateStructure(); - validateCategoryName(categoryName); - } - // TODO - check if needed @Step("validate category page of category '{categoryName}' and assert visually") public void validateAndVisualAssert(String categoryName) diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index b30ceb3b..9d5bbd5f 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -32,6 +32,8 @@ public ProductDetailPage isExpectedPage() return this; } + // ----- validate content product detail page ----- // + @Override @Step("validate product detail page structure") public void validateStructure() @@ -64,20 +66,21 @@ public void validateStructure() addToCartButton.shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.addToCartButton.text"))).shouldBe(visible); } - @Step("validate the product detail page of {productName}") - public void validate(String productName) - { - validateStructure(); - validateProductName(productName); - } - @Step("validate product name on product detail page") public void validateProductName(String name) { productName.shouldHave(exactText(name)); } - // ---------------------------------------------------------------------------------- + @Step("validate product name page of product '{productName}'") + public void validate(String productName) + { + validateStructure(); + validateProductName(productName); + } + + // ----- select product size/style, add to cart ----- // + @Step("select size") public void setSize(String size) { @@ -88,62 +91,57 @@ public void setSize(String size) public void setStyle(String style) { $(".radio #finish-" + style).selectRadio(style); - } - - @Step("add product to the cart") - public void addToCart() + + @Step("click add to cart button") + public void clickAddToCartButton() { addToCartButton.scrollTo().click(); - } - + @Step("add product with size:'{size}' and style:'{style}' to cart") public void addToCart(String size, String style) { - // Style - // Checks the chosen style. - setStyle(style); - // Size - // Selects the chosen size. setSize(size); - // Click the Add to cart button - addToCart(); + setStyle(style); + clickAddToCartButton(); } - + + // ----- get product details ----- // + @Step("get product name from product detail page") public String getProductName() { - // Get the product name to enable usage outside this module. return productName.text(); } - + + @Step("get product price from product detail page") + public String getProductPrice() + { + return productPrice.text(); + } + @Step("get selected product style from product detail page") public String getChosenStyle() { - // Get the style to enable usage outside this module. - return $(".radio input[name='finish']:checked").val(); + return $("input[name='finish']:checked").val(); } @Step("get selected product size from product detail page") public String getChosenSize() { - // Get the size to enable usage outside this module. return productSize.getSelectedText(); } - - @Step("get product price from product detail page") - public String getProductPrice() - { - // Get the product price to enable usage outside this module. - return productPrice.text(); - } - + @Step("get product details from product detail page") public Product getProduct() { return new Product(getProductName(), getProductPrice(), getChosenStyle(), getChosenSize(), 1); } + + + // ---------------------------------------------------------------------------------- + @Step("validate the product detail page of '{productName}' and assert visually") public void validateAndVisualAssert(String productName) diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 63696510..ce74382a 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -22,9 +22,6 @@ import posters.pageobjects.pages.browsing.ProductDetailPage; import posters.pageobjects.utility.PriceHelper; -/** - * @author pfotenhauer - */ public class CartPage extends AbstractBrowsingPage { private SelenideElement cartTable = $("#cartOverviewTable"); @@ -39,109 +36,92 @@ public CartPage isExpectedPage() $("#titleCart").shouldBe(visible); return this; } - - @Step("validate subtotal in the cart") - public void validateSubtotal(String subtotal) - { - $$("#cartSummaryList li").findBy(text("Subtotal")).find(".text-right").shouldHave(exactText(subtotal)); - } - + + // ----- validate content cart page ----- // + @Override @Step("validate cart page structure") public void validateStructure() { super.validateStructure(); - // Headline - // Makes sure the headline is there and starts with a capital letter + // validate title $("#titleCart").shouldBe(matchText("[A-Z].{3,}")); - // Assert there is an item list with at least one item present - // Makes sure the list of cart items is there + + // validate product list cartTable.shouldBe(visible); - // Makes sure there's at least one product in the item list + + // validate at least 1 product in product list $("#product0").shouldBe(visible); - // Assert the cart summary is visible - // Makes sure the price breakdown list is there + + // validate cart summary list $("#cartSummaryList").shouldBe(visible); - // Checkout Button - // Makes sure the checkout button is there. + + // validate checkut button $("#btnStartCheckout").should(exist); } - - @Step("validate product in the cart") - public void validateContainsProduct(Product product) - { - SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() - .parent().parent(); - productContainer.find(".productName").shouldHave(exactText(product.getName())); - productContainer.find(".productSize").shouldHave(exactText(product.getSize())); - productContainer.find(".productStyle").shouldHave(exactText(product.getStyle())); - productContainer.find(".productCount").shouldHave(value(Integer.toString(product.getAmount()))); - productContainer.find(".productUnitPrice").shouldHave(exactText(product.getUnitPrice())); - productContainer.find(".productTotalUnitPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); - } - + @Step("validate shipping costs on cart page") public void validateShippingCosts(String shippingCosts) { - // Assert the correct shipping price is shown $("#orderShippingCosts").shouldHave(exactText(shippingCosts)); } - - /** - * @param shippingCosts - */ + @Step("validate cart page with shipping costs: '{shippingCosts}'") public void validate(String shippingCosts) { validateStructure(); validateShippingCosts(shippingCosts); } + + // ----- validate product data in cart item ----- // - /** - * @param position - * @param product - */ + private void validateCartItem(int position, String productName, String productStyle, String productSize, int productAmount, String productPrice) + { + // selector for product + SelenideElement productContainer = $("#product" + (position - 1)); + + // validate product name is same as {productName} + productContainer.find(".productName").shouldHave(exactText(productName)); + + // validate product style is same as {productStyle} + productContainer.find(".productStyle").shouldHave(exactText(productStyle)); + + // validate product size is same as {productSize} + productContainer.find(".productSize").shouldHave(exactText(productSize)); + + // validate product amount is same as {productAmount} + productContainer.find(".productCount").shouldHave(exactValue(Integer.toString(productAmount))); + + // validate product name is same as {productName} + productContainer.find(".productUnitPrice").shouldHave(exactText(productPrice)); + } + @Step("validate '{product}' in on the cart page") public void validateCartItem(int position, Product product) { - validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), - product.getUnitPrice()); + validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), product.getUnitPrice()); } - - /** - * @param position - * @param product - * @param productAmount - */ - @Step("validate '{product}' in on the cart page") - public void validateCartItem(int position, Product product, int productAmount) + + // ----------------------------------------------------------------------------- // + + @Step("validate subtotal in the cart") + public void validateSubtotal(String subtotal) { - validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), - productAmount, product.getUnitPrice()); + $$("#cartSummaryList li").findBy(text("Subtotal")).find(".text-right").shouldHave(exactText(subtotal)); } - private void validateCartItem(int position, String productName, String productStyle, String productSize, int productAmount, String productPrice) + @Step("validate product in the cart") + public void validateContainsProduct(Product product) { - SelenideElement productContainer = $("#product" + (position - 1)); - // Visibility - // Makes sure a product at the specified index exists and is visible - productContainer.shouldBe(visible); - // Name - // Compares the displayed name with the parameter - productContainer.find(".productName").shouldHave(exactText(productName)); - // Count - // Compares the displayed amount with the parameter - validateProductAmount(position, productAmount); - // Style - // Compares the displayed style with the parameter - productContainer.find(".productStyle").shouldHave(exactText(productStyle)); - // Size - // Compares the displayed style with the parameter - productContainer.find(".productSize").shouldHave(exactText(productSize)); - // Price - // Compares the displayed price with the parameter - productContainer.find(".productUnitPrice").shouldHave(exactText(productPrice)); + SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() + .parent().parent(); + productContainer.find(".productName").shouldHave(exactText(product.getName())); + productContainer.find(".productSize").shouldHave(exactText(product.getSize())); + productContainer.find(".productStyle").shouldHave(exactText(product.getStyle())); + productContainer.find(".productCount").shouldHave(value(Integer.toString(product.getAmount()))); + productContainer.find(".productUnitPrice").shouldHave(exactText(product.getUnitPrice())); + productContainer.find(".productTotalUnitPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); } @Step("validate sub total and line item total after adding on the cart page") @@ -173,12 +153,14 @@ public void validateSubAndLineItemTotalAfterAdd(int position, String oldSubTotal Assert.assertEquals(price, price2); } + /* TODO - check if needed @Step("validate line item amount on the cart page") public void validateProductAmount(int position, int amount) { // Makes sure the amount of the item with index @{index} in the cart equals the parameter $("#product" + (position - 1) + " .productCount").shouldHave(exactValue(Integer.toString(amount))); } + */ @Step("get product name from line item on the cart page") public String getProductName(int position) diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index 8a481717..f1f62840 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -4,48 +4,45 @@ import java.text.DecimalFormatSymbols; import java.util.Locale; -/** - * @author pfotenhauer - */ +import io.qameta.allure.Step; + public class PriceHelper { public final static String CURRENCY = "$"; private final static DecimalFormat decimalFormat = new DecimalFormat("##0.00", new DecimalFormatSymbols(Locale.US)); - // Calculate units * price per unit - // calculates price per 1 unit * amount, rounds it to 2 decimals (to avoid things like 19.9 instead of 19.90) - public static String computeRowPrice(String unitPrice, String quantity) + @Step("remove $ from {price}") + public static String removeCurrency(String price) { - double res = (double) (Math.round(Double.valueOf(removeCurrency(unitPrice)) * Double.valueOf(quantity) * 100)) / 100; - return format(res); + return price.substring(1); } - - // Subtracts the old subtotal from the new one, rounds the result to 2 decimals (to avoid things like 19.9 - // instead of 19.90) and compares it to the price of the new item - public static String subtractFromPrice(String from, String value) + + @Step("add $ to {price}") + public static String addCurrency(String price) { - double res = (double) (Math.round((Double.valueOf(removeCurrency(from)) - Double.valueOf(removeCurrency(value))) * 100)) / 100; - return format(res); + return CURRENCY + price; } - + + @Step("get formatted {price}") public static String format(double input) { return addCurrency(decimalFormat.format(input)); } - - public static String removeCurrency(String price) + + @Step("calculate ({unitPrice} * {quantity} * 100) / 100 -> ensure two decimal places") + public static String computeRowPrice(String unitPrice, String quantity) { - String s = price.substring(1); - return s; + double res = (double) (Math.round(Double.valueOf(removeCurrency(unitPrice)) * Double.valueOf(quantity) * 100)) / 100; + return format(res); } - /** - * @param price - * @return - */ - public static String addCurrency(String price) + // TODO - understand use + // Subtracts the old subtotal from the new one, rounds the result to 2 decimals (to avoid things like 19.9 + // instead of 19.90) and compares it to the price of the new item + public static String subtractFromPrice(String from, String value) { - return CURRENCY + price; + double res = (double) (Math.round((Double.valueOf(removeCurrency(from)) - Double.valueOf(removeCurrency(value))) * 100)) / 100; + return format(res); } } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 66851ec5..f49d4cae 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -1,7 +1,12 @@ package posters.tests.smoke; import org.junit.Test; +import org.openqa.selenium.By; +import static com.codeborne.selenide.Selenide.$; + +import com.codeborne.selenide.Selenide; +import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; @@ -10,6 +15,7 @@ import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; +import posters.tests.testdata.AddToCartTestData; @Owner("Joe Fix") @Severity(SeverityLevel.CRITICAL) @@ -19,40 +25,54 @@ public class AddToCartTest extends AbstractTest @Test public void testAddProductsToCart() { - final String shippingCosts = Neodymium.dataValue("shippingCosts"); - int totalCount = 0; + // use test data class + AddToCartTestData addToCartTestData = DataUtils.get(AddToCartTestData.class); - // Go to homepage + // go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validateStructure(); - + + // validate empty mini cart window + int totalCount = 0; homePage.miniCart.validateTotalCount(totalCount); homePage.miniCart.validateSubtotal("$0.00"); + + // ??? final String oldSubtotal = homePage.miniCart.getSubtotal(); - // Go to a top category page - final String topCatName = Neodymium.dataValue("topCatName"); - var categoryPage = homePage.topNav.clickCategory(topCatName); - categoryPage.validateCategoryName(topCatName); - - // Go to sub category page - final String categoryName = categoryPage.topNav.getSubCategoryNameByPosition(1, 1); - categoryPage = categoryPage.topNav.clickSubCategoryByPosition(1, 1); - categoryPage.validate(categoryName); - - // Go to product page and add to cart - final String productName = categoryPage.getProductNameByPosition(1, 1); - var productDetailPage = categoryPage.clickProductByPosition(1, 1); + // go to top category page {topCategory} + final String topCategory = addToCartTestData.getTopCategory(); + var categoryPage = homePage.topNav.clickCategory(topCategory); + categoryPage.validate(topCategory); + + // go to sub category page {subCategory} + final String subCategory = addToCartTestData.getSubCategory(); + var subCategoryPage = categoryPage.topNav.clickSubCategory(topCategory, subCategory); + subCategoryPage.validate(subCategory); + + // go to product page + final String productName = categoryPage.getProductNameByPosition(addToCartTestData.getPosition()); + var productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getPosition()); productDetailPage.validate(productName); + + // add product to cart productDetailPage.addToCart("16 x 12 in", "matte"); - - // Go to cart and validate + + // go to cart final var product = productDetailPage.getProduct(); var cartPage = productDetailPage.miniCart.openCartPage(); + + // validate cart page + final String shippingCosts = Neodymium.dataValue("shippingCosts"); cartPage.validate(shippingCosts); - cartPage.miniCart.validateMiniCart(1, product); - cartPage.validateCartItem(1, product); + cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); + cartPage.validateCartItem(addToCartTestData.getPosition(), product); + + + + // ---------------------------------------------------------------- + + /* cartPage.validateSubAndLineItemTotalAfterAdd(1, oldSubtotal, 0.00); final String oldSubtotal2 = cartPage.miniCart.getSubtotal(); @@ -116,5 +136,6 @@ public void testAddProductsToCart() cartPage.validateCartItem(1, productFromCartPage, 2); cartPage.miniCart.validateTotalCount(++totalCount); + */ } } diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/AddToCartTestData.java new file mode 100644 index 00000000..a4752872 --- /dev/null +++ b/src/test/java/posters/tests/testdata/AddToCartTestData.java @@ -0,0 +1,29 @@ +package posters.tests.testdata; + +public class AddToCartTestData +{ + private String topCategory; + private String subCategory; + private int position; + private String searchTerm; + + public String getTopCategory() + { + return topCategory; + } + + public String getSubCategory() + { + return subCategory; + } + + public int getPosition() + { + return position; + } + + public String getSearchTerm() + { + return searchTerm; + } +} \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/AddToCartTest.json b/src/test/resources/posters/tests/smoke/AddToCartTest.json index 9bb835de..50855345 100644 --- a/src/test/resources/posters/tests/smoke/AddToCartTest.json +++ b/src/test/resources/posters/tests/smoke/AddToCartTest.json @@ -1,6 +1,8 @@ [ { - "topCatName": "World of Nature", + "topCategory": "header.worldOfNature", + "subCategory": "header.animals", + "position": "1", "searchTerm": "pizza" } ] From e49cc9c6eb010a57b9bc25552a5b7567bc380810 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 24 Jul 2023 16:29:30 +0200 Subject: [PATCH 05/44] cleaned AddToCartPage, related pages and components --- .../java/posters/dataobjects/Product.java | 56 +++----- .../components/CheckoutHeader.java | 3 - .../pageobjects/components/Header.java | 2 - .../pageobjects/components/MiniCart.java | 128 +++++++---------- .../pageobjects/components/SaleBanner.java | 2 - .../pageobjects/components/Search.java | 38 ++--- .../pageobjects/components/TopNavigation.java | 76 +++++----- .../pages/browsing/CategoryPage.java | 40 +++--- .../pages/browsing/ProductDetailPage.java | 68 +++++---- .../pageobjects/pages/checkout/CartPage.java | 130 ++++++++---------- .../pageobjects/utility/PriceHelper.java | 47 +++---- .../posters/tests/smoke/AddToCartTest.java | 65 ++++++--- .../tests/testdata/AddToCartTestData.java | 29 ++++ .../posters/tests/smoke/AddToCartTest.json | 4 +- 14 files changed, 331 insertions(+), 357 deletions(-) create mode 100644 src/test/java/posters/tests/testdata/AddToCartTestData.java diff --git a/src/test/java/posters/dataobjects/Product.java b/src/test/java/posters/dataobjects/Product.java index debf559a..1b6abf23 100644 --- a/src/test/java/posters/dataobjects/Product.java +++ b/src/test/java/posters/dataobjects/Product.java @@ -4,9 +4,6 @@ import posters.pageobjects.utility.PriceHelper; -/** - * @author pfotenhauer - */ public class Product { String name; @@ -19,18 +16,6 @@ public class Product int amount; - /** - * @param name - * the name to set - * @param unitPrice - * the unitPrice to set - * @param style - * the style to set - * @param size - * the size to set - * @param amount - * the amount to set - */ public Product(String name, String unitPrice, String style, String size, int amount) { this.name = name; @@ -40,46 +25,47 @@ public Product(String name, String unitPrice, String style, String size, int amo this.amount = amount; } - /** - * @return the name - */ + // ----- get product data ----- // + public String getName() { return name; } - /** - * @return the unitPrice - */ public String getUnitPrice() { return unitPrice; } - /** - * @return the style - */ public String getStyle() { return style; } - /** - * @return the size - */ public String getSize() { return size; } - /** - * @return the amount - */ public int getAmount() { return amount; } + // ----- get total product price ----- // + + private double getUnitPriceDouble() + { + return Double.parseDouble(PriceHelper.removeCurrency(unitPrice)); + } + + public double getTotalPrice() + { + return amount * getUnitPriceDouble(); + } + + // ------------------------------------------------------------- + @Override public String toString() { @@ -117,14 +103,4 @@ public String getCartRowRegex() + ",\\s" + getSize() + "\\s\\)\\n\\$\\d+\\.\\d+"; } - - private double getUnitPriceDouble() - { - return Double.parseDouble(PriceHelper.removeCurrency(unitPrice)); - } - - public double getTotalPrice() - { - return amount * getUnitPriceDouble(); - } } diff --git a/src/test/java/posters/pageobjects/components/CheckoutHeader.java b/src/test/java/posters/pageobjects/components/CheckoutHeader.java index 97dc1960..6ca6a749 100644 --- a/src/test/java/posters/pageobjects/components/CheckoutHeader.java +++ b/src/test/java/posters/pageobjects/components/CheckoutHeader.java @@ -3,9 +3,6 @@ import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Selenide.$; -/** - * @author pfotenhauer - */ public class CheckoutHeader extends AbstractComponent { public void isComponentAvailable() diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index eff0fd89..fd7a9880 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -15,11 +15,9 @@ public void isComponentAvailable() $("#globalNavigation").should(exist); } - // extended by Jonas @Step("validate structure header") public void validateStructure() { - // validate company logo $("#brand").shouldBe(visible); Search.validateStructure(); diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 64945c76..e60396c8 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -39,7 +39,7 @@ public void isComponentAvailable() { $("#btnCartOverviewForm").should(exist); } - + @Step("validate shopping cart menu") public static void validateStructure() { @@ -61,37 +61,72 @@ public static void validateStructure() $("#globalNavigation").hover(); } - // -------------------------------------------------------------- + // ----- mini cart navigation ------ // @Step("open the mini cart") public void openMiniCart() { - // Hover over the cart icon headerCart.hover(); - // Wait for mini cart to appear - // Wait for the mini cart to show - miniCart.waitUntil(visible, Neodymium.configuration().selenideTimeout()); } @Step("close the mini cart") public void closeMiniCart() { - // Move the mouse out of the area $("#brand").hover(); - // Wait for mini cart to disappear - // Wait for the mini cart to disappear - miniCart.waitUntil(not(visible), Neodymium.configuration().selenideTimeout()); } - + + @Step("validate the mini cart subtotal price") + public void validateSubtotal(String subtotal) + { + openMiniCart(); + subOrderPrice.shouldHave(exactText(subtotal)); + closeMiniCart(); + } + @Step("open the cart page") public CartPage openCartPage() { - - // Open the cart - // Click on the button to go to the Cart - goToCartButton.click(); + goToCartButton.click(); return new CartPage().isExpectedPage(); } + + // ----- validate product data in mini cart ----- // + + @Step("validate data o cart item in mini cart") + private void validateMiniCart(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) + { + openMiniCart(); + + // selector for product + SelenideElement miniCartItem = $$("#miniCartMenu .cartItems").get(position - 1); + + // validate product name is same as {productName} + miniCartItem.find(".prodName").shouldHave(exactText(productName)); + + // validate product style is same as {productStyle} + miniCartItem.find(".prodStyle").shouldHave(exactText(productStyle)); + + // validate product size is same as {productSize} + miniCartItem.find(".prodSize").shouldHave(exactText(productSize)); + + // validate product count is same as {productCount} + miniCartItem.find(".prodCount").shouldHave(exactText(Integer.toString(productCount))); + + // validate product prize is same as {productPrize} + miniCartItem.find(".prodPrice").shouldHave(exactText(prodTotalPrice)); + + closeMiniCart(); + } + + @Step("validate '{product}' in the mini cart") + public void validateMiniCart(int position, Product product) + { + validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), PriceHelper.format(product.getTotalPrice())); + } + + // -------------------------------------------------------------- + + @Step("get the total product count from mini cart") public int getTotalCount() @@ -119,31 +154,6 @@ public String getSubtotal() return subtotal; } - @Step("validate the mini cart subtotal price") - public void validateSubtotal(String subtotal) - { - // Verify the mini cart shows the specified subtotal - // Open mini cart - openMiniCart(); - // Verify subtotal equals specified subtotal - // Compare the subtotal to the parameter - subOrderPrice.shouldHave(exactText(subtotal)); - // Close Mini Cart - closeMiniCart(); - } - - /** - * @param position - * @param product - */ - - @Step("validate '{product}' in the mini cart") - public void validateMiniCart(int position, Product product) - { - validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), - PriceHelper.format(product.getTotalPrice())); - } - @Step("validate '{product}' in the mini cart by name") public void validateMiniCartByProduct(Product product) { @@ -155,42 +165,4 @@ public void validateMiniCartByProduct(Product product) productContainer.find(".prodCount").shouldHave(exactText(Integer.toString(product.getAmount()))); productContainer.find(".prodPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); } - - /** - * @param position - * @param product - * @param productAmount - * @param productTotalPrice - */ - @Step("validate '{product}' in the mini cart") - public void validateMiniCart(int position, Product product, int productAmount, String productTotalPrice) - { - validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), productAmount, productTotalPrice); - } - - private void validateMiniCart(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) - { - // Open the mini cart - openMiniCart(); - // Validate data of specified item - // Product Name - // ul.cartMiniElementList li:nth-child(" + position + ") ul.cartItems - SelenideElement miniCartItem = $$("#miniCartMenu .cartItems").get(position - 1); - // Compares the name of the cart item at position @{position} to the parameter - miniCartItem.find(".prodName").shouldHave(exactText(productName)); - // Product Style - // Compares the style of the cart item at position @{position} to the parameter - miniCartItem.find(".prodStyle").shouldHave(exactText(productStyle)); - // Product Size - // Compares the style of the cart item at position @{position} to the parameter - miniCartItem.find(".prodSize").shouldHave(exactText(productSize)); - // Amount - // Compares the amount of the cart item at position @{position} to the parameter - miniCartItem.find(".prodCount").shouldHave(exactText(Integer.toString(productCount))); - // Price - // Compares the price of the cart item at position @{position} to the parameter - miniCartItem.find(".prodPrice").shouldHave(exactText(prodTotalPrice)); - // Close mini cart - closeMiniCart(); - } } diff --git a/src/test/java/posters/pageobjects/components/SaleBanner.java b/src/test/java/posters/pageobjects/components/SaleBanner.java index 3965d3be..448f7087 100644 --- a/src/test/java/posters/pageobjects/components/SaleBanner.java +++ b/src/test/java/posters/pageobjects/components/SaleBanner.java @@ -17,14 +17,12 @@ public void isComponentAvailable() $(".sale").should(exist); } - // extended by Jonas @Step("validate strings sale banner") private static void validateSaleBanner(String text) { $$(".owl-stage").findBy(exactText(Neodymium.localizedText(text))).waitUntil(visible, 6500); } - // extended by Jonas @Step("validate sale banner") public static void validateStructure() { diff --git a/src/test/java/posters/pageobjects/components/Search.java b/src/test/java/posters/pageobjects/components/Search.java index c893ae32..a3a28e5e 100644 --- a/src/test/java/posters/pageobjects/components/Search.java +++ b/src/test/java/posters/pageobjects/components/Search.java @@ -30,18 +30,12 @@ public static void validateStructure() $(".icon-search").shouldBe(visible); } - @Step("search for {searchTerm} without result") - public NoHitsPage noHitsPageResult(String searchTerm) - { - search(searchTerm); - return new NoHitsPage().isExpectedPage(); - } - - @Step("search for {searchTerm} with result") - public CategoryPage categoryPageResult(String searchTerm) + // ----- search navigation ----- // + + @Step("open search field") + public void openSearch() { - search(searchTerm); - return new CategoryPage().isExpectedPage(); + searchField.scrollTo().click(); } @Step("search for {searchTerm}") @@ -50,17 +44,25 @@ public void search(String searchTerm) openSearch(); searchField.val(searchTerm).pressEnter(); } - - @Step("open search field") - public void openSearch() - { - searchField.scrollTo().click(); - } - + @Step("validate that {searchTerm} is still visible after") public void validateSearchTerm(String searchTerm) { openSearch(); searchField.shouldHave(exactValue(searchTerm)); } + + @Step("search for {searchTerm} without result") + public NoHitsPage noHitsPageResult(String searchTerm) + { + search(searchTerm); + return new NoHitsPage().isExpectedPage(); + } + + @Step("search for {searchTerm} with result") + public CategoryPage categoryPageResult(String searchTerm) + { + search(searchTerm); + return new CategoryPage().isExpectedPage(); + } } diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index ddd53c3e..23475059 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -2,7 +2,7 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchesText; +import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; @@ -11,6 +11,7 @@ import org.openqa.selenium.By; +import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -28,6 +29,8 @@ public void isComponentAvailable() categoryMenu.should(exist); } + // ----- validate content top navigation ----- // + @Step("validate structure top navigation") public static void validateStructure() { @@ -39,43 +42,60 @@ public static void validateStructure() // validate sub navigation "World Of Nature" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.worldOfNature"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.animals"); - validateSubNavComponent("header.worldOfNature", "header.flowers"); - validateSubNavComponent("header.worldOfNature", "header.trees"); + validateSubNavComponent("header.animals"); + validateSubNavComponent("header.flowers"); + validateSubNavComponent("header.trees"); // validate sub navigation "Dining" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.dining"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.coldCuts"); - validateSubNavComponent("header.worldOfNature", "header.mainDishes"); - validateSubNavComponent("header.worldOfNature", "header.sweets"); + validateSubNavComponent("header.coldCuts"); + validateSubNavComponent("header.mainDishes"); + validateSubNavComponent("header.sweets"); // validate sub navigation "Transportation" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.transportation"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.airTravel"); - validateSubNavComponent("header.worldOfNature", "header.classicCars"); - validateSubNavComponent("header.worldOfNature", "header.railways"); + validateSubNavComponent("header.airTravel"); + validateSubNavComponent("header.classicCars"); + validateSubNavComponent("header.railways"); // validate sub navigation "Panoramas" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.panoramas"))).hover(); - validateSubNavComponent("header.worldOfNature", "header.architecture"); - validateSubNavComponent("header.worldOfNature", "header.fireworks"); - validateSubNavComponent("header.worldOfNature", "header.landscapes"); - validateSubNavComponent("header.worldOfNature", "header.xxlPanoramas"); + validateSubNavComponent("header.architecture"); + validateSubNavComponent("header.fireworks"); + validateSubNavComponent("header.landscapes"); + validateSubNavComponent("header.xxlPanoramas"); // close sub navigation $("#globalNavigation").hover(); } @Step("validate name of components in navigation") - public static void validateNavComponent(String component) + public static void validateNavComponent(String topCategory) { - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(component))).shouldBe(visible); + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).shouldBe(visible); } @Step("validate name of components in sub navigation") - public static void validateSubNavComponent(String component, String subComponent) + public static void validateSubNavComponent(String subCategory) + { + $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).shouldBe(visible); + } + + // ----- category navigation ------ // + + @Step("click on '{categoryName}' category") + public CategoryPage clickCategory(String topCategory) + { + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).scrollTo().click(); + return new CategoryPage().isExpectedPage(); + } + + @Step("click on a '{subCategoryName}' subcategory within '{categoryName}'") + public CategoryPage clickSubCategory(String topCategory, String subCategory) { - $$("ul.dropdown-menu li").findBy(matchesText(Neodymium.localizedText(subComponent))).shouldBe(visible); + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).hover(); + $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).click(); + return new CategoryPage().isExpectedPage(); } // ---------------------------------------------------------------- @@ -107,26 +127,6 @@ public CategoryPage clickSubCategoryByPosition(int categoryPosition, int subCate return new CategoryPage().isExpectedPage(); } - // TODO - check if needed - @Step("click on '{categoryName}' category") - public CategoryPage clickCategory(String categoryName) - { - $(By.linkText(categoryName)).scrollTo().click(); - return new CategoryPage().isExpectedPage(); - } - - // TODO - check if needed - @Step("click on a '{subCategoryName}' subcategory within '{categoryName}'") - public CategoryPage clickSubCategoryByNames(String categoryName, String subCategoryName) - { - // Open the category page - categoryMenu.find(By.linkText(categoryName)).hover(); - // Clicks the subcategory with position @{subCategoryPosition} - // belonging to the category with position @{categoryPosition} - categoryMenu.find(By.linkText(subCategoryName)).click(); - return new CategoryPage(); - } - // TODO - check if needed @Step("click on a product by name '{productName}'") public CategoryPage clickSubcategoryByName(String subCategoryName) diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index 49d3251b..bc291dc1 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -33,41 +33,51 @@ public CategoryPage isExpectedPage() return this; } + // ----- validate content category page ----- // + @Override @Step("validate category page structure") public void validateStructure() { super.validateStructure(); - + // validate poster count in headline is not 0 $("#totalProductCount").shouldNotBe(exactText("0")).shouldBe(visible); - + // validate at least 1 poster is displayed $("#product0").shouldBe(visible); } + @Step("validate category name {categoryName} is on category page") + public void validateCategoryName(String categoryName) + { + $("#titleCategoryName").shouldHave(matchText(Neodymium.localizedText(categoryName))); + } + + @Step("validate category page of category '{categoryName}'") + public void validate(String categoryName) + { + validateStructure(); + validateCategoryName(categoryName); + } + + // ----- product by position ----- // + @Step("get a product name by position") public String getProductNameByPosition(int position) { return $("#product" + (position - 1) + " h2").text(); } - + @Step("click on a product by position") public ProductDetailPage clickProductByPosition(int position) { $("#product" + (position - 1)).scrollTo().click(); return new ProductDetailPage().isExpectedPage(); } - + // ---------------------------------------------------------- - // TODO - check if needed - @Step("validate category name {categoryName} is on category page") - public void validateCategoryName(String categoryName) - { - $("#titleCategoryName").shouldHave(text(categoryName)); - } - // TODO - check if needed @Step("click on a product by position in grid") public ProductDetailPage clickProductByPosition(int row, int column) @@ -129,14 +139,6 @@ public void validateProductVisible(String productName) $("#productOverview .thumbnails .thumbnail a > img.pImage[title='" + productName + "']").shouldBe(visible); } - // TODO - check if needed - @Step("validate category page of category '{categoryName}'") - public void validate(String categoryName) - { - validateStructure(); - validateCategoryName(categoryName); - } - // TODO - check if needed @Step("validate category page of category '{categoryName}' and assert visually") public void validateAndVisualAssert(String categoryName) diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index b30ceb3b..9d5bbd5f 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -32,6 +32,8 @@ public ProductDetailPage isExpectedPage() return this; } + // ----- validate content product detail page ----- // + @Override @Step("validate product detail page structure") public void validateStructure() @@ -64,20 +66,21 @@ public void validateStructure() addToCartButton.shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.addToCartButton.text"))).shouldBe(visible); } - @Step("validate the product detail page of {productName}") - public void validate(String productName) - { - validateStructure(); - validateProductName(productName); - } - @Step("validate product name on product detail page") public void validateProductName(String name) { productName.shouldHave(exactText(name)); } - // ---------------------------------------------------------------------------------- + @Step("validate product name page of product '{productName}'") + public void validate(String productName) + { + validateStructure(); + validateProductName(productName); + } + + // ----- select product size/style, add to cart ----- // + @Step("select size") public void setSize(String size) { @@ -88,62 +91,57 @@ public void setSize(String size) public void setStyle(String style) { $(".radio #finish-" + style).selectRadio(style); - } - - @Step("add product to the cart") - public void addToCart() + + @Step("click add to cart button") + public void clickAddToCartButton() { addToCartButton.scrollTo().click(); - } - + @Step("add product with size:'{size}' and style:'{style}' to cart") public void addToCart(String size, String style) { - // Style - // Checks the chosen style. - setStyle(style); - // Size - // Selects the chosen size. setSize(size); - // Click the Add to cart button - addToCart(); + setStyle(style); + clickAddToCartButton(); } - + + // ----- get product details ----- // + @Step("get product name from product detail page") public String getProductName() { - // Get the product name to enable usage outside this module. return productName.text(); } - + + @Step("get product price from product detail page") + public String getProductPrice() + { + return productPrice.text(); + } + @Step("get selected product style from product detail page") public String getChosenStyle() { - // Get the style to enable usage outside this module. - return $(".radio input[name='finish']:checked").val(); + return $("input[name='finish']:checked").val(); } @Step("get selected product size from product detail page") public String getChosenSize() { - // Get the size to enable usage outside this module. return productSize.getSelectedText(); } - - @Step("get product price from product detail page") - public String getProductPrice() - { - // Get the product price to enable usage outside this module. - return productPrice.text(); - } - + @Step("get product details from product detail page") public Product getProduct() { return new Product(getProductName(), getProductPrice(), getChosenStyle(), getChosenSize(), 1); } + + + // ---------------------------------------------------------------------------------- + @Step("validate the product detail page of '{productName}' and assert visually") public void validateAndVisualAssert(String productName) diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 63696510..ce74382a 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -22,9 +22,6 @@ import posters.pageobjects.pages.browsing.ProductDetailPage; import posters.pageobjects.utility.PriceHelper; -/** - * @author pfotenhauer - */ public class CartPage extends AbstractBrowsingPage { private SelenideElement cartTable = $("#cartOverviewTable"); @@ -39,109 +36,92 @@ public CartPage isExpectedPage() $("#titleCart").shouldBe(visible); return this; } - - @Step("validate subtotal in the cart") - public void validateSubtotal(String subtotal) - { - $$("#cartSummaryList li").findBy(text("Subtotal")).find(".text-right").shouldHave(exactText(subtotal)); - } - + + // ----- validate content cart page ----- // + @Override @Step("validate cart page structure") public void validateStructure() { super.validateStructure(); - // Headline - // Makes sure the headline is there and starts with a capital letter + // validate title $("#titleCart").shouldBe(matchText("[A-Z].{3,}")); - // Assert there is an item list with at least one item present - // Makes sure the list of cart items is there + + // validate product list cartTable.shouldBe(visible); - // Makes sure there's at least one product in the item list + + // validate at least 1 product in product list $("#product0").shouldBe(visible); - // Assert the cart summary is visible - // Makes sure the price breakdown list is there + + // validate cart summary list $("#cartSummaryList").shouldBe(visible); - // Checkout Button - // Makes sure the checkout button is there. + + // validate checkut button $("#btnStartCheckout").should(exist); } - - @Step("validate product in the cart") - public void validateContainsProduct(Product product) - { - SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() - .parent().parent(); - productContainer.find(".productName").shouldHave(exactText(product.getName())); - productContainer.find(".productSize").shouldHave(exactText(product.getSize())); - productContainer.find(".productStyle").shouldHave(exactText(product.getStyle())); - productContainer.find(".productCount").shouldHave(value(Integer.toString(product.getAmount()))); - productContainer.find(".productUnitPrice").shouldHave(exactText(product.getUnitPrice())); - productContainer.find(".productTotalUnitPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); - } - + @Step("validate shipping costs on cart page") public void validateShippingCosts(String shippingCosts) { - // Assert the correct shipping price is shown $("#orderShippingCosts").shouldHave(exactText(shippingCosts)); } - - /** - * @param shippingCosts - */ + @Step("validate cart page with shipping costs: '{shippingCosts}'") public void validate(String shippingCosts) { validateStructure(); validateShippingCosts(shippingCosts); } + + // ----- validate product data in cart item ----- // - /** - * @param position - * @param product - */ + private void validateCartItem(int position, String productName, String productStyle, String productSize, int productAmount, String productPrice) + { + // selector for product + SelenideElement productContainer = $("#product" + (position - 1)); + + // validate product name is same as {productName} + productContainer.find(".productName").shouldHave(exactText(productName)); + + // validate product style is same as {productStyle} + productContainer.find(".productStyle").shouldHave(exactText(productStyle)); + + // validate product size is same as {productSize} + productContainer.find(".productSize").shouldHave(exactText(productSize)); + + // validate product amount is same as {productAmount} + productContainer.find(".productCount").shouldHave(exactValue(Integer.toString(productAmount))); + + // validate product name is same as {productName} + productContainer.find(".productUnitPrice").shouldHave(exactText(productPrice)); + } + @Step("validate '{product}' in on the cart page") public void validateCartItem(int position, Product product) { - validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), - product.getUnitPrice()); + validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), product.getUnitPrice()); } - - /** - * @param position - * @param product - * @param productAmount - */ - @Step("validate '{product}' in on the cart page") - public void validateCartItem(int position, Product product, int productAmount) + + // ----------------------------------------------------------------------------- // + + @Step("validate subtotal in the cart") + public void validateSubtotal(String subtotal) { - validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), - productAmount, product.getUnitPrice()); + $$("#cartSummaryList li").findBy(text("Subtotal")).find(".text-right").shouldHave(exactText(subtotal)); } - private void validateCartItem(int position, String productName, String productStyle, String productSize, int productAmount, String productPrice) + @Step("validate product in the cart") + public void validateContainsProduct(Product product) { - SelenideElement productContainer = $("#product" + (position - 1)); - // Visibility - // Makes sure a product at the specified index exists and is visible - productContainer.shouldBe(visible); - // Name - // Compares the displayed name with the parameter - productContainer.find(".productName").shouldHave(exactText(productName)); - // Count - // Compares the displayed amount with the parameter - validateProductAmount(position, productAmount); - // Style - // Compares the displayed style with the parameter - productContainer.find(".productStyle").shouldHave(exactText(productStyle)); - // Size - // Compares the displayed style with the parameter - productContainer.find(".productSize").shouldHave(exactText(productSize)); - // Price - // Compares the displayed price with the parameter - productContainer.find(".productUnitPrice").shouldHave(exactText(productPrice)); + SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() + .parent().parent(); + productContainer.find(".productName").shouldHave(exactText(product.getName())); + productContainer.find(".productSize").shouldHave(exactText(product.getSize())); + productContainer.find(".productStyle").shouldHave(exactText(product.getStyle())); + productContainer.find(".productCount").shouldHave(value(Integer.toString(product.getAmount()))); + productContainer.find(".productUnitPrice").shouldHave(exactText(product.getUnitPrice())); + productContainer.find(".productTotalUnitPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); } @Step("validate sub total and line item total after adding on the cart page") @@ -173,12 +153,14 @@ public void validateSubAndLineItemTotalAfterAdd(int position, String oldSubTotal Assert.assertEquals(price, price2); } + /* TODO - check if needed @Step("validate line item amount on the cart page") public void validateProductAmount(int position, int amount) { // Makes sure the amount of the item with index @{index} in the cart equals the parameter $("#product" + (position - 1) + " .productCount").shouldHave(exactValue(Integer.toString(amount))); } + */ @Step("get product name from line item on the cart page") public String getProductName(int position) diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index 8a481717..f1f62840 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -4,48 +4,45 @@ import java.text.DecimalFormatSymbols; import java.util.Locale; -/** - * @author pfotenhauer - */ +import io.qameta.allure.Step; + public class PriceHelper { public final static String CURRENCY = "$"; private final static DecimalFormat decimalFormat = new DecimalFormat("##0.00", new DecimalFormatSymbols(Locale.US)); - // Calculate units * price per unit - // calculates price per 1 unit * amount, rounds it to 2 decimals (to avoid things like 19.9 instead of 19.90) - public static String computeRowPrice(String unitPrice, String quantity) + @Step("remove $ from {price}") + public static String removeCurrency(String price) { - double res = (double) (Math.round(Double.valueOf(removeCurrency(unitPrice)) * Double.valueOf(quantity) * 100)) / 100; - return format(res); + return price.substring(1); } - - // Subtracts the old subtotal from the new one, rounds the result to 2 decimals (to avoid things like 19.9 - // instead of 19.90) and compares it to the price of the new item - public static String subtractFromPrice(String from, String value) + + @Step("add $ to {price}") + public static String addCurrency(String price) { - double res = (double) (Math.round((Double.valueOf(removeCurrency(from)) - Double.valueOf(removeCurrency(value))) * 100)) / 100; - return format(res); + return CURRENCY + price; } - + + @Step("get formatted {price}") public static String format(double input) { return addCurrency(decimalFormat.format(input)); } - - public static String removeCurrency(String price) + + @Step("calculate ({unitPrice} * {quantity} * 100) / 100 -> ensure two decimal places") + public static String computeRowPrice(String unitPrice, String quantity) { - String s = price.substring(1); - return s; + double res = (double) (Math.round(Double.valueOf(removeCurrency(unitPrice)) * Double.valueOf(quantity) * 100)) / 100; + return format(res); } - /** - * @param price - * @return - */ - public static String addCurrency(String price) + // TODO - understand use + // Subtracts the old subtotal from the new one, rounds the result to 2 decimals (to avoid things like 19.9 + // instead of 19.90) and compares it to the price of the new item + public static String subtractFromPrice(String from, String value) { - return CURRENCY + price; + double res = (double) (Math.round((Double.valueOf(removeCurrency(from)) - Double.valueOf(removeCurrency(value))) * 100)) / 100; + return format(res); } } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 66851ec5..f49d4cae 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -1,7 +1,12 @@ package posters.tests.smoke; import org.junit.Test; +import org.openqa.selenium.By; +import static com.codeborne.selenide.Selenide.$; + +import com.codeborne.selenide.Selenide; +import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; @@ -10,6 +15,7 @@ import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; +import posters.tests.testdata.AddToCartTestData; @Owner("Joe Fix") @Severity(SeverityLevel.CRITICAL) @@ -19,40 +25,54 @@ public class AddToCartTest extends AbstractTest @Test public void testAddProductsToCart() { - final String shippingCosts = Neodymium.dataValue("shippingCosts"); - int totalCount = 0; + // use test data class + AddToCartTestData addToCartTestData = DataUtils.get(AddToCartTestData.class); - // Go to homepage + // go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validateStructure(); - + + // validate empty mini cart window + int totalCount = 0; homePage.miniCart.validateTotalCount(totalCount); homePage.miniCart.validateSubtotal("$0.00"); + + // ??? final String oldSubtotal = homePage.miniCart.getSubtotal(); - // Go to a top category page - final String topCatName = Neodymium.dataValue("topCatName"); - var categoryPage = homePage.topNav.clickCategory(topCatName); - categoryPage.validateCategoryName(topCatName); - - // Go to sub category page - final String categoryName = categoryPage.topNav.getSubCategoryNameByPosition(1, 1); - categoryPage = categoryPage.topNav.clickSubCategoryByPosition(1, 1); - categoryPage.validate(categoryName); - - // Go to product page and add to cart - final String productName = categoryPage.getProductNameByPosition(1, 1); - var productDetailPage = categoryPage.clickProductByPosition(1, 1); + // go to top category page {topCategory} + final String topCategory = addToCartTestData.getTopCategory(); + var categoryPage = homePage.topNav.clickCategory(topCategory); + categoryPage.validate(topCategory); + + // go to sub category page {subCategory} + final String subCategory = addToCartTestData.getSubCategory(); + var subCategoryPage = categoryPage.topNav.clickSubCategory(topCategory, subCategory); + subCategoryPage.validate(subCategory); + + // go to product page + final String productName = categoryPage.getProductNameByPosition(addToCartTestData.getPosition()); + var productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getPosition()); productDetailPage.validate(productName); + + // add product to cart productDetailPage.addToCart("16 x 12 in", "matte"); - - // Go to cart and validate + + // go to cart final var product = productDetailPage.getProduct(); var cartPage = productDetailPage.miniCart.openCartPage(); + + // validate cart page + final String shippingCosts = Neodymium.dataValue("shippingCosts"); cartPage.validate(shippingCosts); - cartPage.miniCart.validateMiniCart(1, product); - cartPage.validateCartItem(1, product); + cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); + cartPage.validateCartItem(addToCartTestData.getPosition(), product); + + + + // ---------------------------------------------------------------- + + /* cartPage.validateSubAndLineItemTotalAfterAdd(1, oldSubtotal, 0.00); final String oldSubtotal2 = cartPage.miniCart.getSubtotal(); @@ -116,5 +136,6 @@ public void testAddProductsToCart() cartPage.validateCartItem(1, productFromCartPage, 2); cartPage.miniCart.validateTotalCount(++totalCount); + */ } } diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/AddToCartTestData.java new file mode 100644 index 00000000..a4752872 --- /dev/null +++ b/src/test/java/posters/tests/testdata/AddToCartTestData.java @@ -0,0 +1,29 @@ +package posters.tests.testdata; + +public class AddToCartTestData +{ + private String topCategory; + private String subCategory; + private int position; + private String searchTerm; + + public String getTopCategory() + { + return topCategory; + } + + public String getSubCategory() + { + return subCategory; + } + + public int getPosition() + { + return position; + } + + public String getSearchTerm() + { + return searchTerm; + } +} \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/AddToCartTest.json b/src/test/resources/posters/tests/smoke/AddToCartTest.json index 9bb835de..50855345 100644 --- a/src/test/resources/posters/tests/smoke/AddToCartTest.json +++ b/src/test/resources/posters/tests/smoke/AddToCartTest.json @@ -1,6 +1,8 @@ [ { - "topCatName": "World of Nature", + "topCategory": "header.worldOfNature", + "subCategory": "header.animals", + "position": "1", "searchTerm": "pizza" } ] From 8cd3c73cd12a155f631d1f1918a70291ef90e4fc Mon Sep 17 00:00:00 2001 From: jhoyer Date: Tue, 25 Jul 2023 17:52:40 +0200 Subject: [PATCH 06/44] further cleaned AddToCartTest, related pages and components --- config/localization.yaml | 2 +- .../pageobjects/components/MiniCart.java | 21 +- .../pages/browsing/CategoryPage.java | 52 +++-- .../pages/browsing/ProductDetailPage.java | 6 +- .../pageobjects/pages/checkout/CartPage.java | 186 ++++++++---------- .../pageobjects/utility/PriceHelper.java | 8 +- .../posters/tests/smoke/AddToCartTest.java | 138 +++++++------ .../posters/tests/smoke/GuestOrderTest.java | 2 +- .../tests/smoke/RegisteredOrderTest.java | 2 +- .../tests/testdata/AddToCartTestData.java | 12 ++ .../posters/tests/smoke/AddToCartTest.json | 4 +- 11 files changed, 223 insertions(+), 210 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index b5cb77e0..025eb8e4 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -32,7 +32,7 @@ default: text: Copyright (c) 2013-2020 Xceptance Software Technologies GmbH -- This software is for demo purposes only and not meant to be used in production. search: results: - text: Your results for your search + text: "Your results for your search: " HomePage: title: Posters - The Ultimate Online Shop validation: diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index e60396c8..f793d105 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -92,7 +92,7 @@ public CartPage openCartPage() // ----- validate product data in mini cart ----- // - @Step("validate data o cart item in mini cart") + @Step("validate data cart item in mini cart") private void validateMiniCart(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) { openMiniCart(); @@ -124,6 +124,19 @@ public void validateMiniCart(int position, Product product) validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), PriceHelper.format(product.getTotalPrice())); } + @Step("validate '{product}' in the mini cart") + public void validateMiniCart(int position, Product product, int productAmount, String productPrice) + { + validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), productAmount, productPrice); + } + + @Step("validate the mini cart total product count") + public void validateTotalCount(int totalCount) + { + totalCountElement.shouldHave(exactText(Integer.toString(totalCount))); + } + + // -------------------------------------------------------------- @@ -134,12 +147,6 @@ public int getTotalCount() return Integer.parseInt(totalCountElement.text()); } - @Step("validate the mini cart total product count") - public void validateTotalCount(int totalCount) - { - totalCountElement.shouldHave(exactText(Integer.toString(totalCount))); - } - @Step("get the subtotal price from mini cart") public String getSubtotal() { diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index bc291dc1..c7eba196 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -32,8 +32,8 @@ public CategoryPage isExpectedPage() productOverview.should(exist); return this; } - - // ----- validate content category page ----- // + + /// ----- validate content category page ----- /// @Override @Step("validate category page structure") @@ -47,22 +47,36 @@ public void validateStructure() // validate at least 1 poster is displayed $("#product0").shouldBe(visible); } - + @Step("validate category name {categoryName} is on category page") public void validateCategoryName(String categoryName) { $("#titleCategoryName").shouldHave(matchText(Neodymium.localizedText(categoryName))); } - + @Step("validate category page of category '{categoryName}'") public void validate(String categoryName) { validateStructure(); validateCategoryName(categoryName); } - - // ----- product by position ----- // + @Step("validate search results for '{searchTerm}' on category page") + public void validateSearchHits(String searchTerm, int searchTermExpectedCount) + { + // validate the headline + $("#titleSearchText").should(visible); + $("#titleSearchText").should(matchText(Neodymium.localizedText("search.results.text") + "'" + searchTerm + "' \\(" + searchTermExpectedCount + ".*\\)")); + + // validate visibility {searchTerm} after search + search.validateSearchTerm(searchTerm); + + // validate at least 1 search result + $("#product0").shouldBe(visible); + } + + /// ----- product by position ----- /// + @Step("get a product name by position") public String getProductNameByPosition(int position) { @@ -76,8 +90,10 @@ public ProductDetailPage clickProductByPosition(int position) return new ProductDetailPage().isExpectedPage(); } + // ---------------------------------------------------------- + // TODO - check if needed @Step("click on a product by position in grid") public ProductDetailPage clickProductByPosition(int row, int column) @@ -108,30 +124,6 @@ public ProductDetailPage clickProductByName(String productName) return new ProductDetailPage().isExpectedPage(); } - // TODO - check if needed - @Step("validate search results for '{searchTerm}' on category page") - public void validateSearchHits(String searchTerm, int searchTermExpectedCount) - { - $("#titleSearchText").should(exist); - // Validate the headline contains the search phrase - // \\(" + searchTermExpectedCount + " *\\) - $("#titleSearchText").should(matchText(Neodymium.localizedText("search.results.text") + ": '" + searchTerm + "' \\(" + searchTermExpectedCount - + ".*\\)")); - // Verify that the correct search term is displayed - // Validate the entered search phrase is still visible in the input - search.validateSearchTerm(searchTerm); - // Assert the Headline displays the search term. - $(".header-container #searchTextValue").shouldHave(exactText(searchTerm)); - // Verify there are search results - // There is at least one row of results - $("#productOverview #products .row").shouldBe(exist); - // There is at least one product in the results - $$("#productOverview .product-entry").shouldHave(sizeGreaterThan(0)); - // Verify that there is the specified amount of results - // The amount of products shown in the headline matches the expected value - $("#totalProductCount").shouldHave(exactText(Integer.toString(searchTermExpectedCount))); - } - // TODO - check if needed @Step("validate product '{productName}' is visible on category page") public void validateProductVisible(String productName) diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index 9d5bbd5f..ab1a3307 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -32,7 +32,7 @@ public ProductDetailPage isExpectedPage() return this; } - // ----- validate content product detail page ----- // + /// ----- validate content product detail page ----- /// @Override @Step("validate product detail page structure") @@ -79,7 +79,7 @@ public void validate(String productName) validateProductName(productName); } - // ----- select product size/style, add to cart ----- // + /// ----- select product size/style, add to cart ----- /// @Step("select size") public void setSize(String size) @@ -107,7 +107,7 @@ public void addToCart(String size, String style) clickAddToCartButton(); } - // ----- get product details ----- // + /// ----- get product details ----- /// @Step("get product name from product detail page") public String getProductName() diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index ce74382a..1625dbb6 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -36,37 +36,37 @@ public CartPage isExpectedPage() $("#titleCart").shouldBe(visible); return this; } - - // ----- validate content cart page ----- // - + + /// ----- validate content cart page ----- /// + @Override @Step("validate cart page structure") public void validateStructure() { super.validateStructure(); - // validate title + // validate title $("#titleCart").shouldBe(matchText("[A-Z].{3,}")); - + // validate product list cartTable.shouldBe(visible); - + // validate at least 1 product in product list $("#product0").shouldBe(visible); - + // validate cart summary list $("#cartSummaryList").shouldBe(visible); - + // validate checkut button $("#btnStartCheckout").should(exist); } - + @Step("validate shipping costs on cart page") public void validateShippingCosts(String shippingCosts) { $("#orderShippingCosts").shouldHave(exactText(shippingCosts)); } - + @Step("validate cart page with shipping costs: '{shippingCosts}'") public void validate(String shippingCosts) { @@ -74,7 +74,46 @@ public void validate(String shippingCosts) validateShippingCosts(shippingCosts); } - // ----- validate product data in cart item ----- // + @Step("validate sub total and line item total after adding on the cart page") + public void validateTotalAfterAdd(int position, String oldSubTotal, double totalPrice) + { + /// ----- validate total unit price of specified product ----- /// + + SelenideElement productContainer = $("#product" + (position - 1)); + + // store product unit price (without $ sign) for 1 unit + String unitPrice = PriceHelper.removeCurrency(productContainer.find(".unitPriceShort").text()); + + // store product count + String quantity = $("#productCount" + (position - 1)).val(); + + // calculate price of specified product + String subOrderPrice = PriceHelper.computeRowPrice(PriceHelper.addCurrency(unitPrice), quantity); + + // verify calculated unit price equals the displayed total unit price + productContainer.find(".productTotalUnitPrice").shouldHave(exactText(subOrderPrice)); + + /// ----- validate sub total ----- /// + + String newSubTotal = subTotal.text(); + + // new total - old total = price of item you just added + String productPrice = PriceHelper.subtractFromPrice(newSubTotal, oldSubTotal); + + // price difference for specific product after changing product amount + String productPriceAmountChange = PriceHelper.subtractFromPrice(subOrderPrice, PriceHelper.format(totalPrice)); + + // validate {price} equals {price2} + Assert.assertEquals(productPrice, productPriceAmountChange); + } + + /// ----- validate product data in cart item ----- /// + + @Step("validate item amount on the cart page") + public void validateProductAmount(int position, int amount) + { + $("#product" + (position - 1) + " .productCount").shouldHave(exactValue(Integer.toString(amount))); + } private void validateCartItem(int position, String productName, String productStyle, String productSize, int productAmount, String productPrice) { @@ -83,124 +122,67 @@ private void validateCartItem(int position, String productName, String productSt // validate product name is same as {productName} productContainer.find(".productName").shouldHave(exactText(productName)); - + // validate product style is same as {productStyle} productContainer.find(".productStyle").shouldHave(exactText(productStyle)); // validate product size is same as {productSize} productContainer.find(".productSize").shouldHave(exactText(productSize)); - + // validate product amount is same as {productAmount} - productContainer.find(".productCount").shouldHave(exactValue(Integer.toString(productAmount))); + validateProductAmount(position, productAmount); // validate product name is same as {productName} productContainer.find(".productUnitPrice").shouldHave(exactText(productPrice)); } - - @Step("validate '{product}' in on the cart page") + + @Step("validate '{product}' on the cart page") public void validateCartItem(int position, Product product) { validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), product.getUnitPrice()); } - // ----------------------------------------------------------------------------- // - - @Step("validate subtotal in the cart") - public void validateSubtotal(String subtotal) + @Step("validate '{product}' on the cart page") + public void validateCartItem(int position, Product product, int productAmount) { - $$("#cartSummaryList li").findBy(text("Subtotal")).find(".text-right").shouldHave(exactText(subtotal)); + validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), productAmount, product.getUnitPrice()); } - @Step("validate product in the cart") - public void validateContainsProduct(Product product) - { - SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() - .parent().parent(); - productContainer.find(".productName").shouldHave(exactText(product.getName())); - productContainer.find(".productSize").shouldHave(exactText(product.getSize())); - productContainer.find(".productStyle").shouldHave(exactText(product.getStyle())); - productContainer.find(".productCount").shouldHave(value(Integer.toString(product.getAmount()))); - productContainer.find(".productUnitPrice").shouldHave(exactText(product.getUnitPrice())); - productContainer.find(".productTotalUnitPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); - } - - @Step("validate sub total and line item total after adding on the cart page") - public void validateSubAndLineItemTotalAfterAdd(int position, String oldSubTotal, double totalPrice) - { - SelenideElement productContainer = $("#product" + (position - 1)); - // Store unit price (without $ sign) - // Takes the price per 1 unit of the specified item - String unitPriceShort_varDynamic = PriceHelper.removeCurrency(productContainer.find(".unitPriceShort").text()); - // Store product count - // Takes the amount of the specified item - String quantity_varDynamic = $("#productCount" + (position - 1)).val(); - - String subOrderPrice = PriceHelper.computeRowPrice(PriceHelper.addCurrency(unitPriceShort_varDynamic), quantity_varDynamic); - - // Verify calculated cost is the shown cost - // Compare calculated Unit Price to displayed total Unit Price - productContainer.find(".productTotalUnitPrice").shouldHave(exactText(subOrderPrice)); - - // Verify subtotal - // Stores the subtotal with the new item present - // Remove "$" symbol from price to be able to use it in a calculation - // Cuts off the first character from the string, which is the "$" symbol - String newSubTotal = subTotal.text(); - // New Total - Old Total = Price of item you just added - String price = PriceHelper.subtractFromPrice(newSubTotal, oldSubTotal); - String price2 = PriceHelper.subtractFromPrice(subOrderPrice, PriceHelper.format(totalPrice)); - - Assert.assertEquals(price, price2); - } - - /* TODO - check if needed - @Step("validate line item amount on the cart page") - public void validateProductAmount(int position, int amount) - { - // Makes sure the amount of the item with index @{index} in the cart equals the parameter - $("#product" + (position - 1) + " .productCount").shouldHave(exactValue(Integer.toString(amount))); - } - */ + /// ----- get product data ----- /// @Step("get product name from line item on the cart page") public String getProductName(int position) { - // Get the product name to enable usage outside this module. return $("#product" + (position - 1) + " .productName").text(); } @Step("get product style from line item on the cart page") public String getProductStyle(int position) { - // Get the style to enable usage outside this module. return $("#product" + (position - 1) + " .productStyle").text(); } @Step("get product size from line item on the cart page") public String getProductSize(int position) { - // Get the size to enable usage outside this module. return $("#product" + (position - 1) + " .productSize").text(); } @Step("get product count from line item on the cart page") public String getProductCount(int position) { - // Get the size to enable usage outside this module. return $("#product" + (position - 1) + " .productCount").val(); } @Step("get product unit price from line item on the cart page") public String getProductUnitPrice(int position) { - // Get the product price to enable usage outside this module. return $("#product" + (position - 1) + " .productUnitPrice").text(); } @Step("get product total price from line item on the cart page") public String getProductTotalUnitPrice(int position) { - // Get the product price to enable usage outside this module. return $("#product" + (position - 1) + " .productTotalUnitPrice").text(); } @@ -209,23 +191,42 @@ public Product getProduct(int position) { return new Product(getProductName(position), getProductUnitPrice(position), getProductStyle(position), getProductSize(position), Integer.parseInt(getProductCount(position))); } - - /** - * @param position - * @param amount - */ + + /// ----- update product data ----- /// + @Step("update product count on the cart page") public void updateProductCount(int position, int amount) { SelenideElement productContainer = $("#product" + (position - 1)); - // Type in the specified amount + + // type new amount productContainer.find(".productCount").setValue(Integer.toString(amount)); - // Stores the new amount in an outside variable - // Click the update button - // Clicks the update button for the product + + // click update button productContainer.find(".btnUpdateProduct").scrollTo().click(); } + // ----------------------------------------------------------------------------- // + + @Step("validate subtotal in the cart") + public void validateSubtotal(String subtotal) + { + $$("#cartSummaryList li").findBy(text("Subtotal")).find(".text-right").shouldHave(exactText(subtotal)); + } + + @Step("validate product in the cart") + public void validateContainsProduct(Product product) + { + SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() + .parent().parent(); + productContainer.find(".productName").shouldHave(exactText(product.getName())); + productContainer.find(".productSize").shouldHave(exactText(product.getSize())); + productContainer.find(".productStyle").shouldHave(exactText(product.getStyle())); + productContainer.find(".productCount").shouldHave(value(Integer.toString(product.getAmount()))); + productContainer.find(".productUnitPrice").shouldHave(exactText(product.getUnitPrice())); + productContainer.find(".productTotalUnitPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); + } + private SelenideElement findProductContainer(String productName, String style, String size) { SelenideElement productContainer = $$("div.hidden-xs").filter(text(productName)).first().parent().parent(); @@ -256,9 +257,6 @@ public void removeProductByName(String productName, String style, String size) $("#buttonDelete").click(); } - /** - * @param position - */ @Step("remove product on the cart page") public void removeProduct(int position) { @@ -278,10 +276,6 @@ public void removeProduct(int position) miniCart.openCartPage(); } - /** - * @param oldSubTotal - * @param oldLineItemTotal - */ @Step("validate sub total and line item total after removing on the cart page") public void validateSubAndLineItemTotalAfterRemove(String oldSubTotal, String oldLineItemTotal) { @@ -289,9 +283,6 @@ public void validateSubAndLineItemTotalAfterRemove(String oldSubTotal, String ol subTotal.shouldHave(exactText(newSubTotal)); } - /** - * @param position - */ @Step("click on a product on the cart page") public ProductDetailPage openProductPage(int position) { @@ -318,9 +309,6 @@ public ShippingAddressPage openShippingPage() return new ShippingAddressPage().isExpectedPage(); } - /** - * @return - */ @Step("check if there are product on the cart page") public boolean hasProductsInCart() { diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index f1f62840..b852e8a2 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -37,12 +37,10 @@ public static String computeRowPrice(String unitPrice, String quantity) return format(res); } - // TODO - understand use - // Subtracts the old subtotal from the new one, rounds the result to 2 decimals (to avoid things like 19.9 - // instead of 19.90) and compares it to the price of the new item - public static String subtractFromPrice(String from, String value) + @Step("calculate difference") + public static String subtractFromPrice(String minuend, String subtrahend) { - double res = (double) (Math.round((Double.valueOf(removeCurrency(from)) - Double.valueOf(removeCurrency(value))) * 100)) / 100; + double res = (double) (Math.round((Double.valueOf(removeCurrency(minuend)) - Double.valueOf(removeCurrency(subtrahend))) * 100)) / 100; return format(res); } } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index f49d4cae..8070ec57 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -27,16 +27,19 @@ public void testAddProductsToCart() { // use test data class AddToCartTestData addToCartTestData = DataUtils.get(AddToCartTestData.class); + final String shippingCosts = Neodymium.dataValue("shippingCosts"); + int totalCount = 0; + + /// ----- part 1: navigate to product and add to cart ----- /// // go to homepage var homePage = OpenHomePageFlow.flow(); - + // validate empty mini cart window - int totalCount = 0; homePage.miniCart.validateTotalCount(totalCount); homePage.miniCart.validateSubtotal("$0.00"); - - // ??? + + // store old subtotal final String oldSubtotal = homePage.miniCart.getSubtotal(); // go to top category page {topCategory} @@ -48,94 +51,105 @@ public void testAddProductsToCart() final String subCategory = addToCartTestData.getSubCategory(); var subCategoryPage = categoryPage.topNav.clickSubCategory(topCategory, subCategory); subCategoryPage.validate(subCategory); - + // go to product page final String productName = categoryPage.getProductNameByPosition(addToCartTestData.getPosition()); var productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getPosition()); productDetailPage.validate(productName); - + // add product to cart productDetailPage.addToCart("16 x 12 in", "matte"); - + // go to cart final var product = productDetailPage.getProduct(); var cartPage = productDetailPage.miniCart.openCartPage(); - + // validate cart page - final String shippingCosts = Neodymium.dataValue("shippingCosts"); cartPage.validate(shippingCosts); cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); cartPage.validateCartItem(addToCartTestData.getPosition(), product); - - - - // ---------------------------------------------------------------- + // validate (sub)total after adding new item to cart + cartPage.validateTotalAfterAdd(addToCartTestData.getPosition(), oldSubtotal, 0.00); - /* - cartPage.validateSubAndLineItemTotalAfterAdd(1, oldSubtotal, 0.00); - + // store old subtotal final String oldSubtotal2 = cartPage.miniCart.getSubtotal(); + + // validate mini cart total product count cartPage.miniCart.validateTotalCount(++totalCount); - // Search for product on cart page - final String searchTerm = Neodymium.dataValue("searchTerm"); - final int searchTermExpectedCount = 1; - categoryPage = cartPage.search.categoryPageResult(searchTerm); - categoryPage.validateSearchHits(searchTerm, searchTermExpectedCount); - final String productName2 = categoryPage.getProductNameByPosition(1, 1); + /// ----- part 2: search for product and add to cart ----- /// + + // search for product on cart page + categoryPage = cartPage.search.categoryPageResult(addToCartTestData.getSearchTerm()); + categoryPage.validateSearchHits(addToCartTestData.getSearchTerm(), addToCartTestData.getSearchResultCount()); - // Go to product page and add to cart - productDetailPage = categoryPage.clickProductByPosition(1, 1); + // go to product page + final String productName2 = categoryPage.getProductNameByPosition(addToCartTestData.getPosition()); + productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getPosition()); productDetailPage.validate(productName2); + + // add product to cart productDetailPage.addToCart("64 x 48 in", "gloss"); - final var product2 = productDetailPage.getProduct(); - // Go to cart and validate + // go to cart + final var product2 = productDetailPage.getProduct(); cartPage = productDetailPage.miniCart.openCartPage(); - cartPage.validate(shippingCosts); - cartPage.miniCart.validateMiniCart(1, product2); + // validate cart page + cartPage.validate(shippingCosts); + cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product2); + cartPage.validateCartItem(addToCartTestData.getPosition(), product2); + + // validate (sub)total after adding new item to cart + cartPage.validateTotalAfterAdd(1, oldSubtotal2, 0.00); - cartPage.miniCart.validateTotalCount(++totalCount); - cartPage.validateCartItem(1, product2); - cartPage.validateSubAndLineItemTotalAfterAdd(1, oldSubtotal2, 0.00); - - int productToUpdatePosition = 1; - int newProductAmount = 3; - final String oldSubtotal3 = cartPage.miniCart.getSubtotal(); - final var productBeforeUpdate = cartPage.getProduct(productToUpdatePosition); - - // Update amount of product on cart page - cartPage.updateProductCount(productToUpdatePosition, newProductAmount); - cartPage.validateProductAmount(productToUpdatePosition, newProductAmount); - - final String newLinItemPrice = cartPage.getProductTotalUnitPrice(productToUpdatePosition); - cartPage.validateSubAndLineItemTotalAfterAdd(productToUpdatePosition, - oldSubtotal3, - productBeforeUpdate.getTotalPrice()); - cartPage.validateCartItem(1, productBeforeUpdate, newProductAmount); - cartPage.miniCart.validateMiniCart(1, productBeforeUpdate, newProductAmount, newLinItemPrice); - totalCount = totalCount + newProductAmount - 1; + // store old subtotal + final String oldSubtotal3 = cartPage.miniCart.getSubtotal(); + + // validate mini cart total product count + cartPage.miniCart.validateTotalCount(++totalCount); + + /// ----- part 3: change amount of product in cart ----- /// + + // update amount of product on cart page + final var productBeforeUpdate = cartPage.getProduct(addToCartTestData.getPosition()); + cartPage.updateProductCount(addToCartTestData.getPosition(), addToCartTestData.getAmountChange()); + + // validate cart page + final String newLineItemPrice = cartPage.getProductTotalUnitPrice(addToCartTestData.getPosition()); + cartPage.validate(shippingCosts); + cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), productBeforeUpdate, addToCartTestData.getAmountChange(), newLineItemPrice); + cartPage.validateCartItem(addToCartTestData.getPosition(), productBeforeUpdate, addToCartTestData.getAmountChange()); + + // validate (sub)total after changing product amount + cartPage.validateTotalAfterAdd(addToCartTestData.getPosition(), oldSubtotal3, productBeforeUpdate.getTotalPrice()); + + + /* + totalCount = totalCount + addToCartTestData.getAmountChange() - 1; cartPage.miniCart.validateTotalCount(totalCount); + */ - final String oldLineItemTotal = cartPage.getProductTotalUnitPrice(productToUpdatePosition); - final String oldSubTotal4 = cartPage.miniCart.getSubtotal(); + // ---------------------------------------------------------------- - // Remove product on cart page - cartPage.removeProduct(productToUpdatePosition); - cartPage.validateSubAndLineItemTotalAfterRemove(oldSubTotal4, oldLineItemTotal); - totalCount = totalCount - newProductAmount; - cartPage.miniCart.validateTotalCount(totalCount); + + - final var productFromCartPage = cartPage.getProduct(1); - productDetailPage = cartPage.openProductPage(1); + /* + final String oldLineItemTotal = cartPage.getProductTotalUnitPrice(productToUpdatePosition); final String + oldSubTotal4 = cartPage.miniCart.getSubtotal(); + + // Remove product on cart page cartPage.removeProduct(productToUpdatePosition); + cartPage.validateSubAndLineItemTotalAfterRemove(oldSubTotal4, oldLineItemTotal); totalCount = totalCount - + newProductAmount; cartPage.miniCart.validateTotalCount(totalCount); + + final var productFromCartPage = cartPage.getProduct(1); productDetailPage = cartPage.openProductPage(1); productDetailPage.validate(productFromCartPage.getName()); - productDetailPage.addToCart(productFromCartPage.getSize(), productFromCartPage.getStyle()); - cartPage = productDetailPage.miniCart.openCartPage(); - - cartPage.validateCartItem(1, productFromCartPage, 2); - cartPage.miniCart.validateTotalCount(++totalCount); + productDetailPage.addToCart(productFromCartPage.getSize(), productFromCartPage.getStyle()); cartPage = + productDetailPage.miniCart.openCartPage(); + + cartPage.validateCartItem(1, productFromCartPage, 2); cartPage.miniCart.validateTotalCount(++totalCount); */ } } diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index e2a56786..0c079cee 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -63,7 +63,7 @@ public void testOrderingAsGuest() cartPage.miniCart.validateMiniCart(1, product); cartPage.miniCart.validateTotalCount(++totalCount); cartPage.validateCartItem(1, product); - cartPage.validateSubAndLineItemTotalAfterAdd(1, oldSubtotal, 0.00); + cartPage.validateTotalAfterAdd(1, oldSubtotal, 0.00); // setup checkout data final var shippingAddress = DataUtils.get(Address.class); diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 5938ce98..543f2386 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -72,7 +72,7 @@ public void testOrderingAsRegisteredUser() cartPage.miniCart.validateMiniCart(1, product); cartPage.miniCart.validateTotalCount(++totalCount); cartPage.validateCartItem(1, product); - cartPage.validateSubAndLineItemTotalAfterAdd(1, oldSubtotal, 0.00); + cartPage.validateTotalAfterAdd(1, oldSubtotal, 0.00); // Go to shipping address and validate var shippingAddressPage = cartPage.openShippingPage(); diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/AddToCartTestData.java index a4752872..81d54d4c 100644 --- a/src/test/java/posters/tests/testdata/AddToCartTestData.java +++ b/src/test/java/posters/tests/testdata/AddToCartTestData.java @@ -6,6 +6,8 @@ public class AddToCartTestData private String subCategory; private int position; private String searchTerm; + private int searchResultCount; + private int amountChange; public String getTopCategory() { @@ -26,4 +28,14 @@ public String getSearchTerm() { return searchTerm; } + + public int getSearchResultCount() + { + return searchResultCount; + } + + public int getAmountChange() + { + return amountChange; + } } \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/AddToCartTest.json b/src/test/resources/posters/tests/smoke/AddToCartTest.json index 50855345..981dabb3 100644 --- a/src/test/resources/posters/tests/smoke/AddToCartTest.json +++ b/src/test/resources/posters/tests/smoke/AddToCartTest.json @@ -3,6 +3,8 @@ "topCategory": "header.worldOfNature", "subCategory": "header.animals", "position": "1", - "searchTerm": "pizza" + "searchTerm": "pizza", + "searchResultCount": "1", + "amountChange": "3" } ] From 8caebd55912e9291fc7748821b1302f514e6b6a3 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Wed, 26 Jul 2023 17:47:40 +0200 Subject: [PATCH 07/44] detailed validation CategoryPage, ProductDetailPage, MiniCart --- config/localization.yaml | 60 ++++++++---- .../pageobjects/components/MiniCart.java | 80 ++++++++-------- .../pageobjects/components/SaleBanner.java | 2 +- .../pageobjects/components/TopNavigation.java | 66 +++++++------- .../pageobjects/pages/AbstractPageObject.java | 3 - .../pages/browsing/AbstractBrowsingPage.java | 6 ++ .../pages/browsing/CategoryPage.java | 23 +---- .../pages/browsing/ProductDetailPage.java | 42 ++++++++- .../pageobjects/pages/checkout/CartPage.java | 87 ++++++++++-------- src/test/java/posters/tests/AbstractTest.java | 3 - .../posters/tests/smoke/AddToCartTest.java | 91 ++++++++++++------- .../posters/tests/smoke/HomePageTest.java | 6 +- .../java/posters/tests/smoke/SearchTest.java | 3 +- .../tests/testdata/AddToCartTestData.java | 12 +++ .../posters/tests/smoke/AddToCartTest.json | 6 +- 15 files changed, 288 insertions(+), 202 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index 025eb8e4..5214be42 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -1,28 +1,37 @@ default: header: - worldOfNature: World of Nature - animals: Animals - flowers: Flowers - trees: Trees - dining: Dining - coldCuts: Cold Cuts - mainDishes: Main Dishes - sweets: Sweets - transportation: Transportation - airTravel: Air Travel - classicCars: Classic Cars - railways: Railways - panoramas: Panoramas - architecture: Architecture - fireworks: Fireworks - landscapes: Landscapes - xxlPanoramas: XXL Panoramas + topNavigation: + "1": + title: World of Nature + subCategory: + "1": Animals + "2": Flowers + "3": Trees + "2": + title: Dining + subCategory: + "1": Cold Cuts + "2": Main Dishes + "3": Sweets + "3": + title: Transportation + subCategory: + "1": Air Travel + "2": Classic Cars + "3": Railways + "4": + title: Panoramas + subCategory: + "1": Architecture + "2": Fireworks + "3": Landscapes + "4": XXL Panoramas userMenu: greeting: "WELCOME: GUEST" createAccount: CREATE ACCOUNT signIn: SIGN IN shoppingCart: - itemsInCart: ITEMS IN THE CART + noItemsInCart: 0 ITEMS IN THE CART subtotal: SUBTOTAL viewCart: VIEW CART sale: @@ -39,12 +48,23 @@ default: successfulOrder: Thank you for shopping with us! successfulLogin: Login successful. Have fun in our shop! successfulAccountDeletion: Your account has been deleted. We hope to see you soon again! + CartPage: + title: Cart + errorMessage: Your cart is empty. Continue shopping. NoHitsPage: validation: noProductsFound: × Sorry! No results found matching your search. Please try again. ProductdetailPage: - addToCartButton: - text: Add to cart + size: + "16x12": 16 x 12 in + "32x24": 32 x 24 in + "64x48": 64 x 48 in + "96x32": 96 x 32 in + style: + matte: matte + gloss: gloss + print: "Print information:" + addToCartButton: Add to cart AccountPages: email: Email address* firstname: First name* diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index f793d105..4fb31871 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -21,13 +21,7 @@ public class MiniCart extends AbstractComponent { private static SelenideElement headerCart = $("#headerCartOverview"); - private final static String miniCartSelector = "#miniCartMenu"; - - private SelenideElement miniCart = $(miniCartSelector); - - public static ElementsCollection subtotal = $$(miniCartSelector + " .cartMiniSubOrderTotal"); - - private SelenideElement subOrderPrice = $(miniCartSelector + " .subOrderPrice"); + private SelenideElement subOrderPrice = $("#miniCartMenu .subOrderPrice"); private SelenideElement totalCountElement = $("#headerCartOverview .headerCartProductCount"); @@ -40,27 +34,6 @@ public void isComponentAvailable() $("#btnCartOverviewForm").should(exist); } - @Step("validate shopping cart menu") - public static void validateStructure() - { - // validate shopping cart icon, item count - $(".icon-shopping-cart").shouldBe(visible); - $$("#count_wideView").findBy(matchesText("\\d")).shouldBe(visible); - - // open cart window - headerCart.hover(); - - // validate structure cart window - // TODO - validate item count - $$("#miniCartMenu .cartMiniHeader").findBy(matchesText(Neodymium.localizedText("header.shoppingCart.itemsInCart"))).shouldBe(visible); - subtotal.findBy(matchesText(Neodymium.localizedText("header.shoppingCart.subtotal"))).shouldBe(visible); - subtotal.findBy(matchesText("\\$\\d\\.\\d")).shouldBe(visible); - $$("#miniCartMenu .linkButton").findBy(exactText(Neodymium.localizedText("header.shoppingCart.viewCart"))).shouldBe(visible); - - // close cart menu - $("#globalNavigation").hover(); - } - // ----- mini cart navigation ------ // @Step("open the mini cart") @@ -75,6 +48,22 @@ public void closeMiniCart() $("#brand").hover(); } + @Step("open the cart page") + public CartPage openCartPage() + { + openMiniCart(); + goToCartButton.click(); + return new CartPage().isExpectedPage(); + } + + // ----- validate product data in mini cart ----- // + + @Step("validate shopping cart menu") + public static void validateStructure() + { + // TODO - verify (not) empty shopping cart in one function for header component + } + @Step("validate the mini cart subtotal price") public void validateSubtotal(String subtotal) { @@ -83,14 +72,33 @@ public void validateSubtotal(String subtotal) closeMiniCart(); } - @Step("open the cart page") - public CartPage openCartPage() + @Step("validate the mini cart total product count") + public void validateTotalCount(int totalCount) { - goToCartButton.click(); - return new CartPage().isExpectedPage(); + totalCountElement.shouldHave(exactText(Integer.toString(totalCount))); } - // ----- validate product data in mini cart ----- // + @Step("validate empty mini cart") + public void validateEmptyMiniCart() + { + // validate shopping cart icon, item count + $(".icon-shopping-cart").shouldBe(visible); + $(".headerCartProductCount").shouldHave(exactText("0")).shouldBe(visible); + + openMiniCart(); + + // validate cart window header + $$("#miniCartMenu .cartMiniHeader").findBy(matchesText(Neodymium.localizedText("header.shoppingCart.noItemsInCart"))).shouldBe(visible); + + // validate subtotal + $("#miniCartMenu .cartMiniSubOrderTotal").shouldHave(matchesText(Neodymium.localizedText("header.shoppingCart.subtotal"))).shouldBe(visible); + $(".subOrderPrice").shouldHave(exactText("$0.00")).shouldBe(visible); + + // validate view cart button + $("#miniCartMenu .linkButton").shouldHave(exactText(Neodymium.localizedText("header.shoppingCart.viewCart"))).shouldBe(visible); + + closeMiniCart(); + } @Step("validate data cart item in mini cart") private void validateMiniCart(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) @@ -130,12 +138,6 @@ public void validateMiniCart(int position, Product product, int productAmount, S validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), productAmount, productPrice); } - @Step("validate the mini cart total product count") - public void validateTotalCount(int totalCount) - { - totalCountElement.shouldHave(exactText(Integer.toString(totalCount))); - } - // -------------------------------------------------------------- diff --git a/src/test/java/posters/pageobjects/components/SaleBanner.java b/src/test/java/posters/pageobjects/components/SaleBanner.java index 448f7087..d443bd1e 100644 --- a/src/test/java/posters/pageobjects/components/SaleBanner.java +++ b/src/test/java/posters/pageobjects/components/SaleBanner.java @@ -20,7 +20,7 @@ public void isComponentAvailable() @Step("validate strings sale banner") private static void validateSaleBanner(String text) { - $$(".owl-stage").findBy(exactText(Neodymium.localizedText(text))).waitUntil(visible, 6500); + $$(".owl-stage").findBy(exactText(Neodymium.localizedText(text))).waitUntil(visible, 9000); } @Step("validate sale banner") diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index 23475059..3df3b21d 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -31,56 +31,56 @@ public void isComponentAvailable() // ----- validate content top navigation ----- // + @Step("validate name of components in navigation") + public static void validateNavComponent(String topCategory) + { + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).shouldBe(visible); + } + + @Step("validate name of components in sub navigation") + public static void validateSubNavComponent(String subCategory) + { + $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).shouldBe(visible); + } + @Step("validate structure top navigation") public static void validateStructure() { // validate navigation bar - validateNavComponent("header.worldOfNature"); - validateNavComponent("header.dining"); - validateNavComponent("header.transportation"); - validateNavComponent("header.panoramas"); + validateNavComponent("header.topNavigation.1.title"); + validateNavComponent("header.topNavigation.2.title"); + validateNavComponent("header.topNavigation.3.title"); + validateNavComponent("header.topNavigation.4.title"); // validate sub navigation "World Of Nature" - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.worldOfNature"))).hover(); - validateSubNavComponent("header.animals"); - validateSubNavComponent("header.flowers"); - validateSubNavComponent("header.trees"); + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.topNavigation.1.title"))).hover(); + validateSubNavComponent("header.topNavigation.1.subCategory.1"); + validateSubNavComponent("header.topNavigation.1.subCategory.2"); + validateSubNavComponent("header.topNavigation.1.subCategory.3"); // validate sub navigation "Dining" - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.dining"))).hover(); - validateSubNavComponent("header.coldCuts"); - validateSubNavComponent("header.mainDishes"); - validateSubNavComponent("header.sweets"); + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.topNavigation.2.title"))).hover(); + validateSubNavComponent("header.topNavigation.2.subCategory.1"); + validateSubNavComponent("header.topNavigation.2.subCategory.2"); + validateSubNavComponent("header.topNavigation.2.subCategory.3"); // validate sub navigation "Transportation" - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.transportation"))).hover(); - validateSubNavComponent("header.airTravel"); - validateSubNavComponent("header.classicCars"); - validateSubNavComponent("header.railways"); + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.topNavigation.3.title"))).hover(); + validateSubNavComponent("header.topNavigation.3.subCategory.1"); + validateSubNavComponent("header.topNavigation.3.subCategory.2"); + validateSubNavComponent("header.topNavigation.3.subCategory.3"); // validate sub navigation "Panoramas" - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.panoramas"))).hover(); - validateSubNavComponent("header.architecture"); - validateSubNavComponent("header.fireworks"); - validateSubNavComponent("header.landscapes"); - validateSubNavComponent("header.xxlPanoramas"); + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.topNavigation.4.title"))).hover(); + validateSubNavComponent("header.topNavigation.4.subCategory.1"); + validateSubNavComponent("header.topNavigation.4.subCategory.2"); + validateSubNavComponent("header.topNavigation.4.subCategory.3"); + validateSubNavComponent("header.topNavigation.4.subCategory.4"); // close sub navigation $("#globalNavigation").hover(); } - @Step("validate name of components in navigation") - public static void validateNavComponent(String topCategory) - { - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).shouldBe(visible); - } - - @Step("validate name of components in sub navigation") - public static void validateSubNavComponent(String subCategory) - { - $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).shouldBe(visible); - } - // ----- category navigation ------ // @Step("click on '{categoryName}' category") diff --git a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java index 8d382317..a67fe791 100644 --- a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java +++ b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java @@ -9,9 +9,6 @@ import posters.pageobjects.components.Title; -/** - * @author pfotenhauer - */ public abstract class AbstractPageObject { public Title title = new Title(); diff --git a/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java b/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java index 1a4ddfe0..c4246b16 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java @@ -42,4 +42,10 @@ public void validateStructure() successMessage.isComponentAvailable(); errorMessage.isComponentAvailable(); } + + public void validateHeaderAndFooter(AbstractBrowsingPage page) + { + page.header.validateStructure(); + page.footer.validateStructure(); + } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index c7eba196..d8d8c656 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -49,30 +49,17 @@ public void validateStructure() } @Step("validate category name {categoryName} is on category page") - public void validateCategoryName(String categoryName) + public void validateCategoryHeadline(String categoryName, int expectedResultCount) { - $("#titleCategoryName").shouldHave(matchText(Neodymium.localizedText(categoryName))); + $("#titleCategoryName").shouldHave(matchText(Neodymium.localizedText(categoryName))).shouldBe(visible); + $("#titleCategoryName").shouldHave(matchText(Integer.toString(expectedResultCount))).shouldBe(visible); } @Step("validate category page of category '{categoryName}'") - public void validate(String categoryName) + public void validate(String categoryName, int expectedResultCount) { validateStructure(); - validateCategoryName(categoryName); - } - - @Step("validate search results for '{searchTerm}' on category page") - public void validateSearchHits(String searchTerm, int searchTermExpectedCount) - { - // validate the headline - $("#titleSearchText").should(visible); - $("#titleSearchText").should(matchText(Neodymium.localizedText("search.results.text") + "'" + searchTerm + "' \\(" + searchTermExpectedCount + ".*\\)")); - - // validate visibility {searchTerm} after search - search.validateSearchTerm(searchTerm); - - // validate at least 1 search result - $("#product0").shouldBe(visible); + validateCategoryHeadline(categoryName, expectedResultCount); } /// ----- product by position ----- /// diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index ab1a3307..93021f5e 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -3,9 +3,12 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; +import static com.codeborne.selenide.CollectionCondition.sizeGreaterThan; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; +import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -34,6 +37,34 @@ public ProductDetailPage isExpectedPage() /// ----- validate content product detail page ----- /// + public void validateSizeDropdown(int position, String size) + { + $("#selectSize option:nth-of-type(" + position + ")").shouldHave(exactText(Neodymium.localizedText(size))).shouldBe(visible); + } + + @Step("validate size dropdown") + public void validateSizeDropdown() + { + productSize.scrollTo().click(); + + if ($$("#selectSize option").shouldHave(sizeGreaterThan(1)) != null) + { + validateSizeDropdown(1, "ProductdetailPage.size.16x12"); + validateSizeDropdown(2, "ProductdetailPage.size.32x24"); + validateSizeDropdown(3, "ProductdetailPage.size.64x48"); + } + else validateSizeDropdown(1, "ProductdetailPage.size.96x32"); + + productSize.scrollTo().click(); + } + + @Step("validate style radio") + public void validateStyleRadio() + { + $("#selectStyle .radio:nth-of-type(1)").shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.style.matte"))).shouldBe(visible); + $("#selectStyle .radio:nth-of-type(2)").shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.style.gloss"))).shouldBe(visible); + } + @Override @Step("validate product detail page structure") public void validateStructure() @@ -47,23 +78,26 @@ public void validateStructure() productName.shouldHave(matchText("[A-Z].{3,}")).shouldBe(visible); // validate product price - productPrice.shouldHave(matchText("\\$\\d+\\.\\d{2}")).shouldBe(visible); + productPrice.shouldHave(matchText("\\$\\d{2}\\.\\d{2}")).shouldBe(visible); // validate product description $("#prodDescriptionOverview").shouldBe(visible); $("#prodDescriptionDetail").shouldBe(visible); // validate size selection - $("#selectSize").shouldBe(visible); + validateSizeDropdown(); // validate style selection $("#selectStyle").shouldBe(visible); + validateStyleRadio(); - // validate print information + // validate print information + $("#prodPrintInfoTitle").shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.print"))).shouldBe(visible); $("#prodPrintInfo").shouldBe(visible); // validate add to cart button - addToCartButton.shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.addToCartButton.text"))).shouldBe(visible); + addToCartButton.shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.addToCartButton"))).shouldBe(visible); + $("#btnAddToCart .icon-shopping-cart").shouldBe(visible); } @Step("validate product name on product detail page") diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 1625dbb6..28533742 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -19,11 +19,14 @@ import io.qameta.allure.Step; import posters.dataobjects.Product; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; +import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.browsing.ProductDetailPage; import posters.pageobjects.utility.PriceHelper; public class CartPage extends AbstractBrowsingPage { + private SelenideElement title = $("#titleCart"); + private SelenideElement cartTable = $("#cartOverviewTable"); private SelenideElement subTotal = $("#orderSubTotalValue"); @@ -39,14 +42,24 @@ public CartPage isExpectedPage() /// ----- validate content cart page ----- /// + @Step("validate empty cart page") + public void validateEmptyCartPage() + { + title.shouldHave(exactText(Neodymium.localizedText("CartPage.title"))).shouldBe(visible); + $("#errorCartMessage").shouldHave(exactText(Neodymium.localizedText("CartPage.errorMessage"))).shouldBe(visible); + } + @Override @Step("validate cart page structure") public void validateStructure() { super.validateStructure(); + // validate process sequence + $(".process-wrap").shouldBe(visible); + // validate title - $("#titleCart").shouldBe(matchText("[A-Z].{3,}")); + title.shouldHave(exactText(Neodymium.localizedText("CartPage.title"))).shouldBe(visible); // validate product list cartTable.shouldBe(visible); @@ -57,8 +70,8 @@ public void validateStructure() // validate cart summary list $("#cartSummaryList").shouldBe(visible); - // validate checkut button - $("#btnStartCheckout").should(exist); + // validate checkout button + $("#btnStartCheckout").should(visible); } @Step("validate shipping costs on cart page") @@ -106,6 +119,13 @@ public void validateTotalAfterAdd(int position, String oldSubTotal, double total // validate {price} equals {price2} Assert.assertEquals(productPrice, productPriceAmountChange); } + + @Step("validate sub total and line item total after removing on the cart page") + public void validateTotalAfterRemove(String oldSubTotal, String oldLineItemTotal) + { + String newSubTotal = PriceHelper.subtractFromPrice(oldSubTotal, oldLineItemTotal); + subTotal.shouldHave(exactText(newSubTotal)); + } /// ----- validate product data in cart item ----- /// @@ -141,7 +161,7 @@ public void validateCartItem(int position, Product product) { validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), product.getUnitPrice()); } - + @Step("validate '{product}' on the cart page") public void validateCartItem(int position, Product product, int productAmount) { @@ -205,6 +225,32 @@ public void updateProductCount(int position, int amount) // click update button productContainer.find(".btnUpdateProduct").scrollTo().click(); } + + @Step("remove product on the cart page") + public void removeProduct(int position) + { + // click delete button + $("#btnRemoveProdCount" + (position - 1)).scrollTo().click(); + + // click delete confirmation button + $("#buttonDelete").scrollTo().click(); + } + + /// ----- cart page navigation ----- /// + + @Step("click on a product on the cart page") + public ProductDetailPage openProductDetailPage(int position) + { + $("#product" + (position - 1) + " .product-img").scrollTo().click(); + return new ProductDetailPage().isExpectedPage(); + } + + public HomePage openHomePage() + { + $("#brand").scrollTo().click(); + return new HomePage().isExpectedPage(); + } + // ----------------------------------------------------------------------------- // @@ -257,39 +303,6 @@ public void removeProductByName(String productName, String style, String size) $("#buttonDelete").click(); } - @Step("remove product on the cart page") - public void removeProduct(int position) - { - // Click delete button - // Click on the delete button for the product - $("#btnRemoveProdCount" + (position - 1)).scrollTo().click(); - // Wait for the second delete button to appear - // Wait until the confirmation button is visible - $("#buttonDelete").waitUntil(visible, Neodymium.configuration().selenideTimeout()); - // Click delete button - // Click the confirmation button - $("#buttonDelete").scrollTo().click(); - // Wait until the confirmation button is gone - $("#buttonDelete").waitUntil(hidden, Neodymium.configuration().selenideTimeout()); - // Reload page to let IDs adjust to the deletion - miniCart.openMiniCart(); - miniCart.openCartPage(); - } - - @Step("validate sub total and line item total after removing on the cart page") - public void validateSubAndLineItemTotalAfterRemove(String oldSubTotal, String oldLineItemTotal) - { - String newSubTotal = PriceHelper.subtractFromPrice(oldSubTotal, oldLineItemTotal); - subTotal.shouldHave(exactText(newSubTotal)); - } - - @Step("click on a product on the cart page") - public ProductDetailPage openProductPage(int position) - { - $("#product" + (position - 1) + " .product-img").scrollTo().click(); - return new ProductDetailPage().isExpectedPage(); - } - private void clickCheckoutButton() { $("#btnStartCheckout").scrollTo().click(); diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index af7275b3..740a5731 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -7,9 +7,6 @@ import com.xceptance.neodymium.NeodymiumRunner; import com.xceptance.neodymium.module.statement.browser.multibrowser.Browser; -/** - * @author pfotenhauer - */ @RunWith(NeodymiumRunner.class) @Browser("Chrome_1024x768") public abstract class AbstractTest diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 8070ec57..46f51c79 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -24,46 +24,54 @@ public class AddToCartTest extends AbstractTest { @Test public void testAddProductsToCart() - { + { // use test data class AddToCartTestData addToCartTestData = DataUtils.get(AddToCartTestData.class); final String shippingCosts = Neodymium.dataValue("shippingCosts"); int totalCount = 0; - /// ----- part 1: navigate to product and add to cart ----- /// - + /// ----- PART 1: GO TO EMPTY CART AND VALIDATE ----- /// + // go to homepage var homePage = OpenHomePageFlow.flow(); - - // validate empty mini cart window - homePage.miniCart.validateTotalCount(totalCount); - homePage.miniCart.validateSubtotal("$0.00"); + + // go to cart page and validate + var cartPage = homePage.miniCart.openCartPage(); + cartPage.validateEmptyCartPage(); + cartPage.miniCart.validateEmptyMiniCart(); + cartPage.validateHeaderAndFooter(cartPage); + + // go back to homepage + cartPage.openHomePage(); + + /// ----- PART 2: USE TOP NAVIGATION TO ADD PRODUCT TO CART ----- /// // store old subtotal final String oldSubtotal = homePage.miniCart.getSubtotal(); - // go to top category page {topCategory} - final String topCategory = addToCartTestData.getTopCategory(); - var categoryPage = homePage.topNav.clickCategory(topCategory); - categoryPage.validate(topCategory); + // go to top category page and validate + var categoryPage = homePage.topNav.clickCategory(addToCartTestData.getTopCategory()); + categoryPage.validate(addToCartTestData.getTopCategory(), addToCartTestData.getExpectedCategoryResultCount()); + categoryPage.validateHeaderAndFooter(categoryPage); - // go to sub category page {subCategory} - final String subCategory = addToCartTestData.getSubCategory(); - var subCategoryPage = categoryPage.topNav.clickSubCategory(topCategory, subCategory); - subCategoryPage.validate(subCategory); + // go to sub category page + var subCategoryPage = categoryPage.topNav.clickSubCategory(addToCartTestData.getTopCategory(), addToCartTestData.getSubCategory()); + subCategoryPage.validate(addToCartTestData.getSubCategory(), addToCartTestData.getExpectedSubCategoryResultCount()); // go to product page final String productName = categoryPage.getProductNameByPosition(addToCartTestData.getPosition()); var productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getPosition()); productDetailPage.validate(productName); + productDetailPage.validateHeaderAndFooter(productDetailPage); // add product to cart productDetailPage.addToCart("16 x 12 in", "matte"); // go to cart final var product = productDetailPage.getProduct(); - var cartPage = productDetailPage.miniCart.openCartPage(); + cartPage = productDetailPage.miniCart.openCartPage(); + /* // validate cart page cartPage.validate(shippingCosts); cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); @@ -77,7 +85,8 @@ public void testAddProductsToCart() // validate mini cart total product count cartPage.miniCart.validateTotalCount(++totalCount); - + + /* /// ----- part 2: search for product and add to cart ----- /// // search for product on cart page @@ -125,31 +134,43 @@ public void testAddProductsToCart() // validate (sub)total after changing product amount cartPage.validateTotalAfterAdd(addToCartTestData.getPosition(), oldSubtotal3, productBeforeUpdate.getTotalPrice()); - - /* + // validate mini cart total product count totalCount = totalCount + addToCartTestData.getAmountChange() - 1; cartPage.miniCart.validateTotalCount(totalCount); - */ - - // ---------------------------------------------------------------- - - - - /* - final String oldLineItemTotal = cartPage.getProductTotalUnitPrice(productToUpdatePosition); final String - oldSubTotal4 = cartPage.miniCart.getSubtotal(); + // store old subtotal + final String oldSubTotal4 = cartPage.miniCart.getSubtotal(); + + // ----- part 4: remove product on cart page ----- // - // Remove product on cart page cartPage.removeProduct(productToUpdatePosition); - cartPage.validateSubAndLineItemTotalAfterRemove(oldSubTotal4, oldLineItemTotal); totalCount = totalCount - - newProductAmount; cartPage.miniCart.validateTotalCount(totalCount); + // remove product on cart page cartPage.removeProduct(productToUpdatePosition); + final String oldLineItemTotal = cartPage.getProductTotalUnitPrice(addToCartTestData.getPosition()); + cartPage.removeProduct(addToCartTestData.getPosition()); + + // validate cart page + cartPage.validateTotalAfterRemove(oldSubTotal4, oldLineItemTotal); + cartPage.validate(shippingCosts); + + // validate mini cart total product count + totalCount = totalCount - addToCartTestData.getAmountChange(); + cartPage.miniCart.validateTotalCount(totalCount); - final var productFromCartPage = cartPage.getProduct(1); productDetailPage = cartPage.openProductPage(1); + // ----- part 5: navigate to product and add to cart ----- // + + // open product page + final var productFromCartPage = cartPage.getProduct(addToCartTestData.getPosition()); + productDetailPage = cartPage.openProductDetailPage(addToCartTestData.getPosition()); productDetailPage.validate(productFromCartPage.getName()); - productDetailPage.addToCart(productFromCartPage.getSize(), productFromCartPage.getStyle()); cartPage = - productDetailPage.miniCart.openCartPage(); - cartPage.validateCartItem(1, productFromCartPage, 2); cartPage.miniCart.validateTotalCount(++totalCount); + // add product to cart + productDetailPage.addToCart(productFromCartPage.getSize(), productFromCartPage.getStyle()); + + // go to cart + cartPage = productDetailPage.miniCart.openCartPage(); + + // validate cart page + cartPage.validateCartItem(addToCartTestData.getPosition(), productFromCartPage, 2); + cartPage.miniCart.validateTotalCount(++totalCount); */ } } diff --git a/src/test/java/posters/tests/smoke/HomePageTest.java b/src/test/java/posters/tests/smoke/HomePageTest.java index 15fa437f..013e8efb 100644 --- a/src/test/java/posters/tests/smoke/HomePageTest.java +++ b/src/test/java/posters/tests/smoke/HomePageTest.java @@ -17,9 +17,6 @@ import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; -/** - * @author pfotenhauer - */ @Severity(SeverityLevel.TRIVIAL) @Owner("Joe Fix") @Tag("smoke") @@ -37,7 +34,6 @@ public void testVisitingHomepage() var homePage = OpenHomePageFlow.flow(); homePage.title.validateTitle(Neodymium.localizedText("HomePage.title")); homePage.validateStructure(); - homePage.header.validateStructure(); - homePage.footer.validateStructure(); + homePage.validateHeaderAndFooter(homePage); } } diff --git a/src/test/java/posters/tests/smoke/SearchTest.java b/src/test/java/posters/tests/smoke/SearchTest.java index f3229bb2..9d087542 100644 --- a/src/test/java/posters/tests/smoke/SearchTest.java +++ b/src/test/java/posters/tests/smoke/SearchTest.java @@ -44,8 +44,7 @@ public void testSearching() // go to category page var categoryPage = homePage.search.categoryPageResult(searchTerm); - categoryPage.validateStructure(); - categoryPage.validateSearchHits(searchTerm, searchTermExpectedCount); + categoryPage.validate(searchTerm, searchTermExpectedCount); validateHeaderAndFooter(categoryPage); //go to product detail page diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/AddToCartTestData.java index 81d54d4c..aa834d84 100644 --- a/src/test/java/posters/tests/testdata/AddToCartTestData.java +++ b/src/test/java/posters/tests/testdata/AddToCartTestData.java @@ -4,6 +4,8 @@ public class AddToCartTestData { private String topCategory; private String subCategory; + private int expectedCategoryResultCount; + private int expectedSubCategoryResultCount; private int position; private String searchTerm; private int searchResultCount; @@ -19,6 +21,16 @@ public String getSubCategory() return subCategory; } + public int getExpectedCategoryResultCount() + { + return expectedCategoryResultCount; + } + + public int getExpectedSubCategoryResultCount() + { + return expectedSubCategoryResultCount; + } + public int getPosition() { return position; diff --git a/src/test/resources/posters/tests/smoke/AddToCartTest.json b/src/test/resources/posters/tests/smoke/AddToCartTest.json index 981dabb3..46dc8537 100644 --- a/src/test/resources/posters/tests/smoke/AddToCartTest.json +++ b/src/test/resources/posters/tests/smoke/AddToCartTest.json @@ -1,7 +1,9 @@ [ { - "topCategory": "header.worldOfNature", - "subCategory": "header.animals", + "topCategory": "header.topNavigation.1.title", + "subCategory": "header.topNavigation.1.subCategory.1", + "expectedCategoryResultCount": "30", + "expectedSubCategoryResultCount": "10", "position": "1", "searchTerm": "pizza", "searchResultCount": "1", From c6000301292a33304ebb8274349166c417400357 Mon Sep 17 00:00:00 2001 From: kqmpetenz Date: Thu, 27 Jul 2023 18:35:46 +0200 Subject: [PATCH 08/44] further cleaned AddToCardTest, added tax validation --- config/localization.yaml | 2 +- .../pageobjects/components/MiniCart.java | 37 +++++--- .../pages/browsing/CategoryPage.java | 21 ++-- .../pages/browsing/ProductDetailPage.java | 14 +-- .../pageobjects/pages/checkout/CartPage.java | 21 +++- .../pageobjects/utility/PriceHelper.java | 8 ++ .../posters/tests/smoke/AddToCartTest.java | 95 +++++++++++-------- .../tests/testdata/AddToCartTestData.java | 18 ++-- .../posters/tests/smoke/AddToCartTest.json | 4 +- 9 files changed, 136 insertions(+), 84 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index 5214be42..7ed19d65 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -40,7 +40,7 @@ default: footer: text: Copyright (c) 2013-2020 Xceptance Software Technologies GmbH -- This software is for demo purposes only and not meant to be used in production. search: - results: + result: text: "Your results for your search: " HomePage: title: Posters - The Ultimate Online Shop diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 4fb31871..4f6113a8 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -9,6 +9,7 @@ import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.ElementsCollection; +import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -22,6 +23,8 @@ public class MiniCart extends AbstractComponent private static SelenideElement headerCart = $("#headerCartOverview"); private SelenideElement subOrderPrice = $("#miniCartMenu .subOrderPrice"); + + private SelenideElement miniCart = $("#miniCartMenu"); private SelenideElement totalCountElement = $("#headerCartOverview .headerCartProductCount"); @@ -40,12 +43,14 @@ public void isComponentAvailable() public void openMiniCart() { headerCart.hover(); + miniCart.waitUntil(visible, 9000); } @Step("close the mini cart") public void closeMiniCart() { $("#brand").hover(); + miniCart.waitUntil(not(visible), 9000); } @Step("open the cart page") @@ -83,7 +88,7 @@ public void validateEmptyMiniCart() { // validate shopping cart icon, item count $(".icon-shopping-cart").shouldBe(visible); - $(".headerCartProductCount").shouldHave(exactText("0")).shouldBe(visible); + totalCountElement.shouldHave(exactText("0")).shouldBe(visible); openMiniCart(); @@ -92,7 +97,7 @@ public void validateEmptyMiniCart() // validate subtotal $("#miniCartMenu .cartMiniSubOrderTotal").shouldHave(matchesText(Neodymium.localizedText("header.shoppingCart.subtotal"))).shouldBe(visible); - $(".subOrderPrice").shouldHave(exactText("$0.00")).shouldBe(visible); + subOrderPrice.shouldHave(exactText("$0.00")).shouldBe(visible); // validate view cart button $("#miniCartMenu .linkButton").shouldHave(exactText(Neodymium.localizedText("header.shoppingCart.viewCart"))).shouldBe(visible); @@ -103,6 +108,9 @@ public void validateEmptyMiniCart() @Step("validate data cart item in mini cart") private void validateMiniCart(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) { + // validate shopping cart icon, item count + $(".icon-shopping-cart").shouldBe(visible); + openMiniCart(); // selector for product @@ -138,7 +146,19 @@ public void validateMiniCart(int position, Product product, int productAmount, S validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), productAmount, productPrice); } + /// ----- get data mini cart ----- /// + + @Step("get the subtotal price from mini cart") + public String getSubtotal() + { + openMiniCart(); + String subtotal = subOrderPrice.text(); + closeMiniCart(); + return subtotal; + } + + // -------------------------------------------------------------- @@ -149,19 +169,6 @@ public int getTotalCount() return Integer.parseInt(totalCountElement.text()); } - @Step("get the subtotal price from mini cart") - public String getSubtotal() - { - // Store the mini cart subtotal - // Open mini cart - openMiniCart(); - // Store subtotal in oldSubTotal - String subtotal = subOrderPrice.text(); - // Close mini cart - closeMiniCart(); - - return subtotal; - } @Step("validate '{product}' in the mini cart by name") public void validateMiniCartByProduct(Product product) diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index d8d8c656..e709faa3 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -1,10 +1,8 @@ package posters.pageobjects.pages.browsing; -import static com.codeborne.selenide.CollectionCondition.sizeGreaterThan; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; -import static com.codeborne.selenide.Condition.text; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; @@ -23,6 +21,8 @@ public class CategoryPage extends AbstractBrowsingPage public Pagination pagination = new Pagination(); private SelenideElement productOverview = $("#productOverview"); + + private SelenideElement titleCategoryName = $("#titleCategoryName"); @Override @Step("ensure this is a category page") @@ -51,8 +51,17 @@ public void validateStructure() @Step("validate category name {categoryName} is on category page") public void validateCategoryHeadline(String categoryName, int expectedResultCount) { - $("#titleCategoryName").shouldHave(matchText(Neodymium.localizedText(categoryName))).shouldBe(visible); - $("#titleCategoryName").shouldHave(matchText(Integer.toString(expectedResultCount))).shouldBe(visible); + if (categoryName.contains(".")) + { + titleCategoryName.should(matchText(Neodymium.localizedText(categoryName))).shouldBe(visible); + titleCategoryName.shouldHave(matchText(Integer.toString(expectedResultCount))).shouldBe(visible); + } + else + { + $("#titleSearchText").should(matchText(Neodymium.localizedText("search.result.text"))).shouldBe(visible); + $("#searchTextValue").should(exactText(categoryName)).shouldBe(visible); + $("#totalProductCount").should(exactText(Integer.toString(expectedResultCount))).shouldBe(visible); + } } @Step("validate category page of category '{categoryName}'") @@ -120,10 +129,10 @@ public void validateProductVisible(String productName) // TODO - check if needed @Step("validate category page of category '{categoryName}' and assert visually") - public void validateAndVisualAssert(String categoryName) + public void validateAndVisualAssert(String categoryName, int expectedResultCount) { validateStructureAndVisual(); - validateCategoryName(categoryName); + validateCategoryHeadline(categoryName, expectedResultCount); } // TODO - check if needed diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index 93021f5e..6f4599fd 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -37,9 +37,9 @@ public ProductDetailPage isExpectedPage() /// ----- validate content product detail page ----- /// - public void validateSizeDropdown(int position, String size) + public void validateSizeDropdown(String size) { - $("#selectSize option:nth-of-type(" + position + ")").shouldHave(exactText(Neodymium.localizedText(size))).shouldBe(visible); + productSize.shouldBe(matchText(Neodymium.localizedText(size))).should(exist); } @Step("validate size dropdown") @@ -47,13 +47,13 @@ public void validateSizeDropdown() { productSize.scrollTo().click(); - if ($$("#selectSize option").shouldHave(sizeGreaterThan(1)) != null) + if ($$("#selectSize option").size()>1) { - validateSizeDropdown(1, "ProductdetailPage.size.16x12"); - validateSizeDropdown(2, "ProductdetailPage.size.32x24"); - validateSizeDropdown(3, "ProductdetailPage.size.64x48"); + validateSizeDropdown("ProductdetailPage.size.16x12"); + validateSizeDropdown("ProductdetailPage.size.32x24"); + validateSizeDropdown("ProductdetailPage.size.64x48"); } - else validateSizeDropdown(1, "ProductdetailPage.size.96x32"); + else validateSizeDropdown("ProductdetailPage.size.96x32"); productSize.scrollTo().click(); } diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 28533742..05da8482 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -79,12 +79,20 @@ public void validateShippingCosts(String shippingCosts) { $("#orderShippingCosts").shouldHave(exactText(shippingCosts)); } + + @Step("validate tax on cart page") + public void validateTax(String shippingCosts, String subtotal) + { + String tax = PriceHelper.calculateTax(shippingCosts, subtotal); + $("#orderSubTotalTaxValue").shouldHave(exactText(tax)); + } @Step("validate cart page with shipping costs: '{shippingCosts}'") - public void validate(String shippingCosts) + public void validate(String shippingCosts, String subtotal) { validateStructure(); validateShippingCosts(shippingCosts); + validateTax(shippingCosts, subtotal); } @Step("validate sub total and line item total after adding on the cart page") @@ -127,7 +135,7 @@ public void validateTotalAfterRemove(String oldSubTotal, String oldLineItemTotal subTotal.shouldHave(exactText(newSubTotal)); } - /// ----- validate product data in cart item ----- /// + /// ----- validate product in cart item ----- /// @Step("validate item amount on the cart page") public void validateProductAmount(int position, int amount) @@ -140,6 +148,9 @@ private void validateCartItem(int position, String productName, String productSt // selector for product SelenideElement productContainer = $("#product" + (position - 1)); + // validate product image + productContainer.find(".product-img").shouldBe(visible); + // validate product name is same as {productName} productContainer.find(".productName").shouldHave(exactText(productName)); @@ -151,7 +162,11 @@ private void validateCartItem(int position, String productName, String productSt // validate product amount is same as {productAmount} validateProductAmount(position, productAmount); - + + // validate remove and update button + $("#btnRemoveProdCount" + (position - 1)).shouldBe(visible); + $("#btnUpdateProdCount" + (position - 1)).shouldBe(visible); + // validate product name is same as {productName} productContainer.find(".productUnitPrice").shouldHave(exactText(productPrice)); } diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index b852e8a2..650e09fc 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -43,4 +43,12 @@ public static String subtractFromPrice(String minuend, String subtrahend) double res = (double) (Math.round((Double.valueOf(removeCurrency(minuend)) - Double.valueOf(removeCurrency(subtrahend))) * 100)) / 100; return format(res); } + + @Step("calculate tax") + public static String calculateTax(String shippingCosts, String subtotal) + { + double totalPrice = (double) (Math.round((Double.valueOf(removeCurrency(shippingCosts)) + Double.valueOf(removeCurrency(subtotal))) * 100)) / 100; + double tax = (double) (Math.round((Double.valueOf(totalPrice) * 0.06) * 100)) / 100; + return format(tax); + } } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 46f51c79..6d09964e 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -14,6 +14,7 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; +import posters.pageobjects.utility.PriceHelper; import posters.tests.AbstractTest; import posters.tests.testdata.AddToCartTestData; @@ -35,11 +36,13 @@ public void testAddProductsToCart() // go to homepage var homePage = OpenHomePageFlow.flow(); - // go to cart page and validate + // go to empty cart page var cartPage = homePage.miniCart.openCartPage(); + + // validate empty cart page cartPage.validateEmptyCartPage(); - cartPage.miniCart.validateEmptyMiniCart(); cartPage.validateHeaderAndFooter(cartPage); + cartPage.miniCart.validateEmptyMiniCart(); // go back to homepage cartPage.openHomePage(); @@ -49,78 +52,88 @@ public void testAddProductsToCart() // store old subtotal final String oldSubtotal = homePage.miniCart.getSubtotal(); - // go to top category page and validate + // go to top category page var categoryPage = homePage.topNav.clickCategory(addToCartTestData.getTopCategory()); + + // validate top category page categoryPage.validate(addToCartTestData.getTopCategory(), addToCartTestData.getExpectedCategoryResultCount()); categoryPage.validateHeaderAndFooter(categoryPage); + categoryPage.miniCart.validateEmptyMiniCart(); - // go to sub category page + // go to sub category page and validate var subCategoryPage = categoryPage.topNav.clickSubCategory(addToCartTestData.getTopCategory(), addToCartTestData.getSubCategory()); + + // validate sub category page subCategoryPage.validate(addToCartTestData.getSubCategory(), addToCartTestData.getExpectedSubCategoryResultCount()); - // go to product page - final String productName = categoryPage.getProductNameByPosition(addToCartTestData.getPosition()); + // go to product detail page var productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getPosition()); - productDetailPage.validate(productName); - productDetailPage.validateHeaderAndFooter(productDetailPage); - + // add product to cart productDetailPage.addToCart("16 x 12 in", "matte"); - - // go to cart + + // store displayed product final var product = productDetailPage.getProduct(); + + // validate product detail page + productDetailPage.validate(product.getName()); + productDetailPage.validateHeaderAndFooter(productDetailPage); + productDetailPage.miniCart.validateTotalCount(++totalCount); + productDetailPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); + + // go to cart page cartPage = productDetailPage.miniCart.openCartPage(); - /* // validate cart page - cartPage.validate(shippingCosts); - cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); cartPage.validateCartItem(addToCartTestData.getPosition(), product); - - // validate (sub)total after adding new item to cart + cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(addToCartTestData.getPosition(), oldSubtotal, 0.00); - + cartPage.miniCart.validateTotalCount(totalCount); + cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); + + /// ----- PART 3: USE SEARCH BAR TO ADD PRODUCT TO CART ----- /// + // store old subtotal final String oldSubtotal2 = cartPage.miniCart.getSubtotal(); - - // validate mini cart total product count - cartPage.miniCart.validateTotalCount(++totalCount); - /* - /// ----- part 2: search for product and add to cart ----- /// - - // search for product on cart page + // go to category page via search categoryPage = cartPage.search.categoryPageResult(addToCartTestData.getSearchTerm()); - categoryPage.validateSearchHits(addToCartTestData.getSearchTerm(), addToCartTestData.getSearchResultCount()); + + // validate category page + categoryPage.validate(addToCartTestData.getSearchTerm(), addToCartTestData.getExpectedSearchResultCount()); + categoryPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); - // go to product page - final String productName2 = categoryPage.getProductNameByPosition(addToCartTestData.getPosition()); + // go to product detail page productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getPosition()); - productDetailPage.validate(productName2); - + // add product to cart productDetailPage.addToCart("64 x 48 in", "gloss"); - - // go to cart + + // store displayed product final var product2 = productDetailPage.getProduct(); + + // validate product detail page + productDetailPage.validate(product2.getName()); + productDetailPage.miniCart.validateTotalCount(++totalCount); + productDetailPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product2); + + // go to cart page cartPage = productDetailPage.miniCart.openCartPage(); // validate cart page - cartPage.validate(shippingCosts); - cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product2); cartPage.validateCartItem(addToCartTestData.getPosition(), product2); + cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); + cartPage.validateTotalAfterAdd(addToCartTestData.getPosition(), oldSubtotal2, 0.00); + cartPage.miniCart.validateTotalCount(totalCount); + cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product2); - // validate (sub)total after adding new item to cart - cartPage.validateTotalAfterAdd(1, oldSubtotal2, 0.00); - - // store old subtotal - final String oldSubtotal3 = cartPage.miniCart.getSubtotal(); - - // validate mini cart total product count - cartPage.miniCart.validateTotalCount(++totalCount); + /* /// ----- part 3: change amount of product in cart ----- /// + // store old subtotal + final String oldSubtotal3 = cartPage.miniCart.getSubtotal(); + // update amount of product on cart page final var productBeforeUpdate = cartPage.getProduct(addToCartTestData.getPosition()); cartPage.updateProductCount(addToCartTestData.getPosition(), addToCartTestData.getAmountChange()); diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/AddToCartTestData.java index aa834d84..1a566d44 100644 --- a/src/test/java/posters/tests/testdata/AddToCartTestData.java +++ b/src/test/java/posters/tests/testdata/AddToCartTestData.java @@ -2,15 +2,20 @@ public class AddToCartTestData { + private int position; private String topCategory; private String subCategory; private int expectedCategoryResultCount; private int expectedSubCategoryResultCount; - private int position; private String searchTerm; - private int searchResultCount; + private int expectedSearchResultCount; private int amountChange; + public int getPosition() + { + return position; + } + public String getTopCategory() { return topCategory; @@ -31,19 +36,14 @@ public int getExpectedSubCategoryResultCount() return expectedSubCategoryResultCount; } - public int getPosition() - { - return position; - } - public String getSearchTerm() { return searchTerm; } - public int getSearchResultCount() + public int getExpectedSearchResultCount() { - return searchResultCount; + return expectedSearchResultCount; } public int getAmountChange() diff --git a/src/test/resources/posters/tests/smoke/AddToCartTest.json b/src/test/resources/posters/tests/smoke/AddToCartTest.json index 46dc8537..eeb069f1 100644 --- a/src/test/resources/posters/tests/smoke/AddToCartTest.json +++ b/src/test/resources/posters/tests/smoke/AddToCartTest.json @@ -1,12 +1,12 @@ [ { + "position": "1", "topCategory": "header.topNavigation.1.title", "subCategory": "header.topNavigation.1.subCategory.1", "expectedCategoryResultCount": "30", "expectedSubCategoryResultCount": "10", - "position": "1", "searchTerm": "pizza", - "searchResultCount": "1", + "expectedSearchResultCount": "1", "amountChange": "3" } ] From 1f6fac93f38c793e47be1c406d43b78ef1e02971 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Fri, 28 Jul 2023 15:21:52 +0200 Subject: [PATCH 09/44] almost finished AddToCartTest --- .../pages/browsing/ProductDetailPage.java | 1 - .../pageobjects/pages/checkout/CartPage.java | 6 +- .../pageobjects/utility/PriceHelper.java | 2 +- .../posters/tests/smoke/AddToCartTest.java | 117 ++++++++++-------- .../tests/testdata/AddToCartTestData.java | 69 +++++++++-- .../posters/tests/smoke/AddToCartTest.json | 24 +++- 6 files changed, 147 insertions(+), 72 deletions(-) diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index 6f4599fd..58b1ba0b 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -173,7 +173,6 @@ public Product getProduct() return new Product(getProductName(), getProductPrice(), getChosenStyle(), getChosenSize(), 1); } - // ---------------------------------------------------------------------------------- diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 05da8482..119c3580 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -103,13 +103,13 @@ public void validateTotalAfterAdd(int position, String oldSubTotal, double total SelenideElement productContainer = $("#product" + (position - 1)); // store product unit price (without $ sign) for 1 unit - String unitPrice = PriceHelper.removeCurrency(productContainer.find(".unitPriceShort").text()); + String unitPrice = productContainer.find(".unitPriceShort").text(); // store product count String quantity = $("#productCount" + (position - 1)).val(); // calculate price of specified product - String subOrderPrice = PriceHelper.computeRowPrice(PriceHelper.addCurrency(unitPrice), quantity); + String subOrderPrice = PriceHelper.computeRowPrice(unitPrice, quantity); // verify calculated unit price equals the displayed total unit price productContainer.find(".productTotalUnitPrice").shouldHave(exactText(subOrderPrice)); @@ -216,7 +216,7 @@ public String getProductUnitPrice(int position) } @Step("get product total price from line item on the cart page") - public String getProductTotalUnitPrice(int position) + public String getProductTotalPrice(int position) { return $("#product" + (position - 1) + " .productTotalUnitPrice").text(); } diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index 650e09fc..3aad3478 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -33,7 +33,7 @@ public static String format(double input) @Step("calculate ({unitPrice} * {quantity} * 100) / 100 -> ensure two decimal places") public static String computeRowPrice(String unitPrice, String quantity) { - double res = (double) (Math.round(Double.valueOf(removeCurrency(unitPrice)) * Double.valueOf(quantity) * 100)) / 100; + double res = (double) (Math.round((Double.valueOf(removeCurrency(unitPrice)) * Double.valueOf(quantity)) * 100)) / 100; return format(res); } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 6d09964e..9004ae8f 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -1,11 +1,8 @@ package posters.tests.smoke; import org.junit.Test; -import org.openqa.selenium.By; -import static com.codeborne.selenide.Selenide.$; - -import com.codeborne.selenide.Selenide; +import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; @@ -14,7 +11,6 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; -import posters.pageobjects.utility.PriceHelper; import posters.tests.AbstractTest; import posters.tests.testdata.AddToCartTestData; @@ -24,6 +20,8 @@ public class AddToCartTest extends AbstractTest { @Test + //@DataSet(1) + @DataSet(2) public void testAddProductsToCart() { // use test data class @@ -67,7 +65,7 @@ public void testAddProductsToCart() subCategoryPage.validate(addToCartTestData.getSubCategory(), addToCartTestData.getExpectedSubCategoryResultCount()); // go to product detail page - var productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getPosition()); + var productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getSubCategoryResultPosition()); // add product to cart productDetailPage.addToCart("16 x 12 in", "matte"); @@ -79,17 +77,17 @@ public void testAddProductsToCart() productDetailPage.validate(product.getName()); productDetailPage.validateHeaderAndFooter(productDetailPage); productDetailPage.miniCart.validateTotalCount(++totalCount); - productDetailPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); + productDetailPage.miniCart.validateMiniCart(1, product); // go to cart page cartPage = productDetailPage.miniCart.openCartPage(); // validate cart page - cartPage.validateCartItem(addToCartTestData.getPosition(), product); + cartPage.validateCartItem(1, product); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); - cartPage.validateTotalAfterAdd(addToCartTestData.getPosition(), oldSubtotal, 0.00); + cartPage.validateTotalAfterAdd(1, oldSubtotal, 0.00); cartPage.miniCart.validateTotalCount(totalCount); - cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); + cartPage.miniCart.validateMiniCart(1, product); /// ----- PART 3: USE SEARCH BAR TO ADD PRODUCT TO CART ----- /// @@ -101,10 +99,10 @@ public void testAddProductsToCart() // validate category page categoryPage.validate(addToCartTestData.getSearchTerm(), addToCartTestData.getExpectedSearchResultCount()); - categoryPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product); + categoryPage.miniCart.validateMiniCart(1, product); // go to product detail page - productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getPosition()); + productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getSearchResultPosition()); // add product to cart productDetailPage.addToCart("64 x 48 in", "gloss"); @@ -115,75 +113,92 @@ public void testAddProductsToCart() // validate product detail page productDetailPage.validate(product2.getName()); productDetailPage.miniCart.validateTotalCount(++totalCount); - productDetailPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product2); + productDetailPage.miniCart.validateMiniCart(1, product2); + productDetailPage.miniCart.validateMiniCart(2, product); // go to cart page cartPage = productDetailPage.miniCart.openCartPage(); // validate cart page - cartPage.validateCartItem(addToCartTestData.getPosition(), product2); + cartPage.validateCartItem(1, product2); + cartPage.validateCartItem(2, product); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); - cartPage.validateTotalAfterAdd(addToCartTestData.getPosition(), oldSubtotal2, 0.00); + cartPage.validateTotalAfterAdd(1, oldSubtotal2, 0.00); cartPage.miniCart.validateTotalCount(totalCount); - cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), product2); - - - /* - /// ----- part 3: change amount of product in cart ----- /// + cartPage.miniCart.validateMiniCart(1, product2); + cartPage.miniCart.validateMiniCart(2, product); + /// ----- PART 4: CHANGE QUANTITY OF PRODUCT IN CART ----- /// + // store old subtotal final String oldSubtotal3 = cartPage.miniCart.getSubtotal(); - // update amount of product on cart page - final var productBeforeUpdate = cartPage.getProduct(addToCartTestData.getPosition()); - cartPage.updateProductCount(addToCartTestData.getPosition(), addToCartTestData.getAmountChange()); + // store product before update + final var productBeforeUpdate = cartPage.getProduct(addToCartTestData.getProductUpdatePosition()); - // validate cart page - final String newLineItemPrice = cartPage.getProductTotalUnitPrice(addToCartTestData.getPosition()); - cartPage.validate(shippingCosts); - cartPage.miniCart.validateMiniCart(addToCartTestData.getPosition(), productBeforeUpdate, addToCartTestData.getAmountChange(), newLineItemPrice); - cartPage.validateCartItem(addToCartTestData.getPosition(), productBeforeUpdate, addToCartTestData.getAmountChange()); + // update amount of product on cart page + cartPage.updateProductCount(addToCartTestData.getProductUpdatePosition(), addToCartTestData.getAmountChange()); + totalCount = totalCount + addToCartTestData.getAmountChange() - 1; - // validate (sub)total after changing product amount - cartPage.validateTotalAfterAdd(addToCartTestData.getPosition(), oldSubtotal3, productBeforeUpdate.getTotalPrice()); + // store subtotal of updated product + String subtotalAfterUpdate = cartPage.getProductTotalPrice(addToCartTestData.getProductUpdatePosition()); - // validate mini cart total product count - totalCount = totalCount + addToCartTestData.getAmountChange() - 1; + // validate cart page + cartPage.validateCartItem(addToCartTestData.getProductUpdatePosition(), productBeforeUpdate, addToCartTestData.getAmountChange()); + cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); + cartPage.validateTotalAfterAdd(addToCartTestData.getProductUpdatePosition(), oldSubtotal3, productBeforeUpdate.getTotalPrice()); cartPage.miniCart.validateTotalCount(totalCount); + cartPage.miniCart.validateMiniCart(addToCartTestData.getProductUpdatePosition(), productBeforeUpdate, addToCartTestData.getAmountChange(), subtotalAfterUpdate); + + /// ----- PART 5: REMOVE PRODUCT FROM CART ----- /// // store old subtotal - final String oldSubTotal4 = cartPage.miniCart.getSubtotal(); + final String oldSubtotal4 = cartPage.miniCart.getSubtotal(); - // ----- part 4: remove product on cart page ----- // + // store subtotal product before remove + final String subtotalBeforeRemove = cartPage.getProductTotalPrice(addToCartTestData.getProductRemovePosition()); - // remove product on cart page cartPage.removeProduct(productToUpdatePosition); - final String oldLineItemTotal = cartPage.getProductTotalUnitPrice(addToCartTestData.getPosition()); - cartPage.removeProduct(addToCartTestData.getPosition()); + // remove product on cart page + cartPage.removeProduct(addToCartTestData.getProductRemovePosition()); + totalCount = totalCount - addToCartTestData.getAmountChange(); // validate cart page - cartPage.validateTotalAfterRemove(oldSubTotal4, oldLineItemTotal); - cartPage.validate(shippingCosts); - - // validate mini cart total product count - totalCount = totalCount - addToCartTestData.getAmountChange(); + cartPage.validateCartItem(1, product); + cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); + cartPage.validateTotalAfterRemove(oldSubtotal4, subtotalBeforeRemove); cartPage.miniCart.validateTotalCount(totalCount); + cartPage.miniCart.validateMiniCart(1, product); + + /// ----- PART 6: ADD SAME PRODUCT TO CART AGAIN ----- /// - // ----- part 5: navigate to product and add to cart ----- // + // store old subtotal + final String oldSubtotal5 = cartPage.miniCart.getSubtotal(); + + // store product on cart page + final var productFromCartPageBefore = cartPage.getProduct(1); - // open product page - final var productFromCartPage = cartPage.getProduct(addToCartTestData.getPosition()); - productDetailPage = cartPage.openProductDetailPage(addToCartTestData.getPosition()); - productDetailPage.validate(productFromCartPage.getName()); + // go to product detail page + productDetailPage = cartPage.openProductDetailPage(1); // add product to cart - productDetailPage.addToCart(productFromCartPage.getSize(), productFromCartPage.getStyle()); + productDetailPage.addToCart(productFromCartPageBefore.getSize(), productFromCartPageBefore.getStyle()); + + // validate product detail page + productDetailPage.validate(productFromCartPageBefore.getName()); + productDetailPage.miniCart.validateTotalCount(++totalCount); // go to cart cartPage = productDetailPage.miniCart.openCartPage(); + // store subtotal of updated product + subtotalAfterUpdate = cartPage.getProductTotalPrice(1); + final var productFromCartPageAfter = cartPage.getProduct(1); + // validate cart page - cartPage.validateCartItem(addToCartTestData.getPosition(), productFromCartPage, 2); - cartPage.miniCart.validateTotalCount(++totalCount); - */ + cartPage.validateCartItem(1, productFromCartPageBefore, productFromCartPageAfter.getAmount()); + cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); + cartPage.validateTotalAfterAdd(1, oldSubtotal5, productFromCartPageBefore.getTotalPrice()); + cartPage.miniCart.validateTotalCount(totalCount); + cartPage.miniCart.validateMiniCart(1, productFromCartPageBefore, totalCount, subtotalAfterUpdate); } } diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/AddToCartTestData.java index 1a566d44..cb7550bf 100644 --- a/src/test/java/posters/tests/testdata/AddToCartTestData.java +++ b/src/test/java/posters/tests/testdata/AddToCartTestData.java @@ -2,52 +2,95 @@ public class AddToCartTestData { - private int position; private String topCategory; - private String subCategory; + private int expectedCategoryResultCount; + + private int categoryResultPosition; + + private String subCategory; + private int expectedSubCategoryResultCount; + + private int subCategoryResultPosition; + private String searchTerm; + private int expectedSearchResultCount; + + private int searchResultPosition; + + private int productUpdatePosition; + private int amountChange; - public int getPosition() - { - return position; - } + private int productRemovePosition; + + /// ----- top category ----- /// - public String getTopCategory() + public String getTopCategory() { return topCategory; } - public String getSubCategory() - { - return subCategory; - } - public int getExpectedCategoryResultCount() { return expectedCategoryResultCount; } + + public int getCategoryResultPosition() + { + return categoryResultPosition; + } + /// ----- sub category ----- /// + + public String getSubCategory() + { + return subCategory; + } + public int getExpectedSubCategoryResultCount() { return expectedSubCategoryResultCount; } + public int getSubCategoryResultPosition() + { + return subCategoryResultPosition; + } + + /// ----- search term ----- /// + public String getSearchTerm() { return searchTerm; } - + public int getExpectedSearchResultCount() { return expectedSearchResultCount; } + public int getSearchResultPosition() + { + return searchResultPosition; + } + + /// ----- update data ----- /// + + public int getProductUpdatePosition() + { + return productUpdatePosition; + } + public int getAmountChange() { return amountChange; } + + public int getProductRemovePosition() + { + return productRemovePosition; + } } \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/AddToCartTest.json b/src/test/resources/posters/tests/smoke/AddToCartTest.json index eeb069f1..f632ecfa 100644 --- a/src/test/resources/posters/tests/smoke/AddToCartTest.json +++ b/src/test/resources/posters/tests/smoke/AddToCartTest.json @@ -1,12 +1,30 @@ [ { - "position": "1", "topCategory": "header.topNavigation.1.title", - "subCategory": "header.topNavigation.1.subCategory.1", "expectedCategoryResultCount": "30", + "categoryResultPosition": "1", + "subCategory": "header.topNavigation.1.subCategory.1", "expectedSubCategoryResultCount": "10", + "subCategoryResultPosition": "1", "searchTerm": "pizza", "expectedSearchResultCount": "1", - "amountChange": "3" + "searchResultPosition": "1", + "productUpdatePosition": "1", + "amountChange": "3", + "productRemovePosition": "1" + }, + { + "topCategory": "header.topNavigation.3.title", + "expectedCategoryResultCount": "30", + "categoryResultPosition": "2", + "subCategory": "header.topNavigation.3.subCategory.2", + "expectedSubCategoryResultCount": "10", + "subCategoryResultPosition": "2", + "searchTerm": "boston", + "expectedSearchResultCount": "5", + "searchResultPosition": "4", + "productUpdatePosition": "2", + "amountChange": "5", + "productRemovePosition": "1" } ] From 07c437ea8bcd611ffddd2e8052fbca580adda721 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 31 Jul 2023 12:34:57 +0200 Subject: [PATCH 10/44] fixed second test data set AddToCardTest, extended Pagination --- config/localization.yaml | 5 + .../pageobjects/components/Pagination.java | 96 ++++++++++++++++++- .../pages/browsing/CategoryPage.java | 3 +- .../pages/browsing/ProductDetailPage.java | 5 +- .../posters/tests/smoke/AddToCartTest.java | 8 +- .../tests/testdata/AddToCartTestData.java | 28 ++++++ .../posters/tests/smoke/AddToCartTest.json | 10 +- 7 files changed, 146 insertions(+), 9 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index 7ed19d65..a38dd0a2 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -37,6 +37,11 @@ default: sale: first: "25% off (Almost) Everything! Use Code: Posters Sale" second: "Our biggest sale yet 50% off all Posters" + pagination: + goToNextPage: ">" + goToLastPage: ">>" + goToPrevPage: "<" + goToFirstPage: "<<" footer: text: Copyright (c) 2013-2020 Xceptance Software Technologies GmbH -- This software is for demo purposes only and not meant to be used in production. search: diff --git a/src/test/java/posters/pageobjects/components/Pagination.java b/src/test/java/posters/pageobjects/components/Pagination.java index 69ffddf2..37ffae18 100644 --- a/src/test/java/posters/pageobjects/components/Pagination.java +++ b/src/test/java/posters/pageobjects/components/Pagination.java @@ -1,26 +1,118 @@ package posters.pageobjects.components; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import java.util.Random; +import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.Selectors; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.CategoryPage; public class Pagination extends AbstractComponent { - private SelenideElement pagination = $("#pagination-bottom"); + private static SelenideElement pagination = $("#pagination-bottom"); + + private static ElementsCollection paginationComponents = $$("#pagination-bottom li"); public void isComponentAvailable() { pagination.shouldBe(visible); } - + + /// ----- pagination navigation ----- /// + + @Step("click on specific page number") + public static void goToPage(int pageNumber) + { + paginationComponents.findBy(exactText(Integer.toString(pageNumber))).shouldBe(visible).click(); + } + + @Step("click on go to next page") + public static void goToNextPage() + { + paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToNextPage"))).click(); + } + + @Step("click on go to last page") + public static void goToLastPage() + { + paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToLastPage"))).click(); + } + + @Step("click on go to previous page") + public static void goToPrevPage() + { + paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToPrevPage"))).click(); + } + + @Step("click on go to first page") + public static void goToFirstPage() + { + paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToFirstPage"))).click(); + } + + /// ----- validate pagination ----- /// + + @Step("validate visibility numbers in navigation") + public static void validateElementNumbers(int expectedResultCount) + { + int numberOfPages = expectedResultCount / 6; + for (int i = 1; i < numberOfPages; i++) + { + paginationComponents.findBy(exactText(Integer.toString(i))).shouldBe(visible); + } + } + + @Step("validate visibility right navigation") + public static void validateRightNavigation() + { + paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToNextPage"))).shouldBe(visible); + paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToLastPage"))).shouldBe(visible); + } + + @Step("validate visibility left navigation") + public static void validateLeftNavigation() + { + paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToPrevPage"))).shouldBe(visible); + paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToFirstPage"))).shouldBe(visible); + } + + @Step("validate pagination") + public static void validateStructure(int expectedResultCount) + { + int numberOfPages = expectedResultCount / 6; + if (numberOfPages > 1) + { + pagination.shouldBe(visible); + + validateElementNumbers(expectedResultCount); + validateRightNavigation(); + + for (int j = 2; j < numberOfPages; j++) + { + goToPage(j); + validateLeftNavigation(); + validateElementNumbers(expectedResultCount); + validateRightNavigation(); + } + + goToLastPage(); + validateLeftNavigation(); + validateElementNumbers(expectedResultCount); + } + else return; + } + + // --------------------------------------------- + @Step("get number of available pages") public int getNumberOfSites() { diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index e709faa3..10e46b88 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -18,7 +18,7 @@ public class CategoryPage extends AbstractBrowsingPage { - public Pagination pagination = new Pagination(); + //public Pagination pagination = new Pagination(); private SelenideElement productOverview = $("#productOverview"); @@ -69,6 +69,7 @@ public void validate(String categoryName, int expectedResultCount) { validateStructure(); validateCategoryHeadline(categoryName, expectedResultCount); + Pagination.validateStructure(expectedResultCount); } /// ----- product by position ----- /// diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index 58b1ba0b..88de6496 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -53,7 +53,10 @@ public void validateSizeDropdown() validateSizeDropdown("ProductdetailPage.size.32x24"); validateSizeDropdown("ProductdetailPage.size.64x48"); } - else validateSizeDropdown("ProductdetailPage.size.96x32"); + else + { + validateSizeDropdown("ProductdetailPage.size.96x32"); + } productSize.scrollTo().click(); } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 9004ae8f..a948e57c 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -20,7 +20,7 @@ public class AddToCartTest extends AbstractTest { @Test - //@DataSet(1) + @DataSet(1) @DataSet(2) public void testAddProductsToCart() { @@ -68,7 +68,7 @@ public void testAddProductsToCart() var productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getSubCategoryResultPosition()); // add product to cart - productDetailPage.addToCart("16 x 12 in", "matte"); + productDetailPage.addToCart(addToCartTestData.getSizeFirstProduct(), addToCartTestData.getStyleFirstProduct()); // store displayed product final var product = productDetailPage.getProduct(); @@ -105,7 +105,7 @@ public void testAddProductsToCart() productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getSearchResultPosition()); // add product to cart - productDetailPage.addToCart("64 x 48 in", "gloss"); + productDetailPage.addToCart(addToCartTestData.getSizeSecondProduct(), addToCartTestData.getStyleSecondProduct()); // store displayed product final var product2 = productDetailPage.getProduct(); @@ -148,7 +148,7 @@ public void testAddProductsToCart() cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(addToCartTestData.getProductUpdatePosition(), oldSubtotal3, productBeforeUpdate.getTotalPrice()); cartPage.miniCart.validateTotalCount(totalCount); - cartPage.miniCart.validateMiniCart(addToCartTestData.getProductUpdatePosition(), productBeforeUpdate, addToCartTestData.getAmountChange(), subtotalAfterUpdate); + cartPage.miniCart.validateMiniCart(1, productBeforeUpdate, addToCartTestData.getAmountChange(), subtotalAfterUpdate); /// ----- PART 5: REMOVE PRODUCT FROM CART ----- /// diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/AddToCartTestData.java index cb7550bf..a95d85a4 100644 --- a/src/test/java/posters/tests/testdata/AddToCartTestData.java +++ b/src/test/java/posters/tests/testdata/AddToCartTestData.java @@ -13,6 +13,10 @@ public class AddToCartTestData private int expectedSubCategoryResultCount; private int subCategoryResultPosition; + + private String sizeFirstProduct; + + private String styleFirstProduct; private String searchTerm; @@ -20,6 +24,10 @@ public class AddToCartTestData private int searchResultPosition; + private String sizeSecondProduct; + + private String styleSecondProduct; + private int productUpdatePosition; private int amountChange; @@ -59,6 +67,16 @@ public int getSubCategoryResultPosition() { return subCategoryResultPosition; } + + public String getSizeFirstProduct() + { + return sizeFirstProduct; + } + + public String getStyleFirstProduct() + { + return styleFirstProduct; + } /// ----- search term ----- /// @@ -76,6 +94,16 @@ public int getSearchResultPosition() { return searchResultPosition; } + + public String getSizeSecondProduct() + { + return sizeSecondProduct; + } + + public String getStyleSecondProduct() + { + return styleSecondProduct; + } /// ----- update data ----- /// diff --git a/src/test/resources/posters/tests/smoke/AddToCartTest.json b/src/test/resources/posters/tests/smoke/AddToCartTest.json index f632ecfa..8b564221 100644 --- a/src/test/resources/posters/tests/smoke/AddToCartTest.json +++ b/src/test/resources/posters/tests/smoke/AddToCartTest.json @@ -6,9 +6,13 @@ "subCategory": "header.topNavigation.1.subCategory.1", "expectedSubCategoryResultCount": "10", "subCategoryResultPosition": "1", + "sizeFirstProduct": "16 x 12 in", + "styleFirstProduct": "matte", "searchTerm": "pizza", "expectedSearchResultCount": "1", "searchResultPosition": "1", + "sizeSecondProduct": "64 x 48 in", + "styleSecondProduct": "gloss", "productUpdatePosition": "1", "amountChange": "3", "productRemovePosition": "1" @@ -20,10 +24,14 @@ "subCategory": "header.topNavigation.3.subCategory.2", "expectedSubCategoryResultCount": "10", "subCategoryResultPosition": "2", + "sizeFirstProduct": "32 x 24 in", + "styleFirstProduct": "gloss", "searchTerm": "boston", "expectedSearchResultCount": "5", "searchResultPosition": "4", - "productUpdatePosition": "2", + "sizeSecondProduct": "96 x 32 in", + "styleSecondProduct": "matte", + "productUpdatePosition": "1", "amountChange": "5", "productRemovePosition": "1" } From 7e69f4a2c887cbed61a46f9aa5e138e97a756c4c Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 31 Jul 2023 13:41:52 +0200 Subject: [PATCH 11/44] finished AddToCartTest --- .../posters/tests/smoke/AddToCartTest.java | 91 ++++--------------- .../tests/testdata/AddToCartTestData.java | 7 -- .../posters/tests/smoke/AddToCartTest.json | 12 +-- 3 files changed, 21 insertions(+), 89 deletions(-) diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index a948e57c..59253875 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -29,92 +29,45 @@ public void testAddProductsToCart() final String shippingCosts = Neodymium.dataValue("shippingCosts"); int totalCount = 0; - /// ----- PART 1: GO TO EMPTY CART AND VALIDATE ----- /// + /// ----- PART 1: USE TOP NAVIGATION TO ADD PRODUCT TO CART ----- /// // go to homepage var homePage = OpenHomePageFlow.flow(); - - // go to empty cart page - var cartPage = homePage.miniCart.openCartPage(); - - // validate empty cart page - cartPage.validateEmptyCartPage(); - cartPage.validateHeaderAndFooter(cartPage); - cartPage.miniCart.validateEmptyMiniCart(); - - // go back to homepage - cartPage.openHomePage(); - - /// ----- PART 2: USE TOP NAVIGATION TO ADD PRODUCT TO CART ----- /// // store old subtotal final String oldSubtotal = homePage.miniCart.getSubtotal(); - // go to top category page + // go to sub category page var categoryPage = homePage.topNav.clickCategory(addToCartTestData.getTopCategory()); - - // validate top category page - categoryPage.validate(addToCartTestData.getTopCategory(), addToCartTestData.getExpectedCategoryResultCount()); - categoryPage.validateHeaderAndFooter(categoryPage); - categoryPage.miniCart.validateEmptyMiniCart(); - - // go to sub category page and validate var subCategoryPage = categoryPage.topNav.clickSubCategory(addToCartTestData.getTopCategory(), addToCartTestData.getSubCategory()); - - // validate sub category page - subCategoryPage.validate(addToCartTestData.getSubCategory(), addToCartTestData.getExpectedSubCategoryResultCount()); - // go to product detail page - var productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getSubCategoryResultPosition()); - - // add product to cart + // go to product detail page, add and store displayed product + var productDetailPage = subCategoryPage.clickProductByPosition(addToCartTestData.getSubCategoryResultPosition()); productDetailPage.addToCart(addToCartTestData.getSizeFirstProduct(), addToCartTestData.getStyleFirstProduct()); - - // store displayed product final var product = productDetailPage.getProduct(); - - // validate product detail page - productDetailPage.validate(product.getName()); - productDetailPage.validateHeaderAndFooter(productDetailPage); - productDetailPage.miniCart.validateTotalCount(++totalCount); - productDetailPage.miniCart.validateMiniCart(1, product); - - // go to cart page - cartPage = productDetailPage.miniCart.openCartPage(); + // go to cart page + var cartPage = productDetailPage.miniCart.openCartPage(); + // validate cart page cartPage.validateCartItem(1, product); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(1, oldSubtotal, 0.00); - cartPage.miniCart.validateTotalCount(totalCount); + cartPage.miniCart.validateTotalCount(++totalCount); cartPage.miniCart.validateMiniCart(1, product); - /// ----- PART 3: USE SEARCH BAR TO ADD PRODUCT TO CART ----- /// + /// ----- PART 2: USE SEARCH BAR TO ADD PRODUCT TO CART ----- /// // store old subtotal final String oldSubtotal2 = cartPage.miniCart.getSubtotal(); // go to category page via search categoryPage = cartPage.search.categoryPageResult(addToCartTestData.getSearchTerm()); - - // validate category page - categoryPage.validate(addToCartTestData.getSearchTerm(), addToCartTestData.getExpectedSearchResultCount()); - categoryPage.miniCart.validateMiniCart(1, product); - // go to product detail page + // go to product detail page, add and store displayed product productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getSearchResultPosition()); - - // add product to cart productDetailPage.addToCart(addToCartTestData.getSizeSecondProduct(), addToCartTestData.getStyleSecondProduct()); - - // store displayed product final var product2 = productDetailPage.getProduct(); - - // validate product detail page - productDetailPage.validate(product2.getName()); - productDetailPage.miniCart.validateTotalCount(++totalCount); - productDetailPage.miniCart.validateMiniCart(1, product2); - productDetailPage.miniCart.validateMiniCart(2, product); // go to cart page cartPage = productDetailPage.miniCart.openCartPage(); @@ -124,11 +77,11 @@ public void testAddProductsToCart() cartPage.validateCartItem(2, product); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(1, oldSubtotal2, 0.00); - cartPage.miniCart.validateTotalCount(totalCount); + cartPage.miniCart.validateTotalCount(++totalCount); cartPage.miniCart.validateMiniCart(1, product2); cartPage.miniCart.validateMiniCart(2, product); - /// ----- PART 4: CHANGE QUANTITY OF PRODUCT IN CART ----- /// + /// ----- PART 3: CHANGE QUANTITY OF PRODUCT IN CART ----- /// // store old subtotal final String oldSubtotal3 = cartPage.miniCart.getSubtotal(); @@ -150,16 +103,16 @@ public void testAddProductsToCart() cartPage.miniCart.validateTotalCount(totalCount); cartPage.miniCart.validateMiniCart(1, productBeforeUpdate, addToCartTestData.getAmountChange(), subtotalAfterUpdate); - /// ----- PART 5: REMOVE PRODUCT FROM CART ----- /// + /// ----- PART 4: REMOVE PRODUCT FROM CART ----- /// // store old subtotal final String oldSubtotal4 = cartPage.miniCart.getSubtotal(); // store subtotal product before remove - final String subtotalBeforeRemove = cartPage.getProductTotalPrice(addToCartTestData.getProductRemovePosition()); + final String subtotalBeforeRemove = cartPage.getProductTotalPrice(1); - // remove product on cart page - cartPage.removeProduct(addToCartTestData.getProductRemovePosition()); + // remove first product on cart page + cartPage.removeProduct(1); totalCount = totalCount - addToCartTestData.getAmountChange(); // validate cart page @@ -169,7 +122,7 @@ public void testAddProductsToCart() cartPage.miniCart.validateTotalCount(totalCount); cartPage.miniCart.validateMiniCart(1, product); - /// ----- PART 6: ADD SAME PRODUCT TO CART AGAIN ----- /// + /// ----- PART 5: ADD SAME PRODUCT TO CART AGAIN ----- /// // store old subtotal final String oldSubtotal5 = cartPage.miniCart.getSubtotal(); @@ -177,16 +130,10 @@ public void testAddProductsToCart() // store product on cart page final var productFromCartPageBefore = cartPage.getProduct(1); - // go to product detail page + // go to product detail page, add product to cart productDetailPage = cartPage.openProductDetailPage(1); - - // add product to cart productDetailPage.addToCart(productFromCartPageBefore.getSize(), productFromCartPageBefore.getStyle()); - // validate product detail page - productDetailPage.validate(productFromCartPageBefore.getName()); - productDetailPage.miniCart.validateTotalCount(++totalCount); - // go to cart cartPage = productDetailPage.miniCart.openCartPage(); @@ -198,7 +145,7 @@ public void testAddProductsToCart() cartPage.validateCartItem(1, productFromCartPageBefore, productFromCartPageAfter.getAmount()); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(1, oldSubtotal5, productFromCartPageBefore.getTotalPrice()); - cartPage.miniCart.validateTotalCount(totalCount); + cartPage.miniCart.validateTotalCount(++totalCount); cartPage.miniCart.validateMiniCart(1, productFromCartPageBefore, totalCount, subtotalAfterUpdate); } } diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/AddToCartTestData.java index a95d85a4..123eeb37 100644 --- a/src/test/java/posters/tests/testdata/AddToCartTestData.java +++ b/src/test/java/posters/tests/testdata/AddToCartTestData.java @@ -31,8 +31,6 @@ public class AddToCartTestData private int productUpdatePosition; private int amountChange; - - private int productRemovePosition; /// ----- top category ----- /// @@ -116,9 +114,4 @@ public int getAmountChange() { return amountChange; } - - public int getProductRemovePosition() - { - return productRemovePosition; - } } \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/AddToCartTest.json b/src/test/resources/posters/tests/smoke/AddToCartTest.json index 8b564221..8f14d89e 100644 --- a/src/test/resources/posters/tests/smoke/AddToCartTest.json +++ b/src/test/resources/posters/tests/smoke/AddToCartTest.json @@ -1,38 +1,30 @@ [ { "topCategory": "header.topNavigation.1.title", - "expectedCategoryResultCount": "30", "categoryResultPosition": "1", "subCategory": "header.topNavigation.1.subCategory.1", - "expectedSubCategoryResultCount": "10", "subCategoryResultPosition": "1", "sizeFirstProduct": "16 x 12 in", "styleFirstProduct": "matte", "searchTerm": "pizza", - "expectedSearchResultCount": "1", "searchResultPosition": "1", "sizeSecondProduct": "64 x 48 in", "styleSecondProduct": "gloss", "productUpdatePosition": "1", - "amountChange": "3", - "productRemovePosition": "1" + "amountChange": "3" }, { "topCategory": "header.topNavigation.3.title", - "expectedCategoryResultCount": "30", "categoryResultPosition": "2", "subCategory": "header.topNavigation.3.subCategory.2", - "expectedSubCategoryResultCount": "10", "subCategoryResultPosition": "2", "sizeFirstProduct": "32 x 24 in", "styleFirstProduct": "gloss", "searchTerm": "boston", - "expectedSearchResultCount": "5", "searchResultPosition": "4", "sizeSecondProduct": "96 x 32 in", "styleSecondProduct": "matte", "productUpdatePosition": "1", - "amountChange": "5", - "productRemovePosition": "1" + "amountChange": "5" } ] From 786b55ebe76dc1b204ee558b6606b65764f324d8 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 31 Jul 2023 14:50:42 +0200 Subject: [PATCH 12/44] complex test data sets SearchTest --- src/test/java/posters/tests/AbstractTest.java | 13 ++++++ .../java/posters/tests/smoke/BrowseTest.java | 3 -- .../components}/SearchTest.java | 43 ++++--------------- .../tests/testdata/AddToCartTestData.java | 21 --------- .../tests/testdata/SearchTestData.java | 19 ++++++++ .../posters/tests/smoke/SearchTest.json | 6 +-- 6 files changed, 42 insertions(+), 63 deletions(-) rename src/test/java/posters/tests/smoke/{ => pageobjects/components}/SearchTest.java (56%) create mode 100644 src/test/java/posters/tests/testdata/SearchTestData.java diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index 740a5731..f4730659 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -1,15 +1,28 @@ package posters.tests; +import org.junit.Before; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.xceptance.neodymium.NeodymiumRunner; import com.xceptance.neodymium.module.statement.browser.multibrowser.Browser; +import com.xceptance.neodymium.util.DataUtils; + +import posters.tests.testdata.AddToCartTestData; +import posters.tests.testdata.SearchTestData; @RunWith(NeodymiumRunner.class) @Browser("Chrome_1024x768") public abstract class AbstractTest { + protected SearchTestData searchTestData; + + @Before + public void setup() + { + searchTestData = DataUtils.get(SearchTestData.class); + } + protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTest.class); } diff --git a/src/test/java/posters/tests/smoke/BrowseTest.java b/src/test/java/posters/tests/smoke/BrowseTest.java index 796a0f86..c59540c9 100644 --- a/src/test/java/posters/tests/smoke/BrowseTest.java +++ b/src/test/java/posters/tests/smoke/BrowseTest.java @@ -9,9 +9,6 @@ import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; -/** - * @author pfotenhauer - */ @Owner("Tim Brown") @Severity(SeverityLevel.NORMAL) @Tag("smoke") diff --git a/src/test/java/posters/tests/smoke/SearchTest.java b/src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java similarity index 56% rename from src/test/java/posters/tests/smoke/SearchTest.java rename to src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java index 9d087542..6091250e 100644 --- a/src/test/java/posters/tests/smoke/SearchTest.java +++ b/src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java @@ -1,18 +1,15 @@ -package posters.tests.smoke; +package posters.tests.smoke.pageobjects.components; -import org.junit.Before; import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; -import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; -import posters.pageobjects.pages.browsing.AbstractBrowsingPage; import posters.tests.AbstractTest; @Owner("Tim Brown") @@ -20,56 +17,32 @@ @Tag("smoke") @SuppressDataSets public class SearchTest extends AbstractTest -{ - private String searchTerm; - - private int position; - - private int searchTermExpectedCount; - - @Before - public void setup() - { - searchTerm = DataUtils.asString("searchTerm"); - position = DataUtils.asInt("position", 0); - searchTermExpectedCount = DataUtils.asInt("searchTermExpectedCount", 0); - } - +{ @Test @DataSet(1) public void testSearching() - { + { // go to homepage var homePage = OpenHomePageFlow.flow(); // go to category page - var categoryPage = homePage.search.categoryPageResult(searchTerm); - categoryPage.validate(searchTerm, searchTermExpectedCount); - validateHeaderAndFooter(categoryPage); + var categoryPage = homePage.search.categoryPageResult(searchTestData.getSearchTerm()); //go to product detail page - final String productName = categoryPage.getProductNameByPosition(position); - var productDetailPage = categoryPage.clickProductByPosition(position); + final String productName = categoryPage.getProductNameByPosition(searchTestData.getResultPosition()); + var productDetailPage = categoryPage.clickProductByPosition(searchTestData.getResultPosition()); productDetailPage.validate(productName); - validateHeaderAndFooter(productDetailPage); } @Test @DataSet(2) public void testSearchingWithoutResult() - { + { // go to homepage var homePage = OpenHomePageFlow.flow(); // go to no hits page - var noHitsPage = homePage.search.noHitsPageResult(searchTerm); + var noHitsPage = homePage.search.noHitsPageResult(searchTestData.getSearchTerm()); noHitsPage.validateStructure(); - validateHeaderAndFooter(noHitsPage); - } - - public void validateHeaderAndFooter(AbstractBrowsingPage page) - { - page.header.validateStructure(); - page.footer.validateStructure(); } } diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/AddToCartTestData.java index 123eeb37..4161af28 100644 --- a/src/test/java/posters/tests/testdata/AddToCartTestData.java +++ b/src/test/java/posters/tests/testdata/AddToCartTestData.java @@ -4,14 +4,10 @@ public class AddToCartTestData { private String topCategory; - private int expectedCategoryResultCount; - private int categoryResultPosition; private String subCategory; - private int expectedSubCategoryResultCount; - private int subCategoryResultPosition; private String sizeFirstProduct; @@ -20,8 +16,6 @@ public class AddToCartTestData private String searchTerm; - private int expectedSearchResultCount; - private int searchResultPosition; private String sizeSecondProduct; @@ -38,11 +32,6 @@ public String getTopCategory() { return topCategory; } - - public int getExpectedCategoryResultCount() - { - return expectedCategoryResultCount; - } public int getCategoryResultPosition() { @@ -55,11 +44,6 @@ public String getSubCategory() { return subCategory; } - - public int getExpectedSubCategoryResultCount() - { - return expectedSubCategoryResultCount; - } public int getSubCategoryResultPosition() { @@ -82,11 +66,6 @@ public String getSearchTerm() { return searchTerm; } - - public int getExpectedSearchResultCount() - { - return expectedSearchResultCount; - } public int getSearchResultPosition() { diff --git a/src/test/java/posters/tests/testdata/SearchTestData.java b/src/test/java/posters/tests/testdata/SearchTestData.java new file mode 100644 index 00000000..f78fbc31 --- /dev/null +++ b/src/test/java/posters/tests/testdata/SearchTestData.java @@ -0,0 +1,19 @@ +package posters.tests.testdata; + +public class SearchTestData +{ + private String searchTerm; + + private int resultPosition; + + public String getSearchTerm() + { + return searchTerm; + } + + public int getResultPosition() + { + return resultPosition; + } + +} \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/SearchTest.json b/src/test/resources/posters/tests/smoke/SearchTest.json index 8157ad8c..05a1fc73 100644 --- a/src/test/resources/posters/tests/smoke/SearchTest.json +++ b/src/test/resources/posters/tests/smoke/SearchTest.json @@ -1,12 +1,10 @@ [ { "searchTerm": "bear", - "position": "1", - "searchTermExpectedCount": "3" + "resultPosition": "1" }, { "searchTerm": "Foobar", - "position": "", - "searchTermExpectedCount": "" + "resultPosition": "" } ] From 132944544ba1cb5a1efad63145bd74fe2c9f5591 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 31 Jul 2023 15:39:59 +0200 Subject: [PATCH 13/44] implemented HeaderTest --- .../pageobjects/components/Header.java | 4 +- .../pageobjects/components/MiniCart.java | 14 +++---- .../pageobjects/components/UserMenu.java | 19 +++++---- src/test/java/posters/tests/AbstractTest.java | 11 ++++- .../posters/tests/smoke/AddToCartTest.java | 2 - .../pageobjects/components/HeaderTest.java | 41 +++++++++++++++++++ .../components/HeaderTestData.java | 18 ++++++++ .../components}/SearchTestData.java | 2 +- .../pageobjects/components/HeaderTest.json | 6 +++ .../components}/SearchTest.json | 3 +- 10 files changed, 95 insertions(+), 25 deletions(-) create mode 100644 src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java create mode 100644 src/test/java/posters/tests/testdata/pageobjects/components/HeaderTestData.java rename src/test/java/posters/tests/testdata/{ => pageobjects/components}/SearchTestData.java (82%) create mode 100644 src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json rename src/test/resources/posters/tests/smoke/{ => pageobjects/components}/SearchTest.json (59%) diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index fd7a9880..b555df01 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -22,8 +22,8 @@ public void validateStructure() Search.validateStructure(); TopNavigation.validateStructure(); - UserMenu.validateStructure(); - MiniCart.validateStructure(); + UserMenu.validateGuestUserMenu(); + MiniCart.validateEmptyMiniCart(); SaleBanner.validateStructure(); } } diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 4f6113a8..2da45e67 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -8,8 +8,6 @@ import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -22,11 +20,11 @@ public class MiniCart extends AbstractComponent { private static SelenideElement headerCart = $("#headerCartOverview"); - private SelenideElement subOrderPrice = $("#miniCartMenu .subOrderPrice"); + private static SelenideElement subOrderPrice = $("#miniCartMenu .subOrderPrice"); - private SelenideElement miniCart = $("#miniCartMenu"); + private static SelenideElement miniCart = $("#miniCartMenu"); - private SelenideElement totalCountElement = $("#headerCartOverview .headerCartProductCount"); + private static SelenideElement totalCountElement = $("#headerCartOverview .headerCartProductCount"); private SelenideElement goToCartButton = $(".goToCart"); @@ -40,14 +38,14 @@ public void isComponentAvailable() // ----- mini cart navigation ------ // @Step("open the mini cart") - public void openMiniCart() + public static void openMiniCart() { headerCart.hover(); miniCart.waitUntil(visible, 9000); } @Step("close the mini cart") - public void closeMiniCart() + public static void closeMiniCart() { $("#brand").hover(); miniCart.waitUntil(not(visible), 9000); @@ -84,7 +82,7 @@ public void validateTotalCount(int totalCount) } @Step("validate empty mini cart") - public void validateEmptyMiniCart() + public static void validateEmptyMiniCart() { // validate shopping cart icon, item count $(".icon-shopping-cart").shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index 28fc7ea4..740125c7 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -17,9 +17,6 @@ import posters.pageobjects.pages.user.LoginPage; import posters.pageobjects.pages.user.RegisterPage; -/** - * @author pfotenhauer - */ public class UserMenu extends AbstractComponent { @@ -34,8 +31,14 @@ public void isComponentAvailable() showUserMenu.should(exist); } - @Step("validate user menu") + @Step("validate logged in user menu") public static void validateStructure() + { + // TODO - verify for logged on user + } + + @Step("validate guest user menu") + public static void validateGuestUserMenu() { // validate user icon $(".icon-user2").shouldBe(visible); @@ -44,9 +47,9 @@ public static void validateStructure() showUserMenu.hover(); // validate structure user window - validateUserMenu("header.userMenu.greeting"); - validateUserMenu("header.userMenu.createAccount"); - validateUserMenu("header.userMenu.signIn"); + validateGuestUserMenu("header.userMenu.greeting"); + validateGuestUserMenu("header.userMenu.createAccount"); + validateGuestUserMenu("header.userMenu.signIn"); $("#userMenu .icon-user-add-outline").shouldBe(visible); $("#userMenu .icon-log-in").shouldBe(visible); @@ -55,7 +58,7 @@ public static void validateStructure() } @Step("validate strings in user menu") - private static void validateUserMenu(String text) + private static void validateGuestUserMenu(String text) { $$("#userMenu li").findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); } diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index f4730659..776beb66 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -10,19 +10,26 @@ import com.xceptance.neodymium.util.DataUtils; import posters.tests.testdata.AddToCartTestData; -import posters.tests.testdata.SearchTestData; +import posters.tests.testdata.pageobjects.components.HeaderTestData; +import posters.tests.testdata.pageobjects.components.SearchTestData; @RunWith(NeodymiumRunner.class) @Browser("Chrome_1024x768") public abstract class AbstractTest { protected SearchTestData searchTestData; + + protected AddToCartTestData addToCartTestData; + protected HeaderTestData headerTestData; + @Before public void setup() { searchTestData = DataUtils.get(SearchTestData.class); + addToCartTestData = DataUtils.get(AddToCartTestData.class); + headerTestData = DataUtils.get(HeaderTestData.class); } - + protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTest.class); } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 59253875..f5647fa5 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -24,8 +24,6 @@ public class AddToCartTest extends AbstractTest @DataSet(2) public void testAddProductsToCart() { - // use test data class - AddToCartTestData addToCartTestData = DataUtils.get(AddToCartTestData.class); final String shippingCosts = Neodymium.dataValue("shippingCosts"); int totalCount = 0; diff --git a/src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java b/src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java new file mode 100644 index 00000000..79ea4be3 --- /dev/null +++ b/src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java @@ -0,0 +1,41 @@ +package posters.tests.smoke.pageobjects.components; + +import org.junit.Test; + +import com.xceptance.neodymium.module.statement.testdata.DataSet; +import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; + +import io.qameta.allure.Owner; +import io.qameta.allure.Severity; +import io.qameta.allure.SeverityLevel; +import io.qameta.allure.junit4.Tag; +import posters.flows.OpenHomePageFlow; +import posters.tests.AbstractTest; + +@Owner("Tim Brown") +@Severity(SeverityLevel.MINOR) +@Tag("smoke") +@SuppressDataSets +public class HeaderTest extends AbstractTest +{ + @Test + @DataSet(1) + public void testSearching() + { + // go to homepage + var homePage = OpenHomePageFlow.flow(); + homePage.header.validateStructure(); + + // go to category page + var categoryPage = homePage.topNav.clickCategory(headerTestData.getTopCategory()); + categoryPage.header.validateStructure(); + + //go to product detail page, add product to cart + var productDetailPage = categoryPage.clickProductByPosition(headerTestData.getResultPosition()); + productDetailPage.header.validateStructure(); + + // go to cart page + var cartPage = productDetailPage.miniCart.openCartPage(); + cartPage.header.validateStructure(); + } +} \ No newline at end of file diff --git a/src/test/java/posters/tests/testdata/pageobjects/components/HeaderTestData.java b/src/test/java/posters/tests/testdata/pageobjects/components/HeaderTestData.java new file mode 100644 index 00000000..ab591760 --- /dev/null +++ b/src/test/java/posters/tests/testdata/pageobjects/components/HeaderTestData.java @@ -0,0 +1,18 @@ +package posters.tests.testdata.pageobjects.components; + +public class HeaderTestData +{ + private String topCategory; + + private int resultPosition; + + public String getTopCategory() + { + return topCategory; + } + + public int getResultPosition() + { + return resultPosition; + } +} \ No newline at end of file diff --git a/src/test/java/posters/tests/testdata/SearchTestData.java b/src/test/java/posters/tests/testdata/pageobjects/components/SearchTestData.java similarity index 82% rename from src/test/java/posters/tests/testdata/SearchTestData.java rename to src/test/java/posters/tests/testdata/pageobjects/components/SearchTestData.java index f78fbc31..e69c6b37 100644 --- a/src/test/java/posters/tests/testdata/SearchTestData.java +++ b/src/test/java/posters/tests/testdata/pageobjects/components/SearchTestData.java @@ -1,4 +1,4 @@ -package posters.tests.testdata; +package posters.tests.testdata.pageobjects.components; public class SearchTestData { diff --git a/src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json b/src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json new file mode 100644 index 00000000..96008e16 --- /dev/null +++ b/src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json @@ -0,0 +1,6 @@ +[ + { + "topCategory": "header.topNavigation.1.title", + "resultPosition": "1", + } +] diff --git a/src/test/resources/posters/tests/smoke/SearchTest.json b/src/test/resources/posters/tests/smoke/pageobjects/components/SearchTest.json similarity index 59% rename from src/test/resources/posters/tests/smoke/SearchTest.json rename to src/test/resources/posters/tests/smoke/pageobjects/components/SearchTest.json index 05a1fc73..d9e8e9d2 100644 --- a/src/test/resources/posters/tests/smoke/SearchTest.json +++ b/src/test/resources/posters/tests/smoke/pageobjects/components/SearchTest.json @@ -4,7 +4,6 @@ "resultPosition": "1" }, { - "searchTerm": "Foobar", - "resultPosition": "" + "searchTerm": "Foobar" } ] From 9adb5d5096c3d5f75e49f6b69ec273c674137be1 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 31 Jul 2023 16:48:55 +0200 Subject: [PATCH 14/44] implemented PaginationTest --- .../pageobjects/components/Pagination.java | 22 ++++++------- .../pages/browsing/AbstractBrowsingPage.java | 7 +--- .../pages/browsing/CategoryPage.java | 5 ++- src/test/java/posters/tests/AbstractTest.java | 4 +++ .../pageobjects/components/HeaderTest.java | 2 +- .../components/PaginationTest.java | 32 +++++++++++++++++++ .../components/PaginationTestData.java | 18 +++++++++++ .../pageobjects/components/HeaderTest.json | 2 +- .../components/PaginationTest.json | 6 ++++ 9 files changed, 76 insertions(+), 22 deletions(-) create mode 100644 src/test/java/posters/tests/smoke/pageobjects/components/PaginationTest.java create mode 100644 src/test/java/posters/tests/testdata/pageobjects/components/PaginationTestData.java create mode 100644 src/test/resources/posters/tests/smoke/pageobjects/components/PaginationTest.json diff --git a/src/test/java/posters/pageobjects/components/Pagination.java b/src/test/java/posters/pageobjects/components/Pagination.java index 37ffae18..04e73011 100644 --- a/src/test/java/posters/pageobjects/components/Pagination.java +++ b/src/test/java/posters/pageobjects/components/Pagination.java @@ -18,9 +18,9 @@ public class Pagination extends AbstractComponent { - private static SelenideElement pagination = $("#pagination-bottom"); + private SelenideElement pagination = $("#pagination-bottom"); - private static ElementsCollection paginationComponents = $$("#pagination-bottom li"); + private ElementsCollection paginationComponents = $$("#pagination-bottom li"); public void isComponentAvailable() { @@ -30,31 +30,31 @@ public void isComponentAvailable() /// ----- pagination navigation ----- /// @Step("click on specific page number") - public static void goToPage(int pageNumber) + public void goToPage(int pageNumber) { paginationComponents.findBy(exactText(Integer.toString(pageNumber))).shouldBe(visible).click(); } @Step("click on go to next page") - public static void goToNextPage() + public void goToNextPage() { paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToNextPage"))).click(); } @Step("click on go to last page") - public static void goToLastPage() + public void goToLastPage() { paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToLastPage"))).click(); } @Step("click on go to previous page") - public static void goToPrevPage() + public void goToPrevPage() { paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToPrevPage"))).click(); } @Step("click on go to first page") - public static void goToFirstPage() + public void goToFirstPage() { paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToFirstPage"))).click(); } @@ -62,7 +62,7 @@ public static void goToFirstPage() /// ----- validate pagination ----- /// @Step("validate visibility numbers in navigation") - public static void validateElementNumbers(int expectedResultCount) + public void validateElementNumbers(int expectedResultCount) { int numberOfPages = expectedResultCount / 6; for (int i = 1; i < numberOfPages; i++) @@ -72,21 +72,21 @@ public static void validateElementNumbers(int expectedResultCount) } @Step("validate visibility right navigation") - public static void validateRightNavigation() + public void validateRightNavigation() { paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToNextPage"))).shouldBe(visible); paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToLastPage"))).shouldBe(visible); } @Step("validate visibility left navigation") - public static void validateLeftNavigation() + public void validateLeftNavigation() { paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToPrevPage"))).shouldBe(visible); paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToFirstPage"))).shouldBe(visible); } @Step("validate pagination") - public static void validateStructure(int expectedResultCount) + public void validateStructure(int expectedResultCount) { int numberOfPages = expectedResultCount / 6; if (numberOfPages > 1) diff --git a/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java b/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java index c4246b16..5077a595 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java @@ -4,6 +4,7 @@ import posters.pageobjects.components.Footer; import posters.pageobjects.components.Header; import posters.pageobjects.components.MiniCart; +import posters.pageobjects.components.Pagination; import posters.pageobjects.components.Search; import posters.pageobjects.components.SuccessMessage; import posters.pageobjects.components.TopNavigation; @@ -42,10 +43,4 @@ public void validateStructure() successMessage.isComponentAvailable(); errorMessage.isComponentAvailable(); } - - public void validateHeaderAndFooter(AbstractBrowsingPage page) - { - page.header.validateStructure(); - page.footer.validateStructure(); - } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index 10e46b88..47d3c038 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -18,8 +18,8 @@ public class CategoryPage extends AbstractBrowsingPage { - //public Pagination pagination = new Pagination(); - + public Pagination pagination = new Pagination(); + private SelenideElement productOverview = $("#productOverview"); private SelenideElement titleCategoryName = $("#titleCategoryName"); @@ -69,7 +69,6 @@ public void validate(String categoryName, int expectedResultCount) { validateStructure(); validateCategoryHeadline(categoryName, expectedResultCount); - Pagination.validateStructure(expectedResultCount); } /// ----- product by position ----- /// diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index 776beb66..498f2c54 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -11,6 +11,7 @@ import posters.tests.testdata.AddToCartTestData; import posters.tests.testdata.pageobjects.components.HeaderTestData; +import posters.tests.testdata.pageobjects.components.PaginationTestData; import posters.tests.testdata.pageobjects.components.SearchTestData; @RunWith(NeodymiumRunner.class) @@ -22,6 +23,8 @@ public abstract class AbstractTest protected AddToCartTestData addToCartTestData; protected HeaderTestData headerTestData; + + protected PaginationTestData paginationTestData; @Before public void setup() @@ -29,6 +32,7 @@ public void setup() searchTestData = DataUtils.get(SearchTestData.class); addToCartTestData = DataUtils.get(AddToCartTestData.class); headerTestData = DataUtils.get(HeaderTestData.class); + paginationTestData = DataUtils.get(PaginationTestData.class); } protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTest.class); diff --git a/src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java b/src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java index 79ea4be3..b5774584 100644 --- a/src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java +++ b/src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java @@ -20,7 +20,7 @@ public class HeaderTest extends AbstractTest { @Test @DataSet(1) - public void testSearching() + public void testHeader() { // go to homepage var homePage = OpenHomePageFlow.flow(); diff --git a/src/test/java/posters/tests/smoke/pageobjects/components/PaginationTest.java b/src/test/java/posters/tests/smoke/pageobjects/components/PaginationTest.java new file mode 100644 index 00000000..6a5b24d0 --- /dev/null +++ b/src/test/java/posters/tests/smoke/pageobjects/components/PaginationTest.java @@ -0,0 +1,32 @@ +package posters.tests.smoke.pageobjects.components; + +import org.junit.Test; + +import com.xceptance.neodymium.module.statement.testdata.DataSet; +import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; + +import io.qameta.allure.Owner; +import io.qameta.allure.Severity; +import io.qameta.allure.SeverityLevel; +import io.qameta.allure.junit4.Tag; +import posters.flows.OpenHomePageFlow; +import posters.tests.AbstractTest; + +@Owner("Tim Brown") +@Severity(SeverityLevel.MINOR) +@Tag("smoke") +@SuppressDataSets +public class PaginationTest extends AbstractTest +{ + @Test + @DataSet(1) + public void testPagination() + { + // go to homepage + var homePage = OpenHomePageFlow.flow(); + + // go to category page + var categoryPage = homePage.topNav.clickCategory(paginationTestData.getTopCategory()); + categoryPage.pagination.validateStructure(paginationTestData.getExpectedResultCount()); + } +} \ No newline at end of file diff --git a/src/test/java/posters/tests/testdata/pageobjects/components/PaginationTestData.java b/src/test/java/posters/tests/testdata/pageobjects/components/PaginationTestData.java new file mode 100644 index 00000000..e9afaeb3 --- /dev/null +++ b/src/test/java/posters/tests/testdata/pageobjects/components/PaginationTestData.java @@ -0,0 +1,18 @@ +package posters.tests.testdata.pageobjects.components; + +public class PaginationTestData +{ + private String topCategory; + + private int expectedResultCount; + + public String getTopCategory() + { + return topCategory; + } + + public int getExpectedResultCount() + { + return expectedResultCount; + } +} \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json b/src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json index 96008e16..b9dc58b0 100644 --- a/src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json +++ b/src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json @@ -1,6 +1,6 @@ [ { "topCategory": "header.topNavigation.1.title", - "resultPosition": "1", + "resultPosition": "1" } ] diff --git a/src/test/resources/posters/tests/smoke/pageobjects/components/PaginationTest.json b/src/test/resources/posters/tests/smoke/pageobjects/components/PaginationTest.json new file mode 100644 index 00000000..efe0b639 --- /dev/null +++ b/src/test/resources/posters/tests/smoke/pageobjects/components/PaginationTest.json @@ -0,0 +1,6 @@ +[ + { + "topCategory": "header.topNavigation.1.title", + "expectedResultCount": "30" + } +] From 9fec968d2e663c4c890fe45072a64e7996a53588 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Tue, 1 Aug 2023 11:44:50 +0200 Subject: [PATCH 15/44] extended HomePageTest --- config/localization.yaml | 45 ++++++-- .../pageobjects/components/Pagination.java | 18 +-- .../pages/browsing/CategoryPage.java | 2 +- .../pageobjects/pages/browsing/HomePage.java | 105 +++++++++++++----- .../pageobjects/components/SearchTest.java | 1 + .../{ => pageobjects/pages}/HomePageTest.java | 3 +- .../components/SearchTestData.java | 7 ++ .../pageobjects/components/SearchTest.json | 1 + 8 files changed, 129 insertions(+), 53 deletions(-) rename src/test/java/posters/tests/smoke/{ => pageobjects/pages}/HomePageTest.java (94%) diff --git a/config/localization.yaml b/config/localization.yaml index a38dd0a2..6d1a529e 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -37,25 +37,45 @@ default: sale: first: "25% off (Almost) Everything! Use Code: Posters Sale" second: "Our biggest sale yet 50% off all Posters" - pagination: - goToNextPage: ">" - goToLastPage: ">>" - goToPrevPage: "<" - goToFirstPage: "<<" footer: text: Copyright (c) 2013-2020 Xceptance Software Technologies GmbH -- This software is for demo purposes only and not meant to be used in production. - search: - result: - text: "Your results for your search: " HomePage: title: Posters - The Ultimate Online Shop + slider: + headline: + "1": NORTH BOSTON + "2": BOSTON SUNSET + "3": BRYCE NATIONAL PARK, UTAH I + "4": BRYCE NATIONAL PARK, UTAH II + button: BUY + intro: Began with a simple idea "SHATATATATA!" - M. Scott + hotProducts: HOT PRODUCTS + featuredContent: + "1": "BLUE MORPHO BUTTERFLY" + "2": "SNOWDROP ANEMONE" + "3": "INDIAN SUMMER: RED BEECHES" + "4": "FINGER FOOD" + "5": "STUFFED TURKEY" + "6": "FRUIT TART WITH COCOA" + "7": "SWISS AIR AIRBUS A320" + "8": "IFA F8" + "9": "GERMAN STEAM LOCOMOTIVE" + "10": "GROCHWITZ CASTLE, GERMANY" + "11": "NEW YEAR'S FIREWORKS III" + "12": "LINNAEAN GARDEN AND MUSEUM, SWEDEN" + shopAllProducts: Shop All Products validation: successfulOrder: Thank you for shopping with us! successfulLogin: Login successful. Have fun in our shop! successfulAccountDeletion: Your account has been deleted. We hope to see you soon again! - CartPage: - title: Cart - errorMessage: Your cart is empty. Continue shopping. + CategoryPage: + search: + resultText: "Your results for your search: " + pagination: + goToNextPage: ">" + goToLastPage: ">>" + goToPrevPage: "<" + goToFirstPage: "<<" NoHitsPage: validation: noProductsFound: × Sorry! No results found matching your search. Please try again. @@ -70,6 +90,9 @@ default: gloss: gloss print: "Print information:" addToCartButton: Add to cart + CartPage: + title: Cart + errorMessage: Your cart is empty. Continue shopping. AccountPages: email: Email address* firstname: First name* diff --git a/src/test/java/posters/pageobjects/components/Pagination.java b/src/test/java/posters/pageobjects/components/Pagination.java index 04e73011..6ade049d 100644 --- a/src/test/java/posters/pageobjects/components/Pagination.java +++ b/src/test/java/posters/pageobjects/components/Pagination.java @@ -32,31 +32,31 @@ public void isComponentAvailable() @Step("click on specific page number") public void goToPage(int pageNumber) { - paginationComponents.findBy(exactText(Integer.toString(pageNumber))).shouldBe(visible).click(); + paginationComponents.findBy(exactText(Integer.toString(pageNumber))).click(); } @Step("click on go to next page") public void goToNextPage() { - paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToNextPage"))).click(); + paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToNextPage"))).click(); } @Step("click on go to last page") public void goToLastPage() { - paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToLastPage"))).click(); + paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToLastPage"))).click(); } @Step("click on go to previous page") public void goToPrevPage() { - paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToPrevPage"))).click(); + paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToPrevPage"))).click(); } @Step("click on go to first page") public void goToFirstPage() { - paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToFirstPage"))).click(); + paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToFirstPage"))).click(); } /// ----- validate pagination ----- /// @@ -74,15 +74,15 @@ public void validateElementNumbers(int expectedResultCount) @Step("validate visibility right navigation") public void validateRightNavigation() { - paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToNextPage"))).shouldBe(visible); - paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToLastPage"))).shouldBe(visible); + paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToNextPage"))).shouldBe(visible); + paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToLastPage"))).shouldBe(visible); } @Step("validate visibility left navigation") public void validateLeftNavigation() { - paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToPrevPage"))).shouldBe(visible); - paginationComponents.findBy(exactText(Neodymium.localizedText("pagination.goToFirstPage"))).shouldBe(visible); + paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToPrevPage"))).shouldBe(visible); + paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToFirstPage"))).shouldBe(visible); } @Step("validate pagination") diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index 47d3c038..575a141c 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -58,7 +58,7 @@ public void validateCategoryHeadline(String categoryName, int expectedResultCoun } else { - $("#titleSearchText").should(matchText(Neodymium.localizedText("search.result.text"))).shouldBe(visible); + $("#titleSearchText").should(matchText(Neodymium.localizedText("CategoryPage.search.resultText"))).shouldBe(visible); $("#searchTextValue").should(exactText(categoryName)).shouldBe(visible); $("#totalProductCount").should(exactText(Integer.toString(expectedResultCount))).shouldBe(visible); } diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index dd0350c5..4ada8c1a 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -8,13 +8,27 @@ import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; +import com.codeborne.selenide.ElementsCollection; +import com.codeborne.selenide.Selenide; +import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; +import posters.dataobjects.Product; import posters.dataobjects.User; public class HomePage extends AbstractBrowsingPage { + private ElementsCollection slideNavigation = $$(".flex-control-nav li"); + + private ElementsCollection slideHeadline = $$("#titleSlide h1"); + + private ElementsCollection slideButton = $$("#titleSlide .btn-primary"); + + private ElementsCollection featuredCategories = $$(".pName"); + + private ElementsCollection featuredContent = $$("#productList h2"); + @Override @Step("ensure this is a home page") public HomePage isExpectedPage() @@ -24,38 +38,76 @@ public HomePage isExpectedPage() return this; } + @Step("validate poster slide") + public void validatePosterSlide() + { + validatePosterSlide("4", "HomePage.slider.headline.4"); + validatePosterSlide("3", "HomePage.slider.headline.3"); + validatePosterSlide("2", "HomePage.slider.headline.2"); + validatePosterSlide("1", "HomePage.slider.headline.1"); + } + + @Step("validate slider headline") + public void validatePosterSlide(String position, String headline) + { + slideNavigation.findBy(exactText(position)).click(); + slideHeadline.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + slideButton.findBy(exactText(Neodymium.localizedText("HomePage.slider.button"))).shouldBe(visible); + } + + @Step("validate featured categories") + public void validateFeaturedCategories() + { + $$(".featured-img").shouldHaveSize(4); + featuredCategories.findBy(exactText(Neodymium.localizedText("header.topNavigation.1.title"))).shouldBe(visible); + featuredCategories.findBy(exactText(Neodymium.localizedText("header.topNavigation.2.title"))).shouldBe(visible); + featuredCategories.findBy(exactText(Neodymium.localizedText("header.topNavigation.3.title"))).shouldBe(visible); + featuredCategories.findBy(exactText(Neodymium.localizedText("header.topNavigation.4.title"))).shouldBe(visible); + } + + @Step("validate featured content") + public void validateFeaturedContent() + { + $$(".colorlib-product .container .row h2").findBy(exactText(Neodymium.localizedText("HomePage.hotProducts"))).shouldBe(visible); + $$(".prod-img").shouldHaveSize(12); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.1"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.2"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.3"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.4"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.5"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.6"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.7"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.8"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.9"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.10"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.11"))).shouldBe(visible); + featuredContent.findBy(exactText(Neodymium.localizedText("HomePage.featuredContent.12"))).shouldBe(visible); + } + @Override @Step("validate structure home page") public void validateStructure() { super.validateStructure(); - // Verifies the company Logo and name are visible. - $("#colorlib-logo").shouldBe(visible); - - // Verifies the Navigation bar is visible - $("#categoryMenu .navi").shouldBe(visible); - // Asserts there's categories in the nav bar. - $$("#categoryMenu .has-dropdown").shouldHave(sizeGreaterThan(0)); - - // Asserts the first headline is there. - // $("#titleIndex").shouldBe(matchText("[A-Z].{3,}")); + // validate poster slide + validatePosterSlide(); - // Asserts the animated poster rotation is there. - $(".flex-control-nav").shouldBe(visible); - - // Verifies the 'Intro Quote' section is there. - $(".colorlib-intro .container h2").shouldBe(matchText("[A-Z].{3,}")); + // validate intro + $("#intro").shouldHave(exactText(Neodymium.localizedText("HomePage.intro"))).shouldBe(visible); - // Verifies the "Hot products" section is there. - $(".colorlib-product .colorlib-heading h2").shouldBe(matchText("[A-Z].{3,}")); + // validate featured categories + validateFeaturedCategories(); - // Asserts there's a list of items under "Hot Products". - $(".colorlib-product #productList").shouldBe(visible); - // Asserts there's at least 1 item in the list. - $$(".container .row-pb-md .product-entry").shouldHave(sizeGreaterThan(0)); + // validate featured content + validateFeaturedContent(); + + // validate shop all products button + $("a.btn-primary-shop").shouldHave(exactText(Neodymium.localizedText("HomePage.shopAllProducts"))).shouldBe(visible); } - + + // -------------------------------------------------- + @Step("validate successful order on home page") public void validateSuccessfulOrder() { @@ -65,10 +117,6 @@ public void validateSuccessfulOrder() miniCart.validateSubtotal("$0.00"); } - /** - * @param firstName - * The name should be shown in the mini User Menu - */ @Step("validate successful login on home page") public void validateSuccessfulLogin(String firstName) { @@ -78,10 +126,7 @@ public void validateSuccessfulLogin(String firstName) userMenu.validateLoggedInName(firstName); } - - /** - * @param user - */ + @Step("validate successful user login on home page") public void validateSuccessfulLogin(User user) { diff --git a/src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java b/src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java index 6091250e..2a3fb17f 100644 --- a/src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java +++ b/src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java @@ -27,6 +27,7 @@ public void testSearching() // go to category page var categoryPage = homePage.search.categoryPageResult(searchTestData.getSearchTerm()); + categoryPage.validate(searchTestData.getSearchTerm(), searchTestData.getExpectedResultCount()); //go to product detail page final String productName = categoryPage.getProductNameByPosition(searchTestData.getResultPosition()); diff --git a/src/test/java/posters/tests/smoke/HomePageTest.java b/src/test/java/posters/tests/smoke/pageobjects/pages/HomePageTest.java similarity index 94% rename from src/test/java/posters/tests/smoke/HomePageTest.java rename to src/test/java/posters/tests/smoke/pageobjects/pages/HomePageTest.java index 013e8efb..36e91b7a 100644 --- a/src/test/java/posters/tests/smoke/HomePageTest.java +++ b/src/test/java/posters/tests/smoke/pageobjects/pages/HomePageTest.java @@ -1,4 +1,4 @@ -package posters.tests.smoke; +package posters.tests.smoke.pageobjects.pages; import org.junit.Test; @@ -34,6 +34,5 @@ public void testVisitingHomepage() var homePage = OpenHomePageFlow.flow(); homePage.title.validateTitle(Neodymium.localizedText("HomePage.title")); homePage.validateStructure(); - homePage.validateHeaderAndFooter(homePage); } } diff --git a/src/test/java/posters/tests/testdata/pageobjects/components/SearchTestData.java b/src/test/java/posters/tests/testdata/pageobjects/components/SearchTestData.java index e69c6b37..f5fb42f5 100644 --- a/src/test/java/posters/tests/testdata/pageobjects/components/SearchTestData.java +++ b/src/test/java/posters/tests/testdata/pageobjects/components/SearchTestData.java @@ -3,6 +3,8 @@ public class SearchTestData { private String searchTerm; + + private int expectedResultCount; private int resultPosition; @@ -11,6 +13,11 @@ public String getSearchTerm() return searchTerm; } + public int getExpectedResultCount() + { + return expectedResultCount; + } + public int getResultPosition() { return resultPosition; diff --git a/src/test/resources/posters/tests/smoke/pageobjects/components/SearchTest.json b/src/test/resources/posters/tests/smoke/pageobjects/components/SearchTest.json index d9e8e9d2..d521d2bd 100644 --- a/src/test/resources/posters/tests/smoke/pageobjects/components/SearchTest.json +++ b/src/test/resources/posters/tests/smoke/pageobjects/components/SearchTest.json @@ -1,6 +1,7 @@ [ { "searchTerm": "bear", + "expectedResultCount": "3", "resultPosition": "1" }, { From 19aecac26c0845c53aba84720da13bd8f5844b39 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Tue, 1 Aug 2023 15:25:46 +0200 Subject: [PATCH 16/44] complex test data for BrowseTest --- config/localization.yaml | 2 +- .../components/AbstractComponent.java | 2 - .../pageobjects/components/Footer.java | 13 ++- .../pageobjects/components/TopNavigation.java | 2 - .../pages/browsing/AbstractBrowsingPage.java | 1 - .../pageobjects/pages/browsing/HomePage.java | 5 -- .../pages/browsing/ProductDetailPage.java | 5 +- .../pageobjects/pages/checkout/CartPage.java | 2 - src/test/java/posters/tests/AbstractTest.java | 16 ++-- .../smoke/BrowseRandomVisualAssertTest.java | 3 - .../java/posters/tests/smoke/BrowseTest.java | 54 ------------ .../smoke/{ => processes}/AddToCartTest.java | 4 +- .../tests/smoke/processes/BrowseTest.java | 63 +++++++++++++ .../{ => processes}/AddToCartTestData.java | 2 +- .../testdata/processes/BrowseTestData.java | 88 +++++++++++++++++++ .../smoke/{ => processes}/AddToCartTest.json | 0 .../tests/smoke/processes/BrowseTest.json | 16 ++++ 17 files changed, 190 insertions(+), 88 deletions(-) delete mode 100644 src/test/java/posters/tests/smoke/BrowseTest.java rename src/test/java/posters/tests/smoke/{ => processes}/AddToCartTest.java (98%) create mode 100644 src/test/java/posters/tests/smoke/processes/BrowseTest.java rename src/test/java/posters/tests/testdata/{ => processes}/AddToCartTestData.java (97%) create mode 100644 src/test/java/posters/tests/testdata/processes/BrowseTestData.java rename src/test/resources/posters/tests/smoke/{ => processes}/AddToCartTest.json (100%) create mode 100644 src/test/resources/posters/tests/smoke/processes/BrowseTest.json diff --git a/config/localization.yaml b/config/localization.yaml index 6d1a529e..1e17530a 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -38,7 +38,7 @@ default: first: "25% off (Almost) Everything! Use Code: Posters Sale" second: "Our biggest sale yet 50% off all Posters" footer: - text: Copyright (c) 2013-2020 Xceptance Software Technologies GmbH -- This software is for demo purposes only and not meant to be used in production. + copyright: Copyright (c) 2013-2020 Xceptance Software Technologies GmbH -- This software is for demo purposes only and not meant to be used in production. HomePage: title: Posters - The Ultimate Online Shop slider: diff --git a/src/test/java/posters/pageobjects/components/AbstractComponent.java b/src/test/java/posters/pageobjects/components/AbstractComponent.java index 7df941a2..4dfcf8a0 100644 --- a/src/test/java/posters/pageobjects/components/AbstractComponent.java +++ b/src/test/java/posters/pageobjects/components/AbstractComponent.java @@ -1,7 +1,5 @@ package posters.pageobjects.components; -import com.codeborne.selenide.SelenideElement; - public abstract class AbstractComponent { abstract public void isComponentAvailable(); diff --git a/src/test/java/posters/pageobjects/components/Footer.java b/src/test/java/posters/pageobjects/components/Footer.java index 053dba6c..7c0fba14 100644 --- a/src/test/java/posters/pageobjects/components/Footer.java +++ b/src/test/java/posters/pageobjects/components/Footer.java @@ -2,6 +2,7 @@ import static com.codeborne.selenide.Condition.text; import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import com.codeborne.selenide.SelenideElement; @@ -21,9 +22,13 @@ public void isComponentAvailable() @Step("validate the footer") public void validateStructure() { - isComponentAvailable(); - // Asserts the footer contains the correct text. - footer.shouldHave(text(Neodymium.localizedText("footer.text"))); - + // validate about xceptance + $("#footer .icon-twitter").shouldBe(visible); + $("#footer .icon-facebook").shouldBe(visible); + $("#footer .icon-linkedin").shouldBe(visible); + $("#footer .icon-dribbble").shouldBe(visible); + + // validate copyright text + footer.shouldHave(text(Neodymium.localizedText("footer.copyright"))); } } diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index 3df3b21d..f9985f81 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -2,7 +2,6 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; @@ -11,7 +10,6 @@ import org.openqa.selenium.By; -import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; diff --git a/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java b/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java index 5077a595..1a4ddfe0 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java @@ -4,7 +4,6 @@ import posters.pageobjects.components.Footer; import posters.pageobjects.components.Header; import posters.pageobjects.components.MiniCart; -import posters.pageobjects.components.Pagination; import posters.pageobjects.components.Search; import posters.pageobjects.components.SuccessMessage; import posters.pageobjects.components.TopNavigation; diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index 4ada8c1a..021d03fb 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -1,20 +1,15 @@ package posters.pageobjects.pages.browsing; -import static com.codeborne.selenide.CollectionCondition.sizeGreaterThan; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.Selenide; -import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.Product; import posters.dataobjects.User; public class HomePage extends AbstractBrowsingPage diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index 88de6496..c95dfb94 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -3,19 +3,16 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; -import static com.codeborne.selenide.CollectionCondition.sizeGreaterThan; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; -import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; import posters.dataobjects.Product; -// review: "Product Description:", "Select size:", "Select style:" only selectable with style class public class ProductDetailPage extends AbstractBrowsingPage { private SelenideElement addToCartButton = $("#btnAddToCart"); @@ -81,7 +78,7 @@ public void validateStructure() productName.shouldHave(matchText("[A-Z].{3,}")).shouldBe(visible); // validate product price - productPrice.shouldHave(matchText("\\$\\d{2}\\.\\d{2}")).shouldBe(visible); + productPrice.shouldHave(matchText("\\$\\d+\\.\\d{2}")).shouldBe(visible); // validate product description $("#prodDescriptionOverview").shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 119c3580..05e23516 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -2,8 +2,6 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exactValue; -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.hidden; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.text; import static com.codeborne.selenide.Condition.value; diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index 498f2c54..32cba178 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -9,7 +9,8 @@ import com.xceptance.neodymium.module.statement.browser.multibrowser.Browser; import com.xceptance.neodymium.util.DataUtils; -import posters.tests.testdata.AddToCartTestData; +import posters.tests.testdata.processes.AddToCartTestData; +import posters.tests.testdata.processes.BrowseTestData; import posters.tests.testdata.pageobjects.components.HeaderTestData; import posters.tests.testdata.pageobjects.components.PaginationTestData; import posters.tests.testdata.pageobjects.components.SearchTestData; @@ -18,21 +19,24 @@ @Browser("Chrome_1024x768") public abstract class AbstractTest { + protected HeaderTestData headerTestData; + + protected PaginationTestData paginationTestData; + protected SearchTestData searchTestData; protected AddToCartTestData addToCartTestData; - protected HeaderTestData headerTestData; - - protected PaginationTestData paginationTestData; + protected BrowseTestData browseTestData; @Before public void setup() { - searchTestData = DataUtils.get(SearchTestData.class); - addToCartTestData = DataUtils.get(AddToCartTestData.class); headerTestData = DataUtils.get(HeaderTestData.class); paginationTestData = DataUtils.get(PaginationTestData.class); + searchTestData = DataUtils.get(SearchTestData.class); + addToCartTestData = DataUtils.get(AddToCartTestData.class); + browseTestData = DataUtils.get(BrowseTestData.class); } protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTest.class); diff --git a/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java b/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java index 8ac9a099..51ac46ad 100644 --- a/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java +++ b/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java @@ -18,9 +18,6 @@ import posters.pageobjects.pages.browsing.ProductDetailPage; import posters.tests.AbstractTest; -/** - * @author schaefer - */ @Owner("Tim Brown") @Severity(SeverityLevel.NORMAL) @Tag("smoke") diff --git a/src/test/java/posters/tests/smoke/BrowseTest.java b/src/test/java/posters/tests/smoke/BrowseTest.java deleted file mode 100644 index c59540c9..00000000 --- a/src/test/java/posters/tests/smoke/BrowseTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package posters.tests.smoke; - -import org.junit.Test; - -import io.qameta.allure.Owner; -import io.qameta.allure.Severity; -import io.qameta.allure.SeverityLevel; -import io.qameta.allure.junit4.Tag; -import posters.flows.OpenHomePageFlow; -import posters.tests.AbstractTest; - -@Owner("Tim Brown") -@Severity(SeverityLevel.NORMAL) -@Tag("smoke") -public class BrowseTest extends AbstractTest -{ - @Test - public void testBrowsing() - { - // Go to homepage - var homePage = OpenHomePageFlow.flow(); - homePage.validateStructure(); - - // Go to category - final String categoryName = homePage.topNav.getSubCategoryNameByPosition(1, 1); - var categoryPage = homePage.topNav.clickSubCategoryByPosition(1, 1); - categoryPage.validate(categoryName); - - // Go to product page - final String productName = categoryPage.getProductNameByPosition(1, 1); - var productDetailPage = categoryPage.clickProductByPosition(1, 1); - productDetailPage.validate(productName); - - // Go to category - final String categoryName2 = productDetailPage.topNav.getSubCategoryNameByPosition(2, 2); - categoryPage = productDetailPage.topNav.clickSubCategoryByPosition(2, 2); - categoryPage.validate(categoryName2); - - // Go to product page - final String productName2 = categoryPage.getProductNameByPosition(2, 2); - productDetailPage = categoryPage.clickProductByPosition(2, 2); - productDetailPage.validate(productName2); - - // Go to category - final String categoryName3 = productDetailPage.topNav.getSubCategoryNameByPosition(2, 3); - categoryPage = productDetailPage.topNav.clickSubCategoryByPosition(2, 3); - categoryPage.validate(categoryName3); - - // Go to product page - final String productName3 = categoryPage.getProductNameByPosition(2, 3); - productDetailPage = categoryPage.clickProductByPosition(2, 3); - productDetailPage.validate(productName3); - } -} diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/processes/AddToCartTest.java similarity index 98% rename from src/test/java/posters/tests/smoke/AddToCartTest.java rename to src/test/java/posters/tests/smoke/processes/AddToCartTest.java index f5647fa5..a25aad56 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/processes/AddToCartTest.java @@ -1,9 +1,8 @@ -package posters.tests.smoke; +package posters.tests.smoke.processes; import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; -import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; @@ -12,7 +11,6 @@ import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; -import posters.tests.testdata.AddToCartTestData; @Owner("Joe Fix") @Severity(SeverityLevel.CRITICAL) diff --git a/src/test/java/posters/tests/smoke/processes/BrowseTest.java b/src/test/java/posters/tests/smoke/processes/BrowseTest.java new file mode 100644 index 00000000..643b7214 --- /dev/null +++ b/src/test/java/posters/tests/smoke/processes/BrowseTest.java @@ -0,0 +1,63 @@ +package posters.tests.smoke.processes; + +import org.junit.Test; + +import com.xceptance.neodymium.module.statement.testdata.DataSet; + +import io.qameta.allure.Owner; +import io.qameta.allure.Severity; +import io.qameta.allure.SeverityLevel; +import io.qameta.allure.junit4.Tag; +import posters.flows.OpenHomePageFlow; +import posters.tests.AbstractTest; + +@Owner("Tim Brown") +@Severity(SeverityLevel.NORMAL) +@Tag("smoke") +public class BrowseTest extends AbstractTest +{ + @Test + @DataSet(1) + public void testBrowsing() + { + // go to homepage + var homePage = OpenHomePageFlow.flow(); + homePage.validateStructure(); + + // go to category page and validate + var categoryPage = homePage.topNav.clickCategory(browseTestData.getTopCategory1()); + categoryPage.validate(browseTestData.getTopCategory1(), browseTestData.getExpectedResultCount1()); + + // go to product page and validate + final String productName = categoryPage.getProductNameByPosition(browseTestData.getResultPosition1()); + var productDetailPage = categoryPage.clickProductByPosition(browseTestData.getResultPosition1()); + productDetailPage.validate(productName); + + // go to category page and validate + categoryPage = productDetailPage.topNav.clickCategory(browseTestData.getTopCategory2()); + categoryPage.validate(browseTestData.getTopCategory2(), browseTestData.getExpectedResultCount2()); + + // go to product page and validate + final String productName2 = categoryPage.getProductNameByPosition(browseTestData.getResultPosition2()); + productDetailPage = categoryPage.clickProductByPosition(browseTestData.getResultPosition2()); + productDetailPage.validate(productName2); + + // go to category page and validate + categoryPage = productDetailPage.topNav.clickCategory(browseTestData.getTopCategory3()); + categoryPage.validate(browseTestData.getTopCategory3(), browseTestData.getExpectedResultCount3()); + + // go to product page and validate + final String productName3 = categoryPage.getProductNameByPosition(browseTestData.getResultPosition3()); + productDetailPage = categoryPage.clickProductByPosition(browseTestData.getResultPosition3()); + productDetailPage.validate(productName3); + + // go to category page and validate + categoryPage = productDetailPage.topNav.clickCategory(browseTestData.getTopCategory4()); + categoryPage.validate(browseTestData.getTopCategory4(), browseTestData.getExpectedResultCount4()); + + // go to product page and validate + final String productName4 = categoryPage.getProductNameByPosition(browseTestData.getResultPosition4()); + productDetailPage = categoryPage.clickProductByPosition(browseTestData.getResultPosition4()); + productDetailPage.validate(productName4); + } +} \ No newline at end of file diff --git a/src/test/java/posters/tests/testdata/AddToCartTestData.java b/src/test/java/posters/tests/testdata/processes/AddToCartTestData.java similarity index 97% rename from src/test/java/posters/tests/testdata/AddToCartTestData.java rename to src/test/java/posters/tests/testdata/processes/AddToCartTestData.java index 4161af28..8f86d23d 100644 --- a/src/test/java/posters/tests/testdata/AddToCartTestData.java +++ b/src/test/java/posters/tests/testdata/processes/AddToCartTestData.java @@ -1,4 +1,4 @@ -package posters.tests.testdata; +package posters.tests.testdata.processes; public class AddToCartTestData { diff --git a/src/test/java/posters/tests/testdata/processes/BrowseTestData.java b/src/test/java/posters/tests/testdata/processes/BrowseTestData.java new file mode 100644 index 00000000..3f85ad5b --- /dev/null +++ b/src/test/java/posters/tests/testdata/processes/BrowseTestData.java @@ -0,0 +1,88 @@ +package posters.tests.testdata.processes; + +public class BrowseTestData +{ + private String topCategory1; + + private int expectedResultCount1; + + private int resultPosition1; + + private String topCategory2; + + private int expectedResultCount2; + + private int resultPosition2; + + private String topCategory3; + + private int expectedResultCount3; + + private int resultPosition3; + + private String topCategory4; + + private int expectedResultCount4; + + private int resultPosition4; + + public String getTopCategory1() + { + return topCategory1; + } + + public int getExpectedResultCount1() + { + return expectedResultCount1; + } + + public int getResultPosition1() + { + return resultPosition1; + } + + public String getTopCategory2() + { + return topCategory2; + } + + public int getExpectedResultCount2() + { + return expectedResultCount2; + } + + public int getResultPosition2() + { + return resultPosition2; + } + + public String getTopCategory3() + { + return topCategory3; + } + + public int getExpectedResultCount3() + { + return expectedResultCount3; + } + + public int getResultPosition3() + { + return resultPosition3; + } + + public String getTopCategory4() + { + return topCategory4; + } + + public int getExpectedResultCount4() + { + return expectedResultCount4; + } + + public int getResultPosition4() + { + return resultPosition4; + } +} \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/AddToCartTest.json b/src/test/resources/posters/tests/smoke/processes/AddToCartTest.json similarity index 100% rename from src/test/resources/posters/tests/smoke/AddToCartTest.json rename to src/test/resources/posters/tests/smoke/processes/AddToCartTest.json diff --git a/src/test/resources/posters/tests/smoke/processes/BrowseTest.json b/src/test/resources/posters/tests/smoke/processes/BrowseTest.json new file mode 100644 index 00000000..150691e1 --- /dev/null +++ b/src/test/resources/posters/tests/smoke/processes/BrowseTest.json @@ -0,0 +1,16 @@ +[ + { + "topCategory1": "header.topNavigation.1.title", + "expectedResultCount1": "30", + "resultPosition1": "4", + "topCategory2": "header.topNavigation.2.title", + "expectedResultCount2": "30", + "resultPosition2": "3", + "topCategory3": "header.topNavigation.3.title", + "expectedResultCount3": "30", + "resultPosition3": "2", + "topCategory4": "header.topNavigation.4.title", + "expectedResultCount4": "34", + "resultPosition4": "1" + } +] From eb0c2f6398b4ded5d06c672268b5b409b5d06776 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Wed, 2 Aug 2023 14:17:22 +0200 Subject: [PATCH 17/44] extended validation for ShippingAddressPage, BillingAddressPage --- config/localization.yaml | 41 ++++- .../java/posters/dataobjects/Address.java | 45 ----- .../java/posters/dataobjects/CreditCard.java | 3 - src/test/java/posters/dataobjects/User.java | 3 - .../java/posters/flows/CartCleanUpFlow.java | 3 - .../java/posters/flows/DeleteUserFlow.java | 3 - .../pageobjects/components/UserMenu.java | 73 ++++----- .../pages/browsing/CategoryPage.java | 2 +- .../pages/checkout/AbstractCheckoutPage.java | 3 - .../pages/checkout/BillingAddressPage.java | 128 +++++++++++++-- .../pageobjects/pages/checkout/CartPage.java | 17 +- .../checkout/NewShippingAddressPage.java | 3 - .../pages/checkout/PaymentPage.java | 3 - .../pages/checkout/ShippingAddressPage.java | 155 +++++++++++++----- src/test/java/posters/tests/AbstractTest.java | 4 + .../smoke/{processes => }/AddToCartTest.java | 2 +- .../smoke/BrowseRandomVisualAssertTest.java | 4 +- .../smoke/{processes => }/BrowseTest.java | 2 +- .../posters/tests/smoke/GuestOrderTest.java | 81 ++++----- .../components => }/HeaderTest.java | 2 +- .../{pageobjects/pages => }/HomePageTest.java | 2 +- .../components => }/PaginationTest.java | 2 +- .../tests/smoke/RegisteredOrderTest.java | 7 +- .../components => }/SearchTest.java | 2 +- .../processes/GuestOrderTestData.java | 32 ++++ .../smoke/{processes => }/AddToCartTest.json | 0 .../smoke/{processes => }/BrowseTest.json | 0 .../posters/tests/smoke/GuestOrderTest.json | 29 ++-- .../components => }/HeaderTest.json | 0 .../components => }/PaginationTest.json | 0 .../components => }/SearchTest.json | 0 31 files changed, 408 insertions(+), 243 deletions(-) rename src/test/java/posters/tests/smoke/{processes => }/AddToCartTest.java (99%) rename src/test/java/posters/tests/smoke/{processes => }/BrowseTest.java (98%) rename src/test/java/posters/tests/smoke/{pageobjects/components => }/HeaderTest.java (95%) rename src/test/java/posters/tests/smoke/{pageobjects/pages => }/HomePageTest.java (96%) rename src/test/java/posters/tests/smoke/{pageobjects/components => }/PaginationTest.java (94%) rename src/test/java/posters/tests/smoke/{pageobjects/components => }/SearchTest.java (96%) create mode 100644 src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java rename src/test/resources/posters/tests/smoke/{processes => }/AddToCartTest.json (100%) rename src/test/resources/posters/tests/smoke/{processes => }/BrowseTest.json (100%) rename src/test/resources/posters/tests/smoke/{pageobjects/components => }/HeaderTest.json (100%) rename src/test/resources/posters/tests/smoke/{pageobjects/components => }/PaginationTest.json (100%) rename src/test/resources/posters/tests/smoke/{pageobjects/components => }/SearchTest.json (100%) diff --git a/config/localization.yaml b/config/localization.yaml index 1e17530a..c46cdb75 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -93,6 +93,12 @@ default: CartPage: title: Cart errorMessage: Your cart is empty. Continue shopping. + ShippingAddressPage: + fillIn: + headline: Enter a shipping address + BillingAddressPage: + fillIn: + headline: Enter a billing address AccountPages: email: Email address* firstname: First name* @@ -112,12 +118,35 @@ default: General: addresses: fullname: Full name* - company: Company - address: Address* - city: City* - state: State/Province* - zip: ZIP/Postal code* - country: Country* + breadcrumb: + cart: CART/ + shippingAddress: SHIPPING ADDRESS / + billingAddress: BILLING ADDRESS / + payment: PAYMENT / + placeOrder: PLACE ORDER / + fillIn: + headlines: + fullName: FULL NAME* + company: COMPANY + address: ADDRESS* + city: CITY* + state: STATE/PROVINCE* + zip: ZIP/POSTAL CODE* + country: COUNTRY* + useAddressForBilling: "Use this address for billing?*" + requiredFields: "* Required fields" + placeholder: + yourName: Your Name + companyName: company name + address: "Street address, Apartment, etc." + zip: "Zip / Postal" + dropdown: + usa: United States + germany: Germany + radio: + "yes": "YES" + "no": "NO" + button: Continue payment: cardnumber: Card number* cardholdername: Cardholder's name* diff --git a/src/test/java/posters/dataobjects/Address.java b/src/test/java/posters/dataobjects/Address.java index 5efa5408..13905622 100644 --- a/src/test/java/posters/dataobjects/Address.java +++ b/src/test/java/posters/dataobjects/Address.java @@ -1,8 +1,5 @@ package posters.dataobjects; -/** - * @author pfotenhauer - */ public class Address { String firstName; @@ -21,24 +18,6 @@ public class Address String country; - /** - * @param firstName - * the firstName to set - * @param lastName - * the lastName to set - * @param company - * the company to set - * @param street - * the street to set - * @param city - * the city to set - * @param state - * the state to set - * @param zip - * the zip to set - * @param country - * the country to set - */ public Address(String firstName, String lastName, String company, String street, String city, String state, String zip, String country) { this.firstName = firstName; @@ -51,65 +30,41 @@ public Address(String firstName, String lastName, String company, String street, this.country = country; } - /** - * @return the firstName - */ public String getFirstName() { return firstName; } - /** - * @return the lastName - */ public String getLastName() { return lastName; } - /** - * @return the company - */ public String getCompany() { return company; } - /** - * @return the street - */ public String getStreet() { return street; } - /** - * @return the city - */ public String getCity() { return city; } - /** - * @return the state - */ public String getState() { return state; } - /** - * @return the zip - */ public String getZip() { return zip; } - /** - * @return the country - */ public String getCountry() { return country; diff --git a/src/test/java/posters/dataobjects/CreditCard.java b/src/test/java/posters/dataobjects/CreditCard.java index b710ea87..2594bb17 100644 --- a/src/test/java/posters/dataobjects/CreditCard.java +++ b/src/test/java/posters/dataobjects/CreditCard.java @@ -1,8 +1,5 @@ package posters.dataobjects; -/** - * @author pfotenhauer - */ public class CreditCard { String fullName; diff --git a/src/test/java/posters/dataobjects/User.java b/src/test/java/posters/dataobjects/User.java index fb906754..b5e5c44a 100644 --- a/src/test/java/posters/dataobjects/User.java +++ b/src/test/java/posters/dataobjects/User.java @@ -1,8 +1,5 @@ package posters.dataobjects; -/** - * @author pfotenhauer - */ public class User { String firstName; diff --git a/src/test/java/posters/flows/CartCleanUpFlow.java b/src/test/java/posters/flows/CartCleanUpFlow.java index ba63f7ee..3e0972a6 100644 --- a/src/test/java/posters/flows/CartCleanUpFlow.java +++ b/src/test/java/posters/flows/CartCleanUpFlow.java @@ -5,9 +5,6 @@ import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.HomePage; -/** - * @author pfotenhauer - */ public class CartCleanUpFlow { @Step("cart clean up flow") diff --git a/src/test/java/posters/flows/DeleteUserFlow.java b/src/test/java/posters/flows/DeleteUserFlow.java index d8692e7e..846efef0 100644 --- a/src/test/java/posters/flows/DeleteUserFlow.java +++ b/src/test/java/posters/flows/DeleteUserFlow.java @@ -5,9 +5,6 @@ import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.user.LoginPage; -/** - * @author pfotenhauer - */ public class DeleteUserFlow { /** diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index 740125c7..81d6c120 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -30,13 +30,37 @@ public void isComponentAvailable() { showUserMenu.should(exist); } + + /// ----- user menu navigation ----- /// + + @Step("open user menu") + public void openUserMenu() + { + showUserMenu.scrollTo().click(); + userMenu.waitUntil(visible, Neodymium.configuration().selenideTimeout()); + } + @Step("close user menu") + public void closeUserMenu() + { + $("#brand").hover(); + userMenu.waitUntil(not(visible), Neodymium.configuration().selenideTimeout()); + } + + /// ----- validate user menu ----- /// + @Step("validate logged in user menu") public static void validateStructure() { // TODO - verify for logged on user } + @Step("validate strings in user menu") + private static void validateGuestUserMenu(String text) + { + $$("#userMenu li").findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); + } + @Step("validate guest user menu") public static void validateGuestUserMenu() { @@ -56,38 +80,23 @@ public static void validateGuestUserMenu() // close user window $("#globalNavigation").hover(); } + + @Step("validate that nobody is logged in") + public void validateNotLoggedIn() + { + userMenu.find(".goToLogin").should(exist); + } - @Step("validate strings in user menu") - private static void validateGuestUserMenu(String text) + @Step("validate that somebody is logged in") + public boolean isLoggedIn() { - $$("#userMenu li").findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); + return userMenu.find(".goToAccountOverview").exists(); } + // --------------------------------------------------------------------- - // TODO - improve - @Step("open user menu") - public void openUserMenu() - { - // Click the mini cart icon - showUserMenu.scrollTo().click(); - // Wait for mini cart to appear - // Wait for the mini cart to show - userMenu.waitUntil(visible, Neodymium.configuration().selenideTimeout()); - } - // TODO - check if needed - @Step("close user menu") - public void closeUserMenu() - { - // Click the mini cart icon again - showUserMenu.scrollTo().click(); - // Move the mouse out of the area - $("#brand").hover(); - // Wait for mini cart to disappear - // Wait for the mini cart to disappear - userMenu.waitUntil(not(visible), Neodymium.configuration().selenideTimeout()); - } // TODO - check if needed @Step("open login page from user menu") @@ -128,18 +137,4 @@ public void validateLoggedInName(String firstName) // Makes sure the mini menu element has the "logged" class active instead of the "not-logged" class. showUserMenu.find(".icon-user2").shouldHave(cssClass("logged")).shouldHave(exactText("")); } - - // TODO - check if needed - @Step("validate that nobody is logged in") - public void validateNotLoggedIn() - { - userMenu.find(".goToLogin").should(exist); - } - - // TODO - check if needed - @Step("validate that somebody is logged in") - public boolean isLoggedIn() - { - return userMenu.find(".goToAccountOverview").exists(); - } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index 575a141c..fab782c6 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -96,7 +96,7 @@ public ProductDetailPage clickProductByPosition(int row, int column) { // Open the product detail page // Clicks a product by position. Because of the html code, this requires x and y coordinates. - SelenideElement rowContainer = $$("#products > .row").get(row - 1); + SelenideElement rowContainer = $$("#pName").get(row - 1); rowContainer.find(".thumbnail", column - 1).scrollTo().click(); return new ProductDetailPage().isExpectedPage(); } diff --git a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java index 17d448d0..79921750 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java @@ -5,9 +5,6 @@ import posters.pageobjects.components.UserMenu; import posters.pageobjects.pages.AbstractPageObject; -/** - * @author pfotenhauer - */ public abstract class AbstractCheckoutPage extends AbstractPageObject { public CheckoutHeader header = new CheckoutHeader(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java index d51d204f..f08fc500 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java @@ -1,21 +1,39 @@ package posters.pageobjects.pages.checkout; +import static com.codeborne.selenide.Condition.attribute; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; +import posters.dataobjects.Address; -/** - * @author pfotenhauer - */ public class BillingAddressPage extends AbstractCheckoutPage { private SelenideElement headline = $("#titleBillAddr"); + private SelenideElement nameField = $("#fullName"); + + private SelenideElement companyField = $("#company"); + + private SelenideElement addressField = $("#addressLine"); + + private SelenideElement cityField = $("#city"); + + private SelenideElement stateField = $("#state"); + + private SelenideElement zipField = $("#zip"); + + private SelenideElement countryField = $("#country"); + + private SelenideElement addBillingButton = $("#btnAddBillAddr"); + @Override @Step("ensure this is a billing address page") public BillingAddressPage isExpectedPage() @@ -24,20 +42,110 @@ public BillingAddressPage isExpectedPage() return this; } + /// ----- validate shipping address page ----- /// + + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.placeOrder"))).shouldBe(visible); + } + + @Step("validate fill-in form headlines") + public void validateFillInHeadlines(String headline) + { + $$(".form-group").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + } + + @Step("validate fill-in form headlines") + public void validateFillInHeadlines() + { + validateFillInHeadlines("General.fillIn.headlines.fullName"); + validateFillInHeadlines("General.fillIn.headlines.company"); + validateFillInHeadlines("General.fillIn.headlines.address"); + validateFillInHeadlines("General.fillIn.headlines.city"); + validateFillInHeadlines("General.fillIn.headlines.state"); + validateFillInHeadlines("General.fillIn.headlines.zip"); + // validateFillInHeadlines("General.fillIn.headlines.country"); + } + + @Step("validate fill-in form placeholder") + public void validateFillInPlaceholder() + { + nameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.yourName")))).shouldBe(visible); + companyField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.companyName")))).shouldBe(visible); + addressField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.address")))).shouldBe(visible); + zipField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.zip")))).shouldBe(visible); + } + + @Step("validate country dropdown") + public void validateCountryDropdown() + { + countryField.shouldBe(matchText(Neodymium.localizedText("General.fillIn.dropdown.usa"))).should(exist); + countryField.shouldBe(matchText(Neodymium.localizedText("General.fillIn.dropdown.germany"))).should(exist); + } + @Override - @Step("validate billing address page structure") + @Step("validate shipping address page structure") public void validateStructure() { super.validateStructure(); - // Headline - // Assert the headline is there and starts with a capital letter - headline.should(matchText("[A-Z].{3,}")); - // First address - // Makes sure at least one address is visible - $("#billAddr0").shouldBe(visible); + // validate breadcrumb + validateBreadcrumb(); + + // validate fill in form headline + headline.shouldHave(exactText(Neodymium.localizedText("BillingAddressPage.fillIn.headline"))).shouldBe(visible); + validateFillInHeadlines(); + + // validate fill in form structure + validateFillInPlaceholder(); + + // validate country selection dropdown + validateCountryDropdown(); + + // validate "required fields" string + $(".reqField").shouldHave(exactText(Neodymium.localizedText("General.fillIn.headlines.requiredFields"))).shouldBe(visible); + + // validate continue button + addBillingButton.shouldHave(exactText(Neodymium.localizedText("General.fillIn.button"))).shouldBe(visible); + } + + /// ----- send billing address form ----- /// + + public PaymentPage sendBillingAddressForm(Address billingAddress) + { + String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); + + return sendBillingAddressForm(fullName, billingAddress.getCompany(), billingAddress.getStreet(), + billingAddress.getCity(), billingAddress.getState(), billingAddress.getZip(), + billingAddress.getCountry()); + } + + @Step("fill and send new billing address form") + public PaymentPage sendBillingAddressForm(String name, String company, String address, String city, + String state, String zip, String country) + { + // enter parameters + nameField.val(name); + companyField.val(company); + addressField.val(address); + cityField.val(city); + stateField.val(state); + zipField.val(zip); + countryField.selectOption(country); + + // click on "Continue" button + addBillingButton.scrollTo().click(); + + return new PaymentPage().isExpectedPage(); } + // --------------------------------------------------- + /** * @param position * The position of the billing address you want to choose diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 05e23516..49a31788 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -258,11 +258,19 @@ public ProductDetailPage openProductDetailPage(int position) return new ProductDetailPage().isExpectedPage(); } + @Step("open homepage from cart page") public HomePage openHomePage() { $("#brand").scrollTo().click(); return new HomePage().isExpectedPage(); } + + @Step("open shipping address from the cart page") + public ShippingAddressPage openShippingAddressPage() + { + $("#btnStartCheckout").scrollTo().click(); + return new ShippingAddressPage().isExpectedPage(); + } // ----------------------------------------------------------------------------- // @@ -316,11 +324,13 @@ public void removeProductByName(String productName, String style, String size) $("#buttonDelete").click(); } + // needed??? private void clickCheckoutButton() { $("#btnStartCheckout").scrollTo().click(); } + // needed??? @Step("open new shipping address from the cart page") public NewShippingAddressPage openNewShippingPage() { @@ -328,13 +338,6 @@ public NewShippingAddressPage openNewShippingPage() return new NewShippingAddressPage().isExpectedPage(); } - @Step("open shipping address from the cart page") - public ShippingAddressPage openShippingPage() - { - clickCheckoutButton(); - return new ShippingAddressPage().isExpectedPage(); - } - @Step("check if there are product on the cart page") public boolean hasProductsInCart() { diff --git a/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java index e0507971..8db1aa0e 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java @@ -13,9 +13,6 @@ import io.qameta.allure.Step; import posters.dataobjects.Address; -/** - * @author pfotenhauer - */ public class NewShippingAddressPage extends AbstractCheckoutPage { private SelenideElement headline = $("#titleDelAddr"); diff --git a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java index 67a581f8..77728d7e 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java @@ -9,9 +9,6 @@ import io.qameta.allure.Step; -/** - * @author pfotenhauer - */ public class PaymentPage extends AbstractCheckoutPage { private SelenideElement headline = $("#titlePayment"); diff --git a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java index abf1e0bb..1aa156e5 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java @@ -1,17 +1,19 @@ package posters.pageobjects.pages.checkout; +import static com.codeborne.selenide.Condition.attribute; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; +import posters.dataobjects.Address; -/** - * @author pfotenhauer - */ public class ShippingAddressPage extends AbstractCheckoutPage { private SelenideElement headline = $("#titleDelAddr"); @@ -41,66 +43,114 @@ public ShippingAddressPage isExpectedPage() return this; } + /// ----- validate shipping address page ----- /// + + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.placeOrder"))).shouldBe(visible); + } + + @Step("validate fill-in form headlines") + public void validateFillInHeadlines(String headline) + { + $$(".form-group").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + } + + @Step("validate fill-in form headlines") + public void validateFillInHeadlines() + { + validateFillInHeadlines("General.fillIn.headlines.fullName"); + validateFillInHeadlines("General.fillIn.headlines.company"); + validateFillInHeadlines("General.fillIn.headlines.address"); + validateFillInHeadlines("General.fillIn.headlines.city"); + validateFillInHeadlines("General.fillIn.headlines.state"); + validateFillInHeadlines("General.fillIn.headlines.zip"); + // validateFillInHeadlines("General.fillIn.headlines.country"); + } + + @Step("validate fill-in form placeholder") + public void validateFillInPlaceholder() + { + nameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.yourName")))).shouldBe(visible); + companyField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.companyName")))).shouldBe(visible); + addressField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.address")))).shouldBe(visible); + zipField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.zip")))).shouldBe(visible); + } + + @Step("validate country dropdown") + public void validateCountryDropdown() + { + countryField.shouldBe(matchText(Neodymium.localizedText("General.fillIn.dropdown.usa"))).should(exist); + countryField.shouldBe(matchText(Neodymium.localizedText("General.fillIn.dropdown.germany"))).should(exist); + } + + @Step("validate shipping address usage for billing address radio") + public void validateAddressRadio() + { + $(".control-label").shouldHave(exactText(Neodymium.localizedText("General.fillIn.headlines.useAddressForBilling"))).shouldBe(visible); + $(".radio :nth-of-type(1)").shouldHave(matchText(Neodymium.localizedText("General.fillIn.radio.yes"))).shouldBe(visible); + $(".radio :nth-of-type(2)").shouldHave(matchText(Neodymium.localizedText("General.fillIn.radio.no"))).shouldBe(visible); + } + @Override @Step("validate shipping address page structure") public void validateStructure() { super.validateStructure(); - // Headline - // Assert the headline is there and starts with a capital letter - headline.should(matchText("[A-Z].{3,}")); - // First address - // Makes sure at least one address is visible - $("#delAddr0").shouldBe(visible); + // validate breadcrumb + validateBreadcrumb(); + + // validate fill in form headline + headline.shouldHave(exactText(Neodymium.localizedText("ShippingAddressPage.fillIn.headline"))).shouldBe(visible); + validateFillInHeadlines(); + + // validate fill in form structure + validateFillInPlaceholder(); + + // validate country selection dropdown + validateCountryDropdown(); + + // validate address usage radio + validateAddressRadio(); + + // validate "required fields" string + $(".reqField").shouldHave(exactText(Neodymium.localizedText("General.fillIn.headlines.requiredFields"))).shouldBe(visible); + + // validate continue button + addShippingButton.shouldHave(exactText(Neodymium.localizedText("General.fillIn.button"))).shouldBe(visible); } - /** - * @param position - * position of the shipping address - * @return BillingAddressPage - */ - @Step("select a shipping address") - public BillingAddressPage selectShippingAddress(int position) + /// ----- send shipping address form ----- /// + + public BillingAddressPage sendShippingAddressForm(Address shippingAddress, boolean sameBillingAddress) { - final int index = position - 1; - // Select address - // Checks the radio button belonging to the delivery address with index @{index} - $("#delAddr" + index + " input").scrollTo().click(); - // Open the billing address page in the checkout process - // Clicks the continue button - $("#btnUseAddressContinue").scrollTo().click(); + String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); - return new BillingAddressPage().isExpectedPage(); + return sendShippingAddressForm(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), + shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), + shippingAddress.getCountry(), sameBillingAddress); } @Step("fill and send shipping address form") public BillingAddressPage sendShippingAddressForm(String name, String company, String address, String city, String state, String zip, String country, boolean sameBillingAddress) { - // Name - // Enter the name parameter + // enter parameters nameField.val(name); - // Company - // Enter the company parameter companyField.val(company); - // Address - // Enter the address parameter addressField.val(address); - // City - // Enter the city parameter cityField.val(city); - // State - // Enter the state parameter stateField.val(state); - // Zip - // Enter the zip parameter zipField.val(zip); - // Country - // Select the country whose label equals the parameter countryField.selectOption(country); - // Radio Button - // Click the radio button for Yes or No + + // check if shipping address and billing address is equal if (sameBillingAddress) { $("#billEqualShipp-Yes").scrollTo().click(); @@ -109,10 +159,31 @@ public BillingAddressPage sendShippingAddressForm(String name, String company, S { $("#billEqualShipp-No").scrollTo().click(); } - // Open the billing addresses or payment options page, depending on which radio button you checked - // Click on Continue + + // click on "Continue" button addShippingButton.scrollTo().click(); return new BillingAddressPage().isExpectedPage(); } + + // --------------------------------------------------------------- + + /** + * @param position + * position of the shipping address + * @return BillingAddressPage + */ + @Step("select a shipping address") + public BillingAddressPage selectShippingAddress(int position) + { + final int index = position - 1; + // Select address + // Checks the radio button belonging to the delivery address with index @{index} + $("#delAddr" + index + " input").scrollTo().click(); + // Open the billing address page in the checkout process + // Clicks the continue button + $("#btnUseAddressContinue").scrollTo().click(); + + return new BillingAddressPage().isExpectedPage(); + } } diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index 32cba178..edee2c4d 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -11,6 +11,7 @@ import posters.tests.testdata.processes.AddToCartTestData; import posters.tests.testdata.processes.BrowseTestData; +import posters.tests.testdata.processes.GuestOrderTestData; import posters.tests.testdata.pageobjects.components.HeaderTestData; import posters.tests.testdata.pageobjects.components.PaginationTestData; import posters.tests.testdata.pageobjects.components.SearchTestData; @@ -28,6 +29,8 @@ public abstract class AbstractTest protected AddToCartTestData addToCartTestData; protected BrowseTestData browseTestData; + + protected GuestOrderTestData guestOrderTestData; @Before public void setup() @@ -37,6 +40,7 @@ public void setup() searchTestData = DataUtils.get(SearchTestData.class); addToCartTestData = DataUtils.get(AddToCartTestData.class); browseTestData = DataUtils.get(BrowseTestData.class); + guestOrderTestData = DataUtils.get(GuestOrderTestData.class); } protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTest.class); diff --git a/src/test/java/posters/tests/smoke/processes/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java similarity index 99% rename from src/test/java/posters/tests/smoke/processes/AddToCartTest.java rename to src/test/java/posters/tests/smoke/AddToCartTest.java index a25aad56..6c80f418 100644 --- a/src/test/java/posters/tests/smoke/processes/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -1,4 +1,4 @@ -package posters.tests.smoke.processes; +package posters.tests.smoke; import org.junit.Test; diff --git a/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java b/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java index 51ac46ad..3c126b3b 100644 --- a/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java +++ b/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java @@ -68,10 +68,10 @@ public void browseRandomCategoriesAndProducts() LOGGER.info("Category page"); String categoryName = homePage.topNav.getRandomSubcategoryName(random); categoryPage = homePage.topNav.clickSubcategoryByName(categoryName); - categoryPage.validateAndVisualAssert(categoryName); + categoryPage.validateAndVisualAssert(categoryName, 30); categoryPage = categoryPage.pagination.clickOnRandomSite(random); categoryPage.scrollToTop(); - categoryPage.validateAndVisualAssert(categoryName); + categoryPage.validateAndVisualAssert(categoryName, 30); // Go to any product detail page LOGGER.info("Product detail page"); diff --git a/src/test/java/posters/tests/smoke/processes/BrowseTest.java b/src/test/java/posters/tests/smoke/BrowseTest.java similarity index 98% rename from src/test/java/posters/tests/smoke/processes/BrowseTest.java rename to src/test/java/posters/tests/smoke/BrowseTest.java index 643b7214..0c0e1d4c 100644 --- a/src/test/java/posters/tests/smoke/processes/BrowseTest.java +++ b/src/test/java/posters/tests/smoke/BrowseTest.java @@ -1,4 +1,4 @@ -package posters.tests.smoke.processes; +package posters.tests.smoke; import org.junit.Test; diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index 0c079cee..f2b9bbd5 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -2,6 +2,7 @@ import org.junit.Test; +import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; @@ -14,9 +15,6 @@ import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; -/** - * @author pfotenhauer - */ @Owner("Joe Fix") @Severity(SeverityLevel.BLOCKER) @Tag("smoke") @@ -24,60 +22,48 @@ public class GuestOrderTest extends AbstractTest { @Test + @DataSet(1) public void testOrderingAsGuest() { - // total product count will be updated throughout the test - int totalCount = 0; final String shippingCosts = Neodymium.dataValue("shippingCosts"); + int totalCount = 0; - - - // Go to homepage - var homePage = OpenHomePageFlow.flow(); - homePage.validateStructure(); - - // Assure not logged in status - homePage.userMenu.validateNotLoggedIn(); - - // Assure an empty cart - homePage.miniCart.validateTotalCount(totalCount); - homePage.miniCart.validateSubtotal("$0.00"); - final String oldSubtotal = homePage.miniCart.getSubtotal(); - - // Go to category - final String categoryName = homePage.topNav.getSubCategoryNameByPosition(3, 2); - var categoryPage = homePage.topNav.clickSubCategoryByPosition(3, 2); - categoryPage.validate(categoryName); - - // Goto product page - final String productName = categoryPage.getProductNameByPosition(1, 1); - var productDetailPage = categoryPage.clickProductByPosition(1, 1); - productDetailPage.validate(productName); - productDetailPage.addToCart("64 x 48 in", "gloss"); - - // Go to cart and validate - final var product = productDetailPage.getProduct(); - var cartPage = productDetailPage.miniCart.openCartPage(); - cartPage.validateStructure(); - cartPage.validateShippingCosts(shippingCosts); - cartPage.miniCart.validateMiniCart(1, product); - cartPage.miniCart.validateTotalCount(++totalCount); - cartPage.validateCartItem(1, product); - cartPage.validateTotalAfterAdd(1, oldSubtotal, 0.00); - - // setup checkout data final var shippingAddress = DataUtils.get(Address.class); final boolean sameBillingAddress = false; final var billingAddress = DataUtils.get(Address.class); final var creditCard = DataUtils.get(CreditCard.class); + + // go to homepage + var homePage = OpenHomePageFlow.flow(); - // Go to shipping address and validate - var newShippingAddressPage = cartPage.openNewShippingPage(); - newShippingAddressPage.validateStructure(); + // store old subtotal + final String oldSubtotal = homePage.miniCart.getSubtotal(); + + // go to category page + var categoryPage = homePage.topNav.clickCategory(guestOrderTestData.getTopCategory()); + + // go to product detail page, add and store displayed product + var productDetailPage = categoryPage.clickProductByPosition(guestOrderTestData.getResultPosition()); + productDetailPage.addToCart(guestOrderTestData.getsSizeProduct(), guestOrderTestData.getStyleProduct()); + + // go to cart page + var cartPage = productDetailPage.miniCart.openCartPage(); + + // go to shipping address page and validate + var shippingAddressPage = cartPage.openShippingAddressPage(); + shippingAddressPage.validateStructure(); + + // go to billing address page and validate + var billingAddressPage = shippingAddressPage.sendShippingAddressForm(shippingAddress, sameBillingAddress); + billingAddressPage.validateStructure(); + + // go to payment page and validate + var paymentPage = billingAddressPage.sendBillingAddressForm(billingAddress); + paymentPage.validateStructure(); + + + /* - // Send shipping address and validate billing form - var newBillingAddressPage = newShippingAddressPage.sendShippingAddressForm(shippingAddress, sameBillingAddress); - newBillingAddressPage.validateStructure(); // Send billing address and validate payment form var newPaymentPage = newBillingAddressPage.sendBillingAddressForm(billingAddress); @@ -105,5 +91,6 @@ public void testOrderingAsGuest() //Validate home page homePage.validateStructure(); + */ } } diff --git a/src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java b/src/test/java/posters/tests/smoke/HeaderTest.java similarity index 95% rename from src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java rename to src/test/java/posters/tests/smoke/HeaderTest.java index b5774584..7d1f0dfb 100644 --- a/src/test/java/posters/tests/smoke/pageobjects/components/HeaderTest.java +++ b/src/test/java/posters/tests/smoke/HeaderTest.java @@ -1,4 +1,4 @@ -package posters.tests.smoke.pageobjects.components; +package posters.tests.smoke; import org.junit.Test; diff --git a/src/test/java/posters/tests/smoke/pageobjects/pages/HomePageTest.java b/src/test/java/posters/tests/smoke/HomePageTest.java similarity index 96% rename from src/test/java/posters/tests/smoke/pageobjects/pages/HomePageTest.java rename to src/test/java/posters/tests/smoke/HomePageTest.java index 36e91b7a..cc242c5c 100644 --- a/src/test/java/posters/tests/smoke/pageobjects/pages/HomePageTest.java +++ b/src/test/java/posters/tests/smoke/HomePageTest.java @@ -1,4 +1,4 @@ -package posters.tests.smoke.pageobjects.pages; +package posters.tests.smoke; import org.junit.Test; diff --git a/src/test/java/posters/tests/smoke/pageobjects/components/PaginationTest.java b/src/test/java/posters/tests/smoke/PaginationTest.java similarity index 94% rename from src/test/java/posters/tests/smoke/pageobjects/components/PaginationTest.java rename to src/test/java/posters/tests/smoke/PaginationTest.java index 6a5b24d0..46bfbad2 100644 --- a/src/test/java/posters/tests/smoke/pageobjects/components/PaginationTest.java +++ b/src/test/java/posters/tests/smoke/PaginationTest.java @@ -1,4 +1,4 @@ -package posters.tests.smoke.pageobjects.components; +package posters.tests.smoke; import org.junit.Test; diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 543f2386..2db6c628 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -16,9 +16,6 @@ import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; -/** - * @author pfotenhauer - */ @Owner("Lisa Smith") @Severity(SeverityLevel.BLOCKER) @Tag("smoke") @@ -56,7 +53,7 @@ public void testOrderingAsRegisteredUser() // Go to category final String categoryName = homePage.topNav.getSubCategoryNameByPosition(2, 3); var categoryPage = homePage.topNav.clickSubCategoryByPosition(2, 3); - categoryPage.validate(categoryName); + //categoryPage.validate(categoryName); // Go to product page final String productName = categoryPage.getProductNameByPosition(2, 1); @@ -75,7 +72,7 @@ public void testOrderingAsRegisteredUser() cartPage.validateTotalAfterAdd(1, oldSubtotal, 0.00); // Go to shipping address and validate - var shippingAddressPage = cartPage.openShippingPage(); + var shippingAddressPage = cartPage.openShippingAddressPage(); shippingAddressPage.validateStructure(); // Send shipping address and validate billing form diff --git a/src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java b/src/test/java/posters/tests/smoke/SearchTest.java similarity index 96% rename from src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java rename to src/test/java/posters/tests/smoke/SearchTest.java index 2a3fb17f..b9ecf1cd 100644 --- a/src/test/java/posters/tests/smoke/pageobjects/components/SearchTest.java +++ b/src/test/java/posters/tests/smoke/SearchTest.java @@ -1,4 +1,4 @@ -package posters.tests.smoke.pageobjects.components; +package posters.tests.smoke; import org.junit.Test; diff --git a/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java b/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java new file mode 100644 index 00000000..83987282 --- /dev/null +++ b/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java @@ -0,0 +1,32 @@ +package posters.tests.testdata.processes; + +public class GuestOrderTestData +{ + private String topCategory; + + private int resultPosition; + + private String sizeProduct; + + private String styleProduct; + + public String getTopCategory() + { + return topCategory; + } + + public int getResultPosition() + { + return resultPosition; + } + + public String getsSizeProduct() + { + return sizeProduct; + } + + public String getStyleProduct() + { + return styleProduct; + } +} \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/processes/AddToCartTest.json b/src/test/resources/posters/tests/smoke/AddToCartTest.json similarity index 100% rename from src/test/resources/posters/tests/smoke/processes/AddToCartTest.json rename to src/test/resources/posters/tests/smoke/AddToCartTest.json diff --git a/src/test/resources/posters/tests/smoke/processes/BrowseTest.json b/src/test/resources/posters/tests/smoke/BrowseTest.json similarity index 100% rename from src/test/resources/posters/tests/smoke/processes/BrowseTest.json rename to src/test/resources/posters/tests/smoke/BrowseTest.json diff --git a/src/test/resources/posters/tests/smoke/GuestOrderTest.json b/src/test/resources/posters/tests/smoke/GuestOrderTest.json index 81e2d7e0..ed1d6f93 100644 --- a/src/test/resources/posters/tests/smoke/GuestOrderTest.json +++ b/src/test/resources/posters/tests/smoke/GuestOrderTest.json @@ -1,16 +1,21 @@ [ { - "name":"Jimmy Blue", - "company":"Ochsenknecht Records", - "street":"6 Wall St", - "city":"Burlington", - "state":"Massachusetts", - "zip":"01803", - "country":"United States", - "fullName":"Jimmy Blue", - "cardNumber":"4111111111111111", - "crypticCardNumber":"xxxx xxxx xxxx 1111", - "expDateMonth":"04", - "expDateYear":"2023" + "topCategory": "header.topNavigation.1.title", + "resultPosition": "5", + "sizeProduct": "64 x 48 in", + "styleProduct": "gloss", + "firstName": "Jimmy Blue", + "lastName": "Ochsenknecht", + "company": "Ochsenknecht Records", + "street": "6 Wall St", + "city": "Burlington", + "state": "Massachusetts", + "zip": "01803", + "country": "United States", + "fullName": "Jimmy Blue", + "cardNumber": "4111111111111111", + "crypticCardNumber": "xxxx xxxx xxxx 1111", + "expDateMonth": "04", + "expDateYear": "2023" } ] diff --git a/src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json b/src/test/resources/posters/tests/smoke/HeaderTest.json similarity index 100% rename from src/test/resources/posters/tests/smoke/pageobjects/components/HeaderTest.json rename to src/test/resources/posters/tests/smoke/HeaderTest.json diff --git a/src/test/resources/posters/tests/smoke/pageobjects/components/PaginationTest.json b/src/test/resources/posters/tests/smoke/PaginationTest.json similarity index 100% rename from src/test/resources/posters/tests/smoke/pageobjects/components/PaginationTest.json rename to src/test/resources/posters/tests/smoke/PaginationTest.json diff --git a/src/test/resources/posters/tests/smoke/pageobjects/components/SearchTest.json b/src/test/resources/posters/tests/smoke/SearchTest.json similarity index 100% rename from src/test/resources/posters/tests/smoke/pageobjects/components/SearchTest.json rename to src/test/resources/posters/tests/smoke/SearchTest.json From 60bbbc9418b6868255654e2cb324475432db9235 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Wed, 2 Aug 2023 16:50:59 +0200 Subject: [PATCH 18/44] extended validation for PaymentPage --- config/localization.yaml | 54 ++++++-- .../pages/checkout/BillingAddressPage.java | 42 +++--- .../pages/checkout/PaymentPage.java | 120 +++++++++++++++++- .../pages/checkout/ShippingAddressPage.java | 48 +++---- 4 files changed, 200 insertions(+), 64 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index c46cdb75..1308e755 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -95,14 +95,49 @@ default: errorMessage: Your cart is empty. Continue shopping. ShippingAddressPage: fillIn: - headline: Enter a shipping address + title: Enter a shipping address BillingAddressPage: fillIn: - headline: Enter a billing address + title: Enter a billing address + PaymentPage: + fillIn: + title: Enter a payment method + headlines: + cardNumber: "CARD NUMBER*" + cardHolderName: "CARDHOLDER'S NAME*" + expirationDate: EXPIRATION DATE* + placeholder: + cardNumber: Card number + cardOwnerName: "Cardholder's name" + expireMonth: + january: 01 + february: 02 + march: 03 + april: 04 + may: 05 + june: 06 + july: 07 + august: 08 + september: 09 + october: 10 + november: 11 + december: 12 + expireYear: + "2023": 2023 + "2024": 2024 + "2025": 2025 + "2026": 2026 + "2027": 2027 + "2028": 2028 + "2029": 2029 + "2030": 2030 + "2031": 2031 + "2032": 2032 + "2033": 2033 AccountPages: email: Email address* - firstname: First name* - lastname: Last name* + firstName: First name* + lastName: Last name* password: Password* passwordRepeat: Repeat password* yourEmail: Your email* @@ -115,9 +150,7 @@ default: successfulAccountCreation: Your account has been created. Log in with your email address and password. emailDoesNotExistError: The email address you entered doesn't exist. Please try again. incorrectPasswordError: The password you entered is incorrect. Please try again. - General: - addresses: - fullname: Full name* + AddressPages: breadcrumb: cart: CART/ shippingAddress: SHIPPING ADDRESS / @@ -146,11 +179,8 @@ default: radio: "yes": "YES" "no": "NO" - button: Continue - payment: - cardnumber: Card number* - cardholdername: Cardholder's name* - expirationdate: Expiration date* + button: Continue + General: product: style: style size: size diff --git a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java index f08fc500..35483e7f 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java @@ -47,11 +47,11 @@ public BillingAddressPage isExpectedPage() @Step("validate breadcrumb") public void validateBreadcrumb() { - $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.cart"))).shouldBe(visible); - $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.shippingAddress"))).shouldBe(visible); - $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.billingAddress"))).shouldBe(visible); - $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.payment"))).shouldBe(visible); - $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.placeOrder"))).shouldBe(visible); + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); } @Step("validate fill-in form headlines") @@ -63,29 +63,29 @@ public void validateFillInHeadlines(String headline) @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - validateFillInHeadlines("General.fillIn.headlines.fullName"); - validateFillInHeadlines("General.fillIn.headlines.company"); - validateFillInHeadlines("General.fillIn.headlines.address"); - validateFillInHeadlines("General.fillIn.headlines.city"); - validateFillInHeadlines("General.fillIn.headlines.state"); - validateFillInHeadlines("General.fillIn.headlines.zip"); - // validateFillInHeadlines("General.fillIn.headlines.country"); + validateFillInHeadlines("AddressPages.fillIn.headlines.fullName"); + validateFillInHeadlines("AddressPages.fillIn.headlines.company"); + validateFillInHeadlines("AddressPages.fillIn.headlines.address"); + validateFillInHeadlines("AddressPages.fillIn.headlines.city"); + validateFillInHeadlines("AddressPages.fillIn.headlines.state"); + validateFillInHeadlines("AddressPages.fillIn.headlines.zip"); + // validateFillInHeadlines("AddressPages.fillIn.headlines.country"); } @Step("validate fill-in form placeholder") public void validateFillInPlaceholder() { - nameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.yourName")))).shouldBe(visible); - companyField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.companyName")))).shouldBe(visible); - addressField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.address")))).shouldBe(visible); - zipField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.zip")))).shouldBe(visible); + nameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.yourName")))).shouldBe(visible); + companyField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.companyName")))).shouldBe(visible); + addressField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.address")))).shouldBe(visible); + zipField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.zip")))).shouldBe(visible); } @Step("validate country dropdown") public void validateCountryDropdown() { - countryField.shouldBe(matchText(Neodymium.localizedText("General.fillIn.dropdown.usa"))).should(exist); - countryField.shouldBe(matchText(Neodymium.localizedText("General.fillIn.dropdown.germany"))).should(exist); + countryField.shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.usa"))).should(exist); + countryField.shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.germany"))).should(exist); } @Override @@ -98,7 +98,7 @@ public void validateStructure() validateBreadcrumb(); // validate fill in form headline - headline.shouldHave(exactText(Neodymium.localizedText("BillingAddressPage.fillIn.headline"))).shouldBe(visible); + headline.shouldHave(exactText(Neodymium.localizedText("BillingAddressPage.fillIn.title"))).shouldBe(visible); validateFillInHeadlines(); // validate fill in form structure @@ -108,10 +108,10 @@ public void validateStructure() validateCountryDropdown(); // validate "required fields" string - $(".reqField").shouldHave(exactText(Neodymium.localizedText("General.fillIn.headlines.requiredFields"))).shouldBe(visible); + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); // validate continue button - addBillingButton.shouldHave(exactText(Neodymium.localizedText("General.fillIn.button"))).shouldBe(visible); + addBillingButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.button"))).shouldBe(visible); } /// ----- send billing address form ----- /// diff --git a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java index 77728d7e..114f8371 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java @@ -1,11 +1,17 @@ package posters.pageobjects.pages.checkout; +import java.time.LocalDate; + +import static com.codeborne.selenide.Condition.attribute; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; @@ -22,6 +28,7 @@ public class PaymentPage extends AbstractCheckoutPage private SelenideElement expirationYear = $("#expirationDateYear"); private SelenideElement addPaymentButton = $("#btnAddPayment"); + @Override @Step("ensure this is a payment page") @@ -32,19 +39,118 @@ public PaymentPage isExpectedPage() return this; } + /// ----- validate payment page ----- /// + + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + + @Step("validate fill-in form headlines") + public void validateFillInHeadlines(String headline) + { + $$(".form-group label").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + } + + @Step("validate fill-in form headlines") + public void validateFillInHeadlines() + { + validateFillInHeadlines("PaymentPage.fillIn.headlines.cardNumber"); + validateFillInHeadlines("PaymentPage.fillIn.headlines.cardHolderName"); + validateFillInHeadlines("PaymentPage.fillIn.headlines.expirationDate"); + } + + @Step("validate fill-in form placeholder") + public void validateFillInPlaceholder() + { + creditCardNumber.shouldHave(attribute("placeholder", (Neodymium.localizedText("PaymentPage.fillIn.placeholder.cardNumber")))).shouldBe(visible); + creditCardName.shouldHave(attribute("placeholder", (Neodymium.localizedText("PaymentPage.fillIn.placeholder.cardOwnerName")))).shouldBe(visible); + $("#expirationDateMonth [selected]").shouldHave(exactText("0" + Integer.toString(LocalDate.now().getMonthValue()))).shouldBe(visible); + $("#expirationDateYear [selected]").shouldHave(exactText(Integer.toString(LocalDate.now().getYear()))).shouldBe(visible); + } + + @Step("validate month dropdown") + public void validateMonthDropdown(String month) + { + $$("#expirationDateMonth").findBy(matchText(Neodymium.localizedText(month))).shouldBe(visible); + } + + @Step("validate month dropdown") + public void validateMonthDropdown() + { + // open dropdown + $("#expirationDateMonth").scrollTo().click(); + + // validate months + validateMonthDropdown("PaymentPage.fillIn.expireMonth.january"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.february"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.march"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.april"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.may"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.june"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.july"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.august"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.september"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.october"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.november"); + validateMonthDropdown("PaymentPage.fillIn.expireMonth.december"); + } + + @Step("validate year dropdown") + public void validateYearDropdown(String year) + { + $$("#expirationDateYear").findBy(matchText(Neodymium.localizedText(year))).shouldBe(visible); + } + + @Step("validate year dropdown") + public void validateYearDropdown() + { + // open dropdown + $("#expirationDateYear").scrollTo().click(); + + // validate years + validateYearDropdown("PaymentPage.fillIn.expireYear.2023"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2024"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2025"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2026"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2027"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2028"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2029"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2030"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2031"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2032"); + validateYearDropdown("PaymentPage.fillIn.expireYear.2033"); + } + @Override @Step("validate payment page structure") public void validateStructure() { super.validateStructure(); - - // Headline - // Makes sure the headline is there and starts with a capital letter - headline.should(matchText("[A-Z].{3,}")); - // First credit card - // Makes sure at least one credit card is saved - $("#payment0").shouldBe(visible); + + // validate breadcrumb + validateBreadcrumb(); + + // validate fill in form headline + headline.shouldHave(exactText(Neodymium.localizedText("PaymentPage.fillIn.title"))).shouldBe(visible); + validateFillInHeadlines(); + + // validate placeholder + validateFillInPlaceholder(); + + // validate month dropdown + validateMonthDropdown(); + + // validate year dropdown + validateYearDropdown(); } + + // -------------------------------------------------------- /** * @param position diff --git a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java index 1aa156e5..d772557c 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java @@ -48,11 +48,11 @@ public ShippingAddressPage isExpectedPage() @Step("validate breadcrumb") public void validateBreadcrumb() { - $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.cart"))).shouldBe(visible); - $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.shippingAddress"))).shouldBe(visible); - $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.billingAddress"))).shouldBe(visible); - $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.payment"))).shouldBe(visible); - $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("General.breadcrumb.placeOrder"))).shouldBe(visible); + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); } @Step("validate fill-in form headlines") @@ -64,37 +64,37 @@ public void validateFillInHeadlines(String headline) @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - validateFillInHeadlines("General.fillIn.headlines.fullName"); - validateFillInHeadlines("General.fillIn.headlines.company"); - validateFillInHeadlines("General.fillIn.headlines.address"); - validateFillInHeadlines("General.fillIn.headlines.city"); - validateFillInHeadlines("General.fillIn.headlines.state"); - validateFillInHeadlines("General.fillIn.headlines.zip"); - // validateFillInHeadlines("General.fillIn.headlines.country"); + validateFillInHeadlines("AddressPages.fillIn.headlines.fullName"); + validateFillInHeadlines("AddressPages.fillIn.headlines.company"); + validateFillInHeadlines("AddressPages.fillIn.headlines.address"); + validateFillInHeadlines("AddressPages.fillIn.headlines.city"); + validateFillInHeadlines("AddressPages.fillIn.headlines.state"); + validateFillInHeadlines("AddressPages.fillIn.headlines.zip"); + // validateFillInHeadlines("AddressPages.fillIn.headlines.country"); } @Step("validate fill-in form placeholder") public void validateFillInPlaceholder() { - nameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.yourName")))).shouldBe(visible); - companyField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.companyName")))).shouldBe(visible); - addressField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.address")))).shouldBe(visible); - zipField.shouldHave(attribute("placeholder", (Neodymium.localizedText("General.fillIn.placeholder.zip")))).shouldBe(visible); + nameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.yourName")))).shouldBe(visible); + companyField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.companyName")))).shouldBe(visible); + addressField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.address")))).shouldBe(visible); + zipField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.zip")))).shouldBe(visible); } @Step("validate country dropdown") public void validateCountryDropdown() { - countryField.shouldBe(matchText(Neodymium.localizedText("General.fillIn.dropdown.usa"))).should(exist); - countryField.shouldBe(matchText(Neodymium.localizedText("General.fillIn.dropdown.germany"))).should(exist); + countryField.shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.usa"))).should(exist); + countryField.shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.germany"))).should(exist); } @Step("validate shipping address usage for billing address radio") public void validateAddressRadio() { - $(".control-label").shouldHave(exactText(Neodymium.localizedText("General.fillIn.headlines.useAddressForBilling"))).shouldBe(visible); - $(".radio :nth-of-type(1)").shouldHave(matchText(Neodymium.localizedText("General.fillIn.radio.yes"))).shouldBe(visible); - $(".radio :nth-of-type(2)").shouldHave(matchText(Neodymium.localizedText("General.fillIn.radio.no"))).shouldBe(visible); + $(".control-label").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.useAddressForBilling"))).shouldBe(visible); + $(".radio :nth-of-type(1)").shouldHave(matchText(Neodymium.localizedText("AddressPages.fillIn.radio.yes"))).shouldBe(visible); + $(".radio :nth-of-type(2)").shouldHave(matchText(Neodymium.localizedText("AddressPages.fillIn.radio.no"))).shouldBe(visible); } @Override @@ -107,7 +107,7 @@ public void validateStructure() validateBreadcrumb(); // validate fill in form headline - headline.shouldHave(exactText(Neodymium.localizedText("ShippingAddressPage.fillIn.headline"))).shouldBe(visible); + headline.shouldHave(exactText(Neodymium.localizedText("ShippingAddressPage.fillIn.title"))).shouldBe(visible); validateFillInHeadlines(); // validate fill in form structure @@ -120,10 +120,10 @@ public void validateStructure() validateAddressRadio(); // validate "required fields" string - $(".reqField").shouldHave(exactText(Neodymium.localizedText("General.fillIn.headlines.requiredFields"))).shouldBe(visible); + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); // validate continue button - addShippingButton.shouldHave(exactText(Neodymium.localizedText("General.fillIn.button"))).shouldBe(visible); + addShippingButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.button"))).shouldBe(visible); } /// ----- send shipping address form ----- /// From a5e8cb70e935220bc184ea085f0a693b10268987 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Thu, 3 Aug 2023 15:33:13 +0200 Subject: [PATCH 19/44] almost finished validate-extension for PlaceOrderPage --- config/localization.yaml | 7 + .../java/posters/flows/DeleteUserFlow.java | 5 +- .../pageobjects/components/MiniCart.java | 2 +- .../pageobjects/pages/browsing/HomePage.java | 2 +- .../pages/browsing/ProductDetailPage.java | 2 +- .../pages/checkout/BillingAddressPage.java | 3 +- .../pageobjects/pages/checkout/CartPage.java | 2 +- .../pages/checkout/NewBillingAddressPage.java | 5 +- .../pages/checkout/NewPaymentPage.java | 5 +- .../checkout/NewShippingAddressPage.java | 2 +- .../pages/checkout/PaymentPage.java | 45 ++-- .../pages/checkout/PlaceOrderPage.java | 198 ++++++++++-------- .../pages/checkout/ShippingAddressPage.java | 3 +- .../pageobjects/pages/user/LoginPage.java | 5 +- .../pages/user/OrderHistoryPage.java | 2 +- .../pageobjects/pages/user/RegisterPage.java | 5 +- .../posters/tests/smoke/GuestOrderTest.java | 24 +-- .../tests/smoke/RegisterFromUserMenuTest.java | 6 +- .../posters/tests/smoke/RegisterTest.java | 8 +- .../tests/smoke/RegisteredOrderTest.java | 4 +- .../testdata}/dataobjects/Address.java | 3 +- .../testdata}/dataobjects/CreditCard.java | 3 +- .../testdata}/dataobjects/Product.java | 2 +- .../testdata}/dataobjects/User.java | 2 +- .../java/posters/tests/unit/LoginTest.java | 5 +- 25 files changed, 182 insertions(+), 168 deletions(-) rename src/test/java/posters/{ => tests/testdata}/dataobjects/Address.java (95%) rename src/test/java/posters/{ => tests/testdata}/dataobjects/CreditCard.java (97%) rename src/test/java/posters/{ => tests/testdata}/dataobjects/Product.java (98%) rename src/test/java/posters/{ => tests/testdata}/dataobjects/User.java (96%) diff --git a/config/localization.yaml b/config/localization.yaml index 1308e755..cb95e653 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -134,6 +134,13 @@ default: "2031": 2031 "2032": 2032 "2033": 2033 + PlaceOrderPage: + overview: + title: Order Overview + headlines: + shippingAddress: Shipping Address + billingAddress: Billing Address + payment: Payment Settings AccountPages: email: Email address* firstName: First name* diff --git a/src/test/java/posters/flows/DeleteUserFlow.java b/src/test/java/posters/flows/DeleteUserFlow.java index 846efef0..19a1ba3d 100644 --- a/src/test/java/posters/flows/DeleteUserFlow.java +++ b/src/test/java/posters/flows/DeleteUserFlow.java @@ -1,15 +1,12 @@ package posters.flows; import io.qameta.allure.Step; -import posters.dataobjects.User; +import posters.tests.testdata.dataobjects.User; import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.user.LoginPage; public class DeleteUserFlow { - /** - * @param user - */ @Step("delete user flow") public static LoginPage flow(User user) { diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 2da45e67..2aa57eaf 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -12,7 +12,7 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.Product; +import posters.tests.testdata.dataobjects.Product; import posters.pageobjects.pages.checkout.CartPage; import posters.pageobjects.utility.PriceHelper; diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index 021d03fb..e5196dac 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -10,7 +10,7 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.User; +import posters.tests.testdata.dataobjects.User; public class HomePage extends AbstractBrowsingPage { diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index c95dfb94..7733b8bc 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -11,7 +11,7 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.Product; +import posters.tests.testdata.dataobjects.Product; public class ProductDetailPage extends AbstractBrowsingPage { diff --git a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java index 35483e7f..55a5c7bf 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java @@ -12,7 +12,7 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.Address; +import posters.tests.testdata.dataobjects.Address; public class BillingAddressPage extends AbstractCheckoutPage { @@ -116,6 +116,7 @@ public void validateStructure() /// ----- send billing address form ----- /// + @Step("fill and send new billing address form") public PaymentPage sendBillingAddressForm(Address billingAddress) { String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 49a31788..cd212911 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -15,7 +15,7 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.Product; +import posters.tests.testdata.dataobjects.Product; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.browsing.ProductDetailPage; diff --git a/src/test/java/posters/pageobjects/pages/checkout/NewBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/NewBillingAddressPage.java index defb4882..b36f401d 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/NewBillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/NewBillingAddressPage.java @@ -10,11 +10,8 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.Address; +import posters.tests.testdata.dataobjects.Address; -/** - * @author pfotenhauer - */ public class NewBillingAddressPage extends AbstractCheckoutPage { private SelenideElement headline = $("#titleBillAddr"); diff --git a/src/test/java/posters/pageobjects/pages/checkout/NewPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/NewPaymentPage.java index c6707d2b..859f9d91 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/NewPaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/NewPaymentPage.java @@ -10,11 +10,8 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.CreditCard; +import posters.tests.testdata.dataobjects.CreditCard; -/** - * @author pfotenhauer - */ public class NewPaymentPage extends AbstractCheckoutPage { private SelenideElement headline = $("#titlePayment"); diff --git a/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java index 8db1aa0e..ea1b8819 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java @@ -11,7 +11,7 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.Address; +import posters.tests.testdata.dataobjects.Address; public class NewShippingAddressPage extends AbstractCheckoutPage { diff --git a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java index 114f8371..50e0121f 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java @@ -14,6 +14,7 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; +import posters.tests.testdata.dataobjects.CreditCard; public class PaymentPage extends AbstractCheckoutPage { @@ -150,6 +151,29 @@ public void validateStructure() validateYearDropdown(); } + /// ----- send payment form ----- /// + + @Step("fill and send payment form") + public PlaceOrderPage sendPaymentForm(CreditCard creditcard) + { + return sendPaymentForm(creditcard.getCardNumber(), creditcard.getFullName(), creditcard.getExpDateMonth(), creditcard.getExpDateYear()); + } + + @Step("fill and send payment form") + public PlaceOrderPage sendPaymentForm(String number, String name, String month, String year) + { + // enter parameters + creditCardNumber.val(number); + creditCardName.val(name); + expirationMonth.selectOption(month); + expirationYear.selectOption(year); + + // click on "Continue" button + addPaymentButton.scrollTo().click(); + + return new PlaceOrderPage().isExpectedPage(); + } + // -------------------------------------------------------- /** @@ -170,25 +194,4 @@ public PlaceOrderPage selectCreditCard(int position) return new PlaceOrderPage().isExpectedPage(); } - - @Step("fill and send payment form") - public PlaceOrderPage sendPaymentForm(String number, String name, String month, String year) - { - // Credit Card Number - // Fills the card number field with the parameter - creditCardNumber.val(number); - // Name - // Fills the card holder field with the parameter - creditCardName.val(name); - // Expiration - // Chooses the expiration month matching the parameter - expirationMonth.selectOption(month); - // Chooses the expiration year matching the parameter - expirationYear.selectOption(year); - // Opens the order overview page - // Clicks the Continue button - addPaymentButton.scrollTo().click(); - - return new PlaceOrderPage().isExpectedPage(); - } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java index f8e5b47f..e2583310 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java @@ -9,20 +9,20 @@ import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; +import org.apache.commons.lang3.StringUtils; + import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.Address; -import posters.dataobjects.CreditCard; -import posters.dataobjects.Product; +import posters.tests.testdata.dataobjects.Address; +import posters.tests.testdata.dataobjects.CreditCard; +import posters.tests.testdata.dataobjects.Product; import posters.pageobjects.utility.PriceHelper; -/** - * @author pfotenhauer - */ public class PlaceOrderPage extends AbstractCheckoutPage { - private SelenideElement headline = $("#titleOrderOverview"); + private SelenideElement title = $("#titleOrderOverview"); private SelenideElement shippingAddressForm = $("#shippingAddr"); @@ -32,31 +32,129 @@ public class PlaceOrderPage extends AbstractCheckoutPage private SelenideElement orderButton = $("#btnOrder"); - - @Override @Step("ensure this is a place order page") public PlaceOrderPage isExpectedPage() { super.isExpectedPage(); - headline.should(exist); + title.should(exist); return this; } + /// ----- validate place order page ----- /// + + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + + @Step("validate shipping address overview") + public void validateShippingAddressOverview(Address shippingAddress, String headline) + { + // validate headline + $$(".total-wrap h3").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + + // validate name + String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); + $("#shippingAddr").find(".name").shouldHave(exactText(fullName)).shouldBe(visible); + + // TODO - fix, change company in .json to null/empty String + // validate optional company name + if (!StringUtils.isBlank(shippingAddress.getCompany())); + { + $("#shippingAddr").find(".company").shouldHave(exactText(shippingAddress.getCompany())).shouldBe(visible); + } + + // validate address + $("#shippingAddr").find(".addressLine").shouldHave(exactText(shippingAddress.getStreet())).shouldBe(visible); + + // validate city, state, zip + $("#shippingAddr").find(".city").shouldHave(exactText(shippingAddress.getCity())).shouldBe(visible); + $("#shippingAddr").find(".state").shouldHave(exactText(shippingAddress.getState())).shouldBe(visible); + $("#shippingAddr").find(".zip").shouldHave(exactText(shippingAddress.getZip())).shouldBe(visible); + + // validate country + $("#shippingAddr").find(".country").shouldHave(exactText(shippingAddress.getCountry())).shouldBe(visible); + } + + @Step("validate billing address overview") + public void validateBillingAddressOverview(Address billingAddress, String headline) + { + // validate headline + $$(".total-wrap h3").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + + // validate name + String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); + $("#billingAddr").find(".name").shouldHave(exactText(fullName)).shouldBe(visible); + + // TODO - fix, change company in .json to null/empty String + // validate optional company name + if (!StringUtils.isBlank(billingAddress.getCompany())); + { + $("#billingAddr").find(".company").shouldHave(exactText(billingAddress.getCompany())).shouldBe(visible); + } + + // validate address + $("#billingAddr").find(".addressLine").shouldHave(exactText(billingAddress.getStreet())).shouldBe(visible); + + // validate city, state, zip + $("#billingAddr").find(".city").shouldHave(exactText(billingAddress.getCity())).shouldBe(visible); + $("#billingAddr").find(".state").shouldHave(exactText(billingAddress.getState())).shouldBe(visible); + $("#billingAddr").find(".zip").shouldHave(exactText(billingAddress.getZip())).shouldBe(visible); + + // validate country + $("#billingAddr").find(".country").shouldHave(exactText(billingAddress.getCountry())).shouldBe(visible); + } + + @Step("validate payment overview") + public void validatePaymentOverview(CreditCard creditCard, String headline) + { + // validate headline + $$(".total-wrap h3").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + + // validate name + $("#payment").find(".name").shouldHave(exactText(creditCard.getFullName())).shouldBe(visible); + + // validate censored card number + $("#payment").find(".cardNumber").shouldHave(exactText(creditCard.getCrypticCardNumber())).shouldBe(visible); + + // validate expiration date + $("#payment").find(".month").shouldHave(exactText(creditCard.getExpDateMonth())).shouldBe(visible); + $("#payment").find(".year").shouldHave(exactText(creditCard.getExpDateYear())).shouldBe(visible); + } + + @Step("validate order overview") + public void validateOrderOverview(Address shippingAddress, Address billingAddress, CreditCard creditCard) + { + // validate title + title.shouldHave(exactText(Neodymium.localizedText("PlaceOrderPage.overview.title"))).shouldBe(visible); + + // validate shipping address + validateShippingAddressOverview(shippingAddress, "PlaceOrderPage.overview.headlines.shippingAddress"); + + // validate billing address + validateBillingAddressOverview(billingAddress, "PlaceOrderPage.overview.headlines.billingAddress"); + + // validate payment + validatePaymentOverview(creditCard, "PlaceOrderPage.overview.headlines.payment"); + } + @Override @Step("validate place order page structure") public void validateStructure() { super.validateStructure(); - // Headline - // Headline is there and starts with a capital letter - headline.should(matchText("[A-Z].{3,}")); - shippingAddressForm.shouldBe(visible); - billingAddressForm.shouldBe(visible); - paymentForm.shouldBe(visible); - orderButton.shouldBe(visible); + // validate breadcrumb + validateBreadcrumb(); } + + // -------------------------------------------------------------- /** * @param product @@ -106,72 +204,6 @@ public void validateProduct(int position, String productName, int productCount, productContainer.find(".productSize").shouldHave(exactText(productSize)); } - - - @Step("validate addresses and payment on place order page") - public void validateAddressesAndPayment(Address shippingAddress, Address billingAddress, CreditCard creditcard) - { - // Shipping address - // fullName - // Makes sure the shipping address fullName matches the parameter - String firstName = shippingAddress.getFirstName(); - String lastName = shippingAddress.getLastName(); - String fullName = firstName + " " + lastName; - shippingAddressForm.find(".name").shouldHave(exactText(fullName)); - // Company - // Makes sure the shipping address company matches the parameter - shippingAddressForm.find(".company").shouldHave(exactText(shippingAddress.getCompany())); - // Address - // Makes sure the shipping address matches the parameter - shippingAddressForm.find(".addressLine").shouldHave(exactText(shippingAddress.getStreet())); - // City - // Makes sure the shipping address city matches the parameter - shippingAddressForm.find(".city").shouldHave(exactText(shippingAddress.getCity())); - // State - // Makes sure the shipping address state matches the parameter - shippingAddressForm.find(".state").shouldHave(exactText(shippingAddress.getState())); - // ZIP - // Makes sure the shipping address ZIP matches the parameter - shippingAddressForm.find(".zip").shouldHave(exactText(" " + shippingAddress.getZip())); - // Country - // Makes sure the shipping address country matches the parameter - shippingAddressForm.find(".country").shouldHave(exactText(shippingAddress.getCountry())); - // Billing address - // Name - // Makes sure the billing address name matches the parameter - billingAddressForm.find(".name").shouldHave(exactText(fullName)); - // Company - // Makes sure the billing address company matches the parameter - billingAddressForm.find(".company").shouldHave(exactText(billingAddress.getCompany())); - // Address - // Makes sure the billing address matches the parameter - billingAddressForm.find(".addressLine").shouldHave(exactText(billingAddress.getStreet())); - // City - // Makes sure the billing address city matches the parameter - billingAddressForm.find(".city").shouldHave(exactText(billingAddress.getCity())); - // State - // Makes sure the billing address state matches the parameter - billingAddressForm.find(".state").shouldHave(exactText(billingAddress.getState())); - // ZIP - // Makes sure the billing address ZIP matches the parameter - billingAddressForm.find(".zip").shouldHave(exactText(billingAddress.getZip())); - // Country - // Makes sure the billing address country matches the parameter - billingAddressForm.find(".country").shouldHave(exactText(billingAddress.getCountry())); - // Payment - // Name - // Makes sure the credit card holder matches the parameter - paymentForm.find(" .name .value").shouldHave(exactText(creditcard.getFullName())); - // Credit Card Number - // Makes sure the anonymized credit card number matches the parameter - paymentForm.find(" .cardNumber .value").shouldHave(exactText(creditcard.getCrypticCardNumber())); - // Expiration - // Makes sure the credit card expiration month matches the parameter - paymentForm.find(" .exp .month").shouldHave(exactText(creditcard.getExpDateMonth())); - // Makes sure the credit card expiration year matches the parameter - paymentForm.find(" .exp .year").shouldHave(exactText(creditcard.getExpDateYear())); - } - @Step("get order total costs from place order page") public String getTotalCosts() { diff --git a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java index d772557c..9bb3a7ce 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java @@ -12,7 +12,7 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.Address; +import posters.tests.testdata.dataobjects.Address; public class ShippingAddressPage extends AbstractCheckoutPage { @@ -128,6 +128,7 @@ public void validateStructure() /// ----- send shipping address form ----- /// + @Step("fill and send shipping address form") public BillingAddressPage sendShippingAddressForm(Address shippingAddress, boolean sameBillingAddress) { String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); diff --git a/src/test/java/posters/pageobjects/pages/user/LoginPage.java b/src/test/java/posters/pageobjects/pages/user/LoginPage.java index 3b51a8bb..c9a66141 100644 --- a/src/test/java/posters/pageobjects/pages/user/LoginPage.java +++ b/src/test/java/posters/pageobjects/pages/user/LoginPage.java @@ -11,13 +11,10 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.User; +import posters.tests.testdata.dataobjects.User; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; import posters.pageobjects.pages.browsing.HomePage; -/** - * @author pfotenhauer - */ public class LoginPage extends AbstractBrowsingPage { private SelenideElement loginForm = $("#formLogin"); diff --git a/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java b/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java index 097d57b4..22ce7f13 100644 --- a/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java +++ b/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java @@ -9,7 +9,7 @@ import com.codeborne.selenide.SelenideElement; import io.qameta.allure.Step; -import posters.dataobjects.Product; +import posters.tests.testdata.dataobjects.Product; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; public class OrderHistoryPage extends AbstractBrowsingPage diff --git a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java index 23f6fa1c..33155d13 100644 --- a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java +++ b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java @@ -10,12 +10,9 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.dataobjects.User; +import posters.tests.testdata.dataobjects.User; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; -/** - * @author pfotenhauer - */ public class RegisterPage extends AbstractBrowsingPage { diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index f2b9bbd5..781059c0 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -10,8 +10,8 @@ import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; -import posters.dataobjects.Address; -import posters.dataobjects.CreditCard; +import posters.tests.testdata.dataobjects.Address; +import posters.tests.testdata.dataobjects.CreditCard; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; @@ -45,33 +45,31 @@ public void testOrderingAsGuest() // go to product detail page, add and store displayed product var productDetailPage = categoryPage.clickProductByPosition(guestOrderTestData.getResultPosition()); productDetailPage.addToCart(guestOrderTestData.getsSizeProduct(), guestOrderTestData.getStyleProduct()); + final var product = productDetailPage.getProduct(); // go to cart page var cartPage = productDetailPage.miniCart.openCartPage(); // go to shipping address page and validate var shippingAddressPage = cartPage.openShippingAddressPage(); - shippingAddressPage.validateStructure(); + //shippingAddressPage.validateStructure(); // go to billing address page and validate var billingAddressPage = shippingAddressPage.sendShippingAddressForm(shippingAddress, sameBillingAddress); - billingAddressPage.validateStructure(); + //billingAddressPage.validateStructure(); // go to payment page and validate var paymentPage = billingAddressPage.sendBillingAddressForm(billingAddress); - paymentPage.validateStructure(); + //paymentPage.validateStructure(); + // go to place order page and validate + var placeOrderPage = paymentPage.sendPaymentForm(creditCard); + placeOrderPage.validateStructure(); + placeOrderPage.validateOrderOverview(shippingAddress, billingAddress, creditCard); + //placeOrderPage.validateProduct(product); /* - - // Send billing address and validate payment form - var newPaymentPage = newBillingAddressPage.sendBillingAddressForm(billingAddress); - newPaymentPage.validateStructure(); - - // Send payment data and validate place order page - var placeOrderPage = newPaymentPage.sendPaymentForm(creditCard); - placeOrderPage.validateStructure(); placeOrderPage.validateProduct(1, product.getName(), product.getAmount(), product.getStyle(), product.getSize()); placeOrderPage.validateAddressesAndPayment(shippingAddress, billingAddress, creditCard); diff --git a/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java b/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java index 98358ef6..2377e964 100644 --- a/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java +++ b/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java @@ -10,15 +10,11 @@ import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; -import posters.dataobjects.User; +import posters.tests.testdata.dataobjects.User; import posters.flows.DeleteUserFlow; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; -/** - * @author pfotenhauer - */ - @Owner("Lisa Smith") @Severity(SeverityLevel.NORMAL) @Tag("smoke") diff --git a/src/test/java/posters/tests/smoke/RegisterTest.java b/src/test/java/posters/tests/smoke/RegisterTest.java index 8d74e72d..0c53d2b3 100644 --- a/src/test/java/posters/tests/smoke/RegisterTest.java +++ b/src/test/java/posters/tests/smoke/RegisterTest.java @@ -12,17 +12,11 @@ import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; -import posters.dataobjects.User; +import posters.tests.testdata.dataobjects.User; import posters.flows.DeleteUserFlow; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; -/** - * The initial data base of Posters provides a default user to avoid a registration process. The used e-mail address is - * "john@doe.com". Using this user within the RegisterTest would lead to an expected error. - * - * @author pfotenhauer - */ @Owner("Lisa Smith") @Severity(SeverityLevel.CRITICAL) @Tag("smoke") diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 2db6c628..e8f92cb0 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -10,8 +10,8 @@ import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; -import posters.dataobjects.Address; -import posters.dataobjects.CreditCard; +import posters.tests.testdata.dataobjects.Address; +import posters.tests.testdata.dataobjects.CreditCard; import posters.flows.CartCleanUpFlow; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; diff --git a/src/test/java/posters/dataobjects/Address.java b/src/test/java/posters/tests/testdata/dataobjects/Address.java similarity index 95% rename from src/test/java/posters/dataobjects/Address.java rename to src/test/java/posters/tests/testdata/dataobjects/Address.java index 13905622..b3bc22e0 100644 --- a/src/test/java/posters/dataobjects/Address.java +++ b/src/test/java/posters/tests/testdata/dataobjects/Address.java @@ -1,4 +1,4 @@ -package posters.dataobjects; +package posters.tests.testdata.dataobjects; public class Address { @@ -18,6 +18,7 @@ public class Address String country; + // needed??? public Address(String firstName, String lastName, String company, String street, String city, String state, String zip, String country) { this.firstName = firstName; diff --git a/src/test/java/posters/dataobjects/CreditCard.java b/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java similarity index 97% rename from src/test/java/posters/dataobjects/CreditCard.java rename to src/test/java/posters/tests/testdata/dataobjects/CreditCard.java index 2594bb17..f95248fe 100644 --- a/src/test/java/posters/dataobjects/CreditCard.java +++ b/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java @@ -1,5 +1,4 @@ -package posters.dataobjects; - +package posters.tests.testdata.dataobjects; public class CreditCard { String fullName; diff --git a/src/test/java/posters/dataobjects/Product.java b/src/test/java/posters/tests/testdata/dataobjects/Product.java similarity index 98% rename from src/test/java/posters/dataobjects/Product.java rename to src/test/java/posters/tests/testdata/dataobjects/Product.java index 1b6abf23..cc5887ed 100644 --- a/src/test/java/posters/dataobjects/Product.java +++ b/src/test/java/posters/tests/testdata/dataobjects/Product.java @@ -1,4 +1,4 @@ -package posters.dataobjects; +package posters.tests.testdata.dataobjects; import com.xceptance.neodymium.util.Neodymium; diff --git a/src/test/java/posters/dataobjects/User.java b/src/test/java/posters/tests/testdata/dataobjects/User.java similarity index 96% rename from src/test/java/posters/dataobjects/User.java rename to src/test/java/posters/tests/testdata/dataobjects/User.java index b5e5c44a..6b94e854 100644 --- a/src/test/java/posters/dataobjects/User.java +++ b/src/test/java/posters/tests/testdata/dataobjects/User.java @@ -1,4 +1,4 @@ -package posters.dataobjects; +package posters.tests.testdata.dataobjects; public class User { diff --git a/src/test/java/posters/tests/unit/LoginTest.java b/src/test/java/posters/tests/unit/LoginTest.java index 7667e2f0..f89c7133 100644 --- a/src/test/java/posters/tests/unit/LoginTest.java +++ b/src/test/java/posters/tests/unit/LoginTest.java @@ -12,14 +12,11 @@ import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; -import posters.dataobjects.User; +import posters.tests.testdata.dataobjects.User; import posters.flows.OpenLoginPageFlow; import posters.pageobjects.pages.user.LoginPage; import posters.tests.AbstractTest; -/** - * @author pfotenhauer - */ //@Browser("Chrome_1024x768") @Browser("Firefox_1024x768") @Owner("Tim Brown") From 3cd231b828e45ff38db492b03aae7b0651c09b94 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Fri, 4 Aug 2023 15:39:30 +0200 Subject: [PATCH 20/44] finished GuestOrderTest --- config/localization.yaml | 44 +++- .../components/SuccessMessage.java | 3 - .../pages/checkout/AbstractCheckoutPage.java | 63 +++++ .../pages/checkout/BillingAddressPage.java | 79 +----- .../pageobjects/pages/checkout/CartPage.java | 47 +--- .../pages/checkout/NewBillingAddressPage.java | 158 ------------ .../pages/checkout/NewPaymentPage.java | 111 -------- .../checkout/NewShippingAddressPage.java | 175 ------------- .../pages/checkout/OrderConfirmationPage.java | 81 +++--- .../pages/checkout/PaymentPage.java | 20 +- .../pages/checkout/PlaceOrderPage.java | 238 +++++++++++------- .../pages/checkout/ShippingAddressPage.java | 91 ++----- .../pageobjects/utility/PriceHelper.java | 25 +- .../posters/tests/smoke/GuestOrderTest.java | 35 +-- .../tests/smoke/RegisteredOrderTest.java | 7 +- 15 files changed, 363 insertions(+), 814 deletions(-) delete mode 100644 src/test/java/posters/pageobjects/pages/checkout/NewBillingAddressPage.java delete mode 100644 src/test/java/posters/pageobjects/pages/checkout/NewPaymentPage.java delete mode 100644 src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java diff --git a/config/localization.yaml b/config/localization.yaml index cb95e653..b9f40ef6 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -141,6 +141,10 @@ default: shippingAddress: Shipping Address billingAddress: Billing Address payment: Payment Settings + button: Order with costs + OrderConfirmationPage: + thankYouMessage: Thank you for purchasing, Your order is complete + button: Continue Shopping AccountPages: email: Email address* firstName: First name* @@ -163,7 +167,27 @@ default: shippingAddress: SHIPPING ADDRESS / billingAddress: BILLING ADDRESS / payment: PAYMENT / - placeOrder: PLACE ORDER / + placeOrder: PLACE ORDER / + processWrap: + "1": + number: "01" + name: SHOPPING CART + "2": + number: "02" + name: SHIPPING ADDRESS + "3": + number: "03" + name: BILLING ADDRESS + "4": + number: "04" + name: PAYMENT METHOD + "5": + number: "05" + name: CHECKOUT + "6": + number: "06" + name: ORDER COMPLETE + fillIn: headlines: fullName: FULL NAME* @@ -189,7 +213,19 @@ default: button: Continue General: product: - style: style - size: size - quantity: Quantity + style: style + size: size + quantity: Quantity + priceSummary: + title: Summary + subtotal: "Subtotal:" + shipping: "Shipping:" + tax: "Tax (6.0%)" + grandTotal: Total + productTable: + products: PRODUCTS + unitPrice: UNIT PRICE + quantity: QUANTITY + totalPrice: TOTAL PRICE + \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/components/SuccessMessage.java b/src/test/java/posters/pageobjects/components/SuccessMessage.java index cd0047da..fc72f60b 100644 --- a/src/test/java/posters/pageobjects/components/SuccessMessage.java +++ b/src/test/java/posters/pageobjects/components/SuccessMessage.java @@ -21,10 +21,7 @@ public void isComponentAvailable() @Step("validate that the success message '{message}' is visible") public void validateSuccessMessage(String message) { - // Wait until javascript makes the success message visible - // Waits until javascript makes the success message visible. successMessage.shouldBe(visible); - // Makes sure the correct text is displayed. successMessage.shouldHave(exactText("× " + message)); } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java index 79921750..b69b101c 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java @@ -1,5 +1,18 @@ package posters.pageobjects.pages.checkout; +import static com.codeborne.selenide.Condition.attribute; +import static com.codeborne.selenide.Condition.exactText; +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.matchText; +import static com.codeborne.selenide.Condition.visible; +import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; + +import com.codeborne.selenide.ElementsCollection; +import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; + +import io.qameta.allure.Step; import posters.pageobjects.components.CheckoutHeader; import posters.pageobjects.components.Footer; import posters.pageobjects.components.UserMenu; @@ -22,4 +35,54 @@ public void validateStructure() footer.isComponentAvailable(); userMenu.isComponentAvailable(); } + + /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage, PlaceOrderPage ----- /// + + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + + /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage ----- /// + + @Step("validate required string") + public void validateRequiredString() + { + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + } + + /// ----- ShippingAddressPage, BillingAddressPage ----- /// + + @Step("validate fill-in form headlines") + public void validateFillInHeadlines() + { + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.fullName"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.company"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.address"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.city"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.state"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.zip"))); + //$$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.country"))); + } + + @Step("validate fill-in form placeholder") + public void validateFillInPlaceholder() + { + $("#fullName").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.yourName")))).shouldBe(visible); + $("#company").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.companyName")))).shouldBe(visible); + $("#addressLine").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.address")))).shouldBe(visible); + $("#zip").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.zip")))).shouldBe(visible); + } + + @Step("validate country dropdown") + public void validateCountryDropdown() + { + $("#country").shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.usa"))).should(exist); + $("#country").shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.germany"))).should(exist); + } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java index 55a5c7bf..9fd30b3e 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java @@ -1,12 +1,9 @@ package posters.pageobjects.pages.checkout; -import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -18,20 +15,6 @@ public class BillingAddressPage extends AbstractCheckoutPage { private SelenideElement headline = $("#titleBillAddr"); - private SelenideElement nameField = $("#fullName"); - - private SelenideElement companyField = $("#company"); - - private SelenideElement addressField = $("#addressLine"); - - private SelenideElement cityField = $("#city"); - - private SelenideElement stateField = $("#state"); - - private SelenideElement zipField = $("#zip"); - - private SelenideElement countryField = $("#country"); - private SelenideElement addBillingButton = $("#btnAddBillAddr"); @Override @@ -42,51 +25,7 @@ public BillingAddressPage isExpectedPage() return this; } - /// ----- validate shipping address page ----- /// - - @Step("validate breadcrumb") - public void validateBreadcrumb() - { - $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); - $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); - $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); - $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); - $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); - } - - @Step("validate fill-in form headlines") - public void validateFillInHeadlines(String headline) - { - $$(".form-group").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); - } - - @Step("validate fill-in form headlines") - public void validateFillInHeadlines() - { - validateFillInHeadlines("AddressPages.fillIn.headlines.fullName"); - validateFillInHeadlines("AddressPages.fillIn.headlines.company"); - validateFillInHeadlines("AddressPages.fillIn.headlines.address"); - validateFillInHeadlines("AddressPages.fillIn.headlines.city"); - validateFillInHeadlines("AddressPages.fillIn.headlines.state"); - validateFillInHeadlines("AddressPages.fillIn.headlines.zip"); - // validateFillInHeadlines("AddressPages.fillIn.headlines.country"); - } - - @Step("validate fill-in form placeholder") - public void validateFillInPlaceholder() - { - nameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.yourName")))).shouldBe(visible); - companyField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.companyName")))).shouldBe(visible); - addressField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.address")))).shouldBe(visible); - zipField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.zip")))).shouldBe(visible); - } - - @Step("validate country dropdown") - public void validateCountryDropdown() - { - countryField.shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.usa"))).should(exist); - countryField.shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.germany"))).should(exist); - } + /// ----- validate billing address page ----- /// @Override @Step("validate shipping address page structure") @@ -108,7 +47,7 @@ public void validateStructure() validateCountryDropdown(); // validate "required fields" string - $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + validateRequiredString(); // validate continue button addBillingButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.button"))).shouldBe(visible); @@ -131,13 +70,13 @@ public PaymentPage sendBillingAddressForm(String name, String company, String ad String state, String zip, String country) { // enter parameters - nameField.val(name); - companyField.val(company); - addressField.val(address); - cityField.val(city); - stateField.val(state); - zipField.val(zip); - countryField.selectOption(country); + $("#fullName").val(name); + $("#company").val(company); + $("#addressLine").val(address); + $("#city").val(city); + $("#state").val(state); + $("#zip").val(zip); + $("#country").selectOption(country); // click on "Continue" button addBillingButton.scrollTo().click(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index cd212911..9bb84b2e 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -94,7 +94,7 @@ public void validate(String shippingCosts, String subtotal) } @Step("validate sub total and line item total after adding on the cart page") - public void validateTotalAfterAdd(int position, String oldSubTotal, double totalPrice) + public void validateTotalAfterAdd(int position, String oldSubTotal, double oldTotalProductPrice) { /// ----- validate total unit price of specified product ----- /// @@ -107,40 +107,35 @@ public void validateTotalAfterAdd(int position, String oldSubTotal, double total String quantity = $("#productCount" + (position - 1)).val(); // calculate price of specified product - String subOrderPrice = PriceHelper.computeRowPrice(unitPrice, quantity); + String newTotalProductPrice = PriceHelper.totalProductPrice(unitPrice, quantity); // verify calculated unit price equals the displayed total unit price - productContainer.find(".productTotalUnitPrice").shouldHave(exactText(subOrderPrice)); + productContainer.find(".productTotalUnitPrice").shouldHave(exactText(newTotalProductPrice)); /// ----- validate sub total ----- /// String newSubTotal = subTotal.text(); // new total - old total = price of item you just added - String productPrice = PriceHelper.subtractFromPrice(newSubTotal, oldSubTotal); + String productPrice = PriceHelper.substract(newSubTotal, oldSubTotal); // price difference for specific product after changing product amount - String productPriceAmountChange = PriceHelper.subtractFromPrice(subOrderPrice, PriceHelper.format(totalPrice)); + String totalProductPriceChange = PriceHelper.substract(newTotalProductPrice, PriceHelper.format(oldTotalProductPrice)); // validate {price} equals {price2} - Assert.assertEquals(productPrice, productPriceAmountChange); + Assert.assertEquals(productPrice, totalProductPriceChange); } @Step("validate sub total and line item total after removing on the cart page") - public void validateTotalAfterRemove(String oldSubTotal, String oldLineItemTotal) + public void validateTotalAfterRemove(String oldSubTotal, String oldTotalProductPrice) { - String newSubTotal = PriceHelper.subtractFromPrice(oldSubTotal, oldLineItemTotal); + String newSubTotal = PriceHelper.substract(oldSubTotal, oldTotalProductPrice); subTotal.shouldHave(exactText(newSubTotal)); } - /// ----- validate product in cart item ----- /// - - @Step("validate item amount on the cart page") - public void validateProductAmount(int position, int amount) - { - $("#product" + (position - 1) + " .productCount").shouldHave(exactValue(Integer.toString(amount))); - } + /// ----- validate product in cart ----- /// + @Step("validate '{product}' on the cart page") private void validateCartItem(int position, String productName, String productStyle, String productSize, int productAmount, String productPrice) { // selector for product @@ -149,24 +144,16 @@ private void validateCartItem(int position, String productName, String productSt // validate product image productContainer.find(".product-img").shouldBe(visible); - // validate product name is same as {productName} + // validate parameters productContainer.find(".productName").shouldHave(exactText(productName)); - - // validate product style is same as {productStyle} productContainer.find(".productStyle").shouldHave(exactText(productStyle)); - - // validate product size is same as {productSize} productContainer.find(".productSize").shouldHave(exactText(productSize)); - - // validate product amount is same as {productAmount} - validateProductAmount(position, productAmount); + productContainer.find(".productUnitPrice").shouldHave(exactText(productPrice)); + productContainer.find(".productCount").shouldHave(exactValue(Integer.toString(productAmount))); // validate remove and update button $("#btnRemoveProdCount" + (position - 1)).shouldBe(visible); $("#btnUpdateProdCount" + (position - 1)).shouldBe(visible); - - // validate product name is same as {productName} - productContainer.find(".productUnitPrice").shouldHave(exactText(productPrice)); } @Step("validate '{product}' on the cart page") @@ -330,14 +317,6 @@ private void clickCheckoutButton() $("#btnStartCheckout").scrollTo().click(); } - // needed??? - @Step("open new shipping address from the cart page") - public NewShippingAddressPage openNewShippingPage() - { - clickCheckoutButton(); - return new NewShippingAddressPage().isExpectedPage(); - } - @Step("check if there are product on the cart page") public boolean hasProductsInCart() { diff --git a/src/test/java/posters/pageobjects/pages/checkout/NewBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/NewBillingAddressPage.java deleted file mode 100644 index b36f401d..00000000 --- a/src/test/java/posters/pageobjects/pages/checkout/NewBillingAddressPage.java +++ /dev/null @@ -1,158 +0,0 @@ -package posters.pageobjects.pages.checkout; - -import static com.codeborne.selenide.Condition.exactText; -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -import com.codeborne.selenide.SelenideElement; -import com.xceptance.neodymium.util.Neodymium; - -import io.qameta.allure.Step; -import posters.tests.testdata.dataobjects.Address; - -public class NewBillingAddressPage extends AbstractCheckoutPage -{ - private SelenideElement headline = $("#titleBillAddr"); - - private SelenideElement nameField = $("#fullName"); - - private SelenideElement companyField = $("#company"); - - private SelenideElement addressField = $("#addressLine"); - - private SelenideElement cityField = $("#city"); - - private SelenideElement stateField = $("#state"); - - private SelenideElement zipField = $("#zip"); - - private SelenideElement countryField = $("#country"); - - private SelenideElement addBillingButton = $("#btnAddBillAddr"); - - @Override - @Step("ensure this is a new billing address page") - public NewBillingAddressPage isExpectedPage() - { - super.isExpectedPage(); - headline.should(exist); - return this; - } - - @Override - @Step("validate new billing address page structure") - public void validateStructure() - { - super.validateStructure(); - - // Headline - // Assert the headline is there and starts with a capital letter - headline.should(matchText("[A-Z].{3,}")); - // Form - // Asserts the form is there at all - $("#formAddBillAddr").shouldBe(visible); - // Name - // Asserts the label next to the name field shows the right text - $("label[for='fullName']").shouldHave(exactText(Neodymium.localizedText("General.addresses.fullname"))); - // Asserts the name field is there - nameField.shouldBe(visible); - // Company - // Asserts the label next to the company field shows the right text - $("label[for='companyname']").shouldHave(exactText(Neodymium.localizedText("General.addresses.company"))); - // Asserts the company field is there - companyField.shouldBe(visible); - // Address - // Asserts the label next to the address field shows the right text - $("label[for='addressLine']").shouldHave(exactText(Neodymium.localizedText("General.addresses.address"))); - // Asserts the address field is there - addressField.shouldBe(visible); - // City - // Asserts the label next to the city field shows the right text - $("label[for='city']").shouldHave(exactText(Neodymium.localizedText("General.addresses.city"))); - // Asserts the city field is there - cityField.shouldBe(visible); - // State - // Asserts the label next to the state field shows the right text - $("label[for='state']").shouldHave(exactText(Neodymium.localizedText("General.addresses.state"))); - // Asserts the state field is there - stateField.shouldBe(visible); - // Zip - // Asserts the label next to the zip field shows the right text - $("label[for='zip']").shouldHave(exactText(Neodymium.localizedText("General.addresses.zip"))); - // Asserts the zip field is there - zipField.shouldBe(visible); - // Country - // Asserts the label next to the country field shows the right text - $("label[for='country']").shouldHave(exactText(Neodymium.localizedText("General.addresses.country"))); - // Asserts the country field is there - countryField.shouldBe(visible); - // Continue Button - // Asserts the Continue button is there - addBillingButton.shouldBe(visible); - } - - /** - * // - * - * @param name - * First and last name you want to use // T - * @param company - * The company you want to use - * @param address - * The address you want to use - * @param city - * The City you want to use - * @param state - * The state you want to use - * @param zip - * The Zip you want to use, has to be in numbers format - * @param country - * The country you want to use, currently only United States or Germany - */ - @Step("fill and send new billing address form") - public NewPaymentPage sendBillingAddressForm(String name, String company, String address, String city, - String state, String zip, String country) - { - // Name - // Enter the name parameter - nameField.val(name); - // Company - // Enter the company parameter - companyField.val(company); - // Address - // Enter the address parameter - addressField.val(address); - // City - // Enter the city parameter - cityField.val(city); - // State - // Enter the state parameter - stateField.val(state); - // Zip - // Enter the zip parameter - zipField.val(zip); - // Country - // Select the country whose label equals the parameter - countryField.selectOption(country); - // Open the billing addresses or payment options page, depending on which radio button you checked - // Click on Continue - addBillingButton.scrollTo().click(); - - return new NewPaymentPage().isExpectedPage(); - } - - /** - * @param billingAddress - * @return - */ - public NewPaymentPage sendBillingAddressForm(Address billingAddress) - { - String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); - - return sendBillingAddressForm(fullName, billingAddress.getCompany(), billingAddress.getStreet(), - billingAddress.getCity(), billingAddress.getState(), billingAddress.getZip(), - billingAddress.getCountry()); - } -} diff --git a/src/test/java/posters/pageobjects/pages/checkout/NewPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/NewPaymentPage.java deleted file mode 100644 index 859f9d91..00000000 --- a/src/test/java/posters/pageobjects/pages/checkout/NewPaymentPage.java +++ /dev/null @@ -1,111 +0,0 @@ -package posters.pageobjects.pages.checkout; - -import static com.codeborne.selenide.Condition.exactText; -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; - -import com.codeborne.selenide.SelenideElement; -import com.xceptance.neodymium.util.Neodymium; - -import io.qameta.allure.Step; -import posters.tests.testdata.dataobjects.CreditCard; - -public class NewPaymentPage extends AbstractCheckoutPage -{ - private SelenideElement headline = $("#titlePayment"); - - private SelenideElement creditCardNumber = $("#creditCardNumber"); - - private SelenideElement creditCardName = $("#name"); - - private SelenideElement expirationMonth = $("#expirationDateMonth"); - - private SelenideElement expirationYear = $("#expirationDateYear"); - - private SelenideElement addPaymentButton = $("#btnAddPayment"); - - @Override - @Step("ensure this is a new payment page") - public NewPaymentPage isExpectedPage() - { - super.isExpectedPage(); - headline.should(exist); - return this; - } - - @Override - @Step("validate new payment page structure") - public void validateStructure() - { - super.validateStructure(); - - // Headline - // Makes sure the headline is there and starts with a capital letter - headline.should(matchText("[A-Z].{3,}")); - // Form - // Make sure the form is there to begin with - $("#formAddPayment").should(exist); - // Credit Card Number - // Makes sure the label next to the card number field shows the correct text - $("label[for='creditCardNumber']").shouldHave(exactText(Neodymium.localizedText("General.payment.cardnumber"))); - // Makes sure the card number field is there - creditCardNumber.shouldBe(visible); - // Name - // Makes sure the label next to the card holder field shows the correct text - $("label[for='name']").shouldHave(exactText(Neodymium.localizedText("General.payment.cardholdername"))); - // Makes sure the card holder field is there - creditCardName.shouldBe(visible); - // Expiration - // Makes sure the label next to the expiration date fields shows the correct text - $("label[for='expirationDateMonth']").shouldHave(exactText(Neodymium.localizedText("General.payment.expirationdate"))); - // Makes sure the expiration month field is there - expirationMonth.shouldBe(visible); - // Makes sure the expiration year field is there - expirationYear.shouldBe(visible); - // Continue Button - // Makes sure the continue button is there - addPaymentButton.should(exist); - } - - /** - * @param number - * The credit card number, has to be 16 numbers - * @param name - * The full name - * @param month - * Expiration Month in numbers - * @param year - * Expiration year - */ - @Step("fill and send new payment form") - public PlaceOrderPage sendPaymentForm(String number, String name, String month, String year) - { - // Credit Card Number - // Fills the card number field with the parameter - creditCardNumber.val(number); - // Name - // Fills the card holder field with the parameter - creditCardName.val(name); - // Expiration - // Chooses the expiration month matching the parameter - expirationMonth.selectOption(month); - // Chooses the expiration year matching the parameter - expirationYear.selectOption(year); - // Opens the order overview page - // Clicks the Continue button - addPaymentButton.scrollTo().click(); - - return new PlaceOrderPage().isExpectedPage(); - } - - /** - * @param creditcard - * @return - */ - public PlaceOrderPage sendPaymentForm(CreditCard creditcard) - { - return sendPaymentForm(creditcard.getCardNumber(), creditcard.getFullName(), creditcard.getExpDateMonth(), creditcard.getExpDateYear()); - } -} diff --git a/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java deleted file mode 100644 index ea1b8819..00000000 --- a/src/test/java/posters/pageobjects/pages/checkout/NewShippingAddressPage.java +++ /dev/null @@ -1,175 +0,0 @@ -package posters.pageobjects.pages.checkout; - -import static com.codeborne.selenide.Condition.exactText; -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -import com.codeborne.selenide.SelenideElement; -import com.xceptance.neodymium.util.Neodymium; - -import io.qameta.allure.Step; -import posters.tests.testdata.dataobjects.Address; - -public class NewShippingAddressPage extends AbstractCheckoutPage -{ - private SelenideElement headline = $("#titleDelAddr"); - - private SelenideElement nameField = $("#fullName"); - - private SelenideElement companyField = $("#company"); - - private SelenideElement addressField = $("#addressLine"); - - private SelenideElement cityField = $("#city"); - - private SelenideElement stateField = $("#state"); - - private SelenideElement zipField = $("#zip"); - - private SelenideElement countryField = $("#country"); - - private SelenideElement addShippingButton = $("#btnAddDelAddr"); - - @Override - @Step("ensure this is a new shipping address page") - public NewShippingAddressPage isExpectedPage() - { - super.isExpectedPage(); - headline.should(exist); - return this; - } - - @Override - @Step("validate new shipping address page structure") - public void validateStructure() - { - super.validateStructure(); - - // Headline - // Assert the headline is there and starts with a capital letter - headline.should(matchText("[A-Z].{3,}")); - // Form - // Asserts the form is there at all - $("#formAddDelAddr").shouldBe(visible); - // Name - // Asserts the label next to the name field shows the right text - $("label[for='fullName']").shouldHave(exactText(Neodymium.localizedText("General.addresses.fullname"))); - // Asserts the name field is there - nameField.shouldBe(visible); - // Company - // Asserts the label next to the company field shows the right text - $("label[for='companyname']").shouldHave(exactText(Neodymium.localizedText("General.addresses.company"))); - // Asserts the company field is there - companyField.shouldBe(visible); - // Address - // Asserts the label next to the address field shows the right text - $("label[for='addressLine']").shouldHave(exactText(Neodymium.localizedText("General.addresses.address"))); - // Asserts the address field is there - addressField.shouldBe(visible); - // City - // Asserts the label next to the city field shows the right text - $("label[for='city']").shouldHave(exactText(Neodymium.localizedText("General.addresses.city"))); - // Asserts the city field is there - cityField.shouldBe(visible); - // State - // Asserts the label next to the state field shows the right text - $("label[for='state']").shouldHave(exactText(Neodymium.localizedText("General.addresses.state"))); - // Asserts the state field is there - stateField.shouldBe(visible); - // Zip - // Asserts the label next to the zip field shows the right text - $("label[for='zip']").shouldHave(exactText(Neodymium.localizedText("General.addresses.zip"))); - // Asserts the zip field is there - zipField.shouldBe(visible); - // Country - // Asserts the label next to the country field shows the right text - $("label[for='country']").shouldHave(exactText(Neodymium.localizedText("General.addresses.country"))); - // Asserts the country field is there - countryField.shouldBe(visible); - // Radio Button - // Assert the radio buttons are there - $$("input[name='billEqualShipp']").shouldHaveSize(2); - // Continue Button - // Asserts the Continue button is there - addShippingButton.shouldBe(visible); - } - - /** - * // - * - * @param name - * First and last name you want to use // T - * @param company - * The company you want to use - * @param address - * The address you want to use - * @param city - * The City you want to use - * @param state - * The state you want to use - * @param zip - * The Zip you want to use, has to be in numbers format - * @param country - * The country you want to use, currently only United States or Germany - * @param sameBillingAddress - * Decision whether or not use the same billing address - */ - @Step("fill and send new shipping address form") - public NewBillingAddressPage sendShippingAddressForm(String name, String company, String address, String city, - String state, String zip, String country, boolean sameBillingAddress) - { - // Name - // Enter the name parameter - nameField.val(name); - // Company - // Enter the company parameter - companyField.val(company); - // Address - // Enter the address parameter - addressField.val(address); - // City - // Enter the city parameter - cityField.val(city); - // State - // Enter the state parameter - stateField.val(state); - // Zip - // Enter the zip parameter - zipField.val(zip); - // Country - // Select the country whose label equals the parameter - countryField.selectOption(country); - // Radio Button - // Click the radio button for Yes or No - if (sameBillingAddress) - { - $("#billEqualShipp-Yes").scrollTo().click(); - } - else - { - $("#billEqualShipp-No").scrollTo().click(); - } - // Open the billing addresses or payment options page, depending on which radio button you checked - // Click on Continue - addShippingButton.scrollTo().click(); - - return new NewBillingAddressPage().isExpectedPage(); - } - - /** - * @param shippingAddress - * @param sameBillingAddress - * @return - */ - public NewBillingAddressPage sendShippingAddressForm(Address shippingAddress, boolean sameBillingAddress) - { - String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); - - return sendShippingAddressForm(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), - shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), - shippingAddress.getCountry(), sameBillingAddress); - } -} diff --git a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java index ef7270ae..f63f5920 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java @@ -1,10 +1,9 @@ package posters.pageobjects.pages.checkout; -import static com.codeborne.selenide.CollectionCondition.sizeGreaterThan; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -17,7 +16,6 @@ public class OrderConfirmationPage extends AbstractBrowsingPage{ private SelenideElement homePageButton = $("#goHome"); - @Step("ensure this is the Order Confirmation page") public OrderConfirmationPage isExpectedPage() { @@ -26,63 +24,56 @@ public OrderConfirmationPage isExpectedPage() return this; } + /// ----- validate order confirmation page ----- /// + + @Step("validate process wrap") + public void validateProcessWrap() + { + // validate process numbers + $("#crt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.number"))).shouldBe(visible); + $("#ship span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.number"))).shouldBe(visible); + $("#bill span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.number"))).shouldBe(visible); + $("#payment span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.number"))).shouldBe(visible); + $("#chkout span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.number"))).shouldBe(visible); + $("#orderCmplt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.number"))).shouldBe(visible); + + // validate process names + $("#crt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.name"))).shouldBe(visible); + $("#ship h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.name"))).shouldBe(visible); + $("#bill h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.name"))).shouldBe(visible); + $("#payment h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.name"))).shouldBe(visible); + $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); + $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); + } + public void validateStructure() { super.validateStructure(); - - - // Verifies the Navigation bar is visible - $("#categoryMenu .navi").shouldBe(visible); - - // Asserts there's categories in the nav bar. - $$("#categoryMenu .has-dropdown").shouldHave(sizeGreaterThan(0)); - - // Asserts the first headline is there. - // $("#titleIndex").shouldBe(matchText("[A-Z].{3,}")); + // validate success message + successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulOrder")); - // Verifies the Process chain is there. - $(".process-wrap").shouldBe(visible); + // validate process wrap + validateProcessWrap(); - // Asserts the Confirmation Check is there. - $(".confirmation #cnfmCheck").shouldBe(visible); + // validate check icon + $(".icon-check").shouldBe(visible); - // Verifies the Thank you text is visible - $("#tYouText").shouldBe(visible); + // validate thank you message + $("#tYouText").shouldHave(exactText(Neodymium.localizedText("OrderConfirmationPage.thankYouMessage"))).shouldBe(visible); // Verifies GoTo HomePage button is visible - $("#goHome").shouldBe(visible); - - + $("#goHome .icon-shopping-cart").shouldBe(visible); + $("#goHome").shouldHave(exactText(Neodymium.localizedText("OrderConfirmationPage.button"))).shouldBe(visible); } - @Step("validate Order Confirmation page") - public void validate() - { - validateStructure(); - footer.validateStructure(); - } - - @Step("validate successful order on Confirmation page") - public void validateSuccessfulOrder() - { - successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulOrder")); - // Verify that the mini cart is empty again - miniCart.validateTotalCount(0); - miniCart.validateSubtotal("$0.00"); - } + /// ----- order confirmation page navigation ----- /// - public HomePage goHome() + @Step("go to homepage") + public HomePage openHomePage() { - - // Clicks the Continue Shopping button on the Order Confirmation page homePageButton.scrollTo().click(); return new HomePage().isExpectedPage(); - } - - - - } diff --git a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java index 50e0121f..566fc578 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java @@ -41,16 +41,6 @@ public PaymentPage isExpectedPage() } /// ----- validate payment page ----- /// - - @Step("validate breadcrumb") - public void validateBreadcrumb() - { - $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); - $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); - $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); - $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); - $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); - } @Step("validate fill-in form headlines") public void validateFillInHeadlines(String headline) @@ -85,7 +75,7 @@ public void validateMonthDropdown(String month) public void validateMonthDropdown() { // open dropdown - $("#expirationDateMonth").scrollTo().click(); + expirationMonth.scrollTo().click(); // validate months validateMonthDropdown("PaymentPage.fillIn.expireMonth.january"); @@ -112,7 +102,7 @@ public void validateYearDropdown(String year) public void validateYearDropdown() { // open dropdown - $("#expirationDateYear").scrollTo().click(); + expirationYear.scrollTo().click(); // validate years validateYearDropdown("PaymentPage.fillIn.expireYear.2023"); @@ -149,6 +139,12 @@ public void validateStructure() // validate year dropdown validateYearDropdown(); + + // validate "required fields" string + validateRequiredString(); + + // validate continue button + addPaymentButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.button"))).shouldBe(visible); } /// ----- send payment form ----- /// diff --git a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java index e2583310..e0917467 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java @@ -1,6 +1,7 @@ package posters.pageobjects.pages.checkout; import static com.codeborne.selenide.Condition.exactText; +import static com.codeborne.selenide.Condition.exactValue; import static com.codeborne.selenide.Condition.value; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; @@ -11,6 +12,8 @@ import org.apache.commons.lang3.StringUtils; +import com.codeborne.selenide.ElementsCollection; +import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -23,12 +26,18 @@ public class PlaceOrderPage extends AbstractCheckoutPage { private SelenideElement title = $("#titleOrderOverview"); + + private ElementsCollection headlines = $$(".total-wrap h3"); + + private ElementsCollection tableHead = $$(".product-name span"); private SelenideElement shippingAddressForm = $("#shippingAddr"); private SelenideElement billingAddressForm = $("#billingAddr"); private SelenideElement paymentForm = $("#payment"); + + private ElementsCollection totalProductPrices = $$(".totalUnitPriceShort"); private SelenideElement orderButton = $("#btnOrder"); @@ -41,91 +50,108 @@ public PlaceOrderPage isExpectedPage() return this; } - /// ----- validate place order page ----- /// - - @Step("validate breadcrumb") - public void validateBreadcrumb() + /// ----- validate structure ----- /// + + @Step("validate product table head") + public void validateTableHead() + { + tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.products"))).shouldBe(visible); + tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.unitPrice"))).shouldBe(visible); + tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.quantity"))).shouldBe(visible); + tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.totalPrice"))).shouldBe(visible); + } + + @Override + @Step("validate place order page structure") + public void validateStructure() { - $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); - $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); - $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); - $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); - $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + super.validateStructure(); + + // validate breadcrumb + validateBreadcrumb(); + + // validate product table head + validateTableHead(); + + // validate order with costs button + $("#btnOrder").shouldHave(exactText(Neodymium.localizedText("PlaceOrderPage.button"))).shouldBe(visible); } + /// ----- validate order overview ----- /// + @Step("validate shipping address overview") public void validateShippingAddressOverview(Address shippingAddress, String headline) { // validate headline - $$(".total-wrap h3").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + headlines.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); // validate name String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); - $("#shippingAddr").find(".name").shouldHave(exactText(fullName)).shouldBe(visible); + shippingAddressForm.find(".name").shouldHave(exactText(fullName)).shouldBe(visible); - // TODO - fix, change company in .json to null/empty String + // TODO - fix, so it also works for empty string/ null // validate optional company name if (!StringUtils.isBlank(shippingAddress.getCompany())); { - $("#shippingAddr").find(".company").shouldHave(exactText(shippingAddress.getCompany())).shouldBe(visible); + shippingAddressForm.find(".company").shouldHave(exactText(shippingAddress.getCompany())).shouldBe(visible); } // validate address - $("#shippingAddr").find(".addressLine").shouldHave(exactText(shippingAddress.getStreet())).shouldBe(visible); + shippingAddressForm.find(".addressLine").shouldHave(exactText(shippingAddress.getStreet())).shouldBe(visible); // validate city, state, zip - $("#shippingAddr").find(".city").shouldHave(exactText(shippingAddress.getCity())).shouldBe(visible); - $("#shippingAddr").find(".state").shouldHave(exactText(shippingAddress.getState())).shouldBe(visible); - $("#shippingAddr").find(".zip").shouldHave(exactText(shippingAddress.getZip())).shouldBe(visible); + shippingAddressForm.find(".city").shouldHave(exactText(shippingAddress.getCity())).shouldBe(visible); + shippingAddressForm.find(".state").shouldHave(exactText(shippingAddress.getState())).shouldBe(visible); + shippingAddressForm.find(".zip").shouldHave(exactText(shippingAddress.getZip())).shouldBe(visible); // validate country - $("#shippingAddr").find(".country").shouldHave(exactText(shippingAddress.getCountry())).shouldBe(visible); + shippingAddressForm.find(".country").shouldHave(exactText(shippingAddress.getCountry())).shouldBe(visible); } @Step("validate billing address overview") public void validateBillingAddressOverview(Address billingAddress, String headline) { // validate headline - $$(".total-wrap h3").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + headlines.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); // validate name String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); - $("#billingAddr").find(".name").shouldHave(exactText(fullName)).shouldBe(visible); + billingAddressForm.find(".name").shouldHave(exactText(fullName)).shouldBe(visible); - // TODO - fix, change company in .json to null/empty String + // TODO - fix, so it also works for empty string/ null // validate optional company name if (!StringUtils.isBlank(billingAddress.getCompany())); { - $("#billingAddr").find(".company").shouldHave(exactText(billingAddress.getCompany())).shouldBe(visible); + billingAddressForm.find(".company").shouldHave(exactText(billingAddress.getCompany())).shouldBe(visible); } // validate address - $("#billingAddr").find(".addressLine").shouldHave(exactText(billingAddress.getStreet())).shouldBe(visible); + billingAddressForm.find(".addressLine").shouldHave(exactText(billingAddress.getStreet())).shouldBe(visible); // validate city, state, zip - $("#billingAddr").find(".city").shouldHave(exactText(billingAddress.getCity())).shouldBe(visible); - $("#billingAddr").find(".state").shouldHave(exactText(billingAddress.getState())).shouldBe(visible); - $("#billingAddr").find(".zip").shouldHave(exactText(billingAddress.getZip())).shouldBe(visible); + billingAddressForm.find(".city").shouldHave(exactText(billingAddress.getCity())).shouldBe(visible); + billingAddressForm.find(".state").shouldHave(exactText(billingAddress.getState())).shouldBe(visible); + billingAddressForm.find(".zip").shouldHave(exactText(billingAddress.getZip())).shouldBe(visible); // validate country - $("#billingAddr").find(".country").shouldHave(exactText(billingAddress.getCountry())).shouldBe(visible); + billingAddressForm.find(".country").shouldHave(exactText(billingAddress.getCountry())).shouldBe(visible); } @Step("validate payment overview") public void validatePaymentOverview(CreditCard creditCard, String headline) { // validate headline - $$(".total-wrap h3").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + headlines.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); // validate name - $("#payment").find(".name").shouldHave(exactText(creditCard.getFullName())).shouldBe(visible); + paymentForm.find(".name").shouldHave(exactText(creditCard.getFullName())).shouldBe(visible); // validate censored card number - $("#payment").find(".cardNumber").shouldHave(exactText(creditCard.getCrypticCardNumber())).shouldBe(visible); + paymentForm.find(".cardNumber").shouldHave(exactText(creditCard.getCrypticCardNumber())).shouldBe(visible); // validate expiration date - $("#payment").find(".month").shouldHave(exactText(creditCard.getExpDateMonth())).shouldBe(visible); - $("#payment").find(".year").shouldHave(exactText(creditCard.getExpDateYear())).shouldBe(visible); + paymentForm.find(".month").shouldHave(exactText(creditCard.getExpDateMonth())).shouldBe(visible); + paymentForm.find(".year").shouldHave(exactText(creditCard.getExpDateYear())).shouldBe(visible); } @Step("validate order overview") @@ -144,84 +170,116 @@ public void validateOrderOverview(Address shippingAddress, Address billingAddres validatePaymentOverview(creditCard, "PlaceOrderPage.overview.headlines.payment"); } - @Override - @Step("validate place order page structure") - public void validateStructure() + /// ----- validate products ----- /// + + @Step("validate '{product}' on the place order page") + private void validateProduct(int position, String productName, String productStyle, String productSize, int productAmount, String productPrice) { - super.validateStructure(); + // selector for product + SelenideElement productContainer = $("#product" + (position - 1)); - // validate breadcrumb - validateBreadcrumb(); + // validate product image + productContainer.find(".product-img").shouldBe(visible); + + // validate parameters + productContainer.find(".pName").shouldHave(exactText(productName)); + productContainer.find(".productStyle").shouldHave(exactText(productStyle)); + productContainer.find(".productSize").shouldHave(exactText(productSize)); + // TODO - fix to TA doesn'T break + //productContainer.find(".productUnitPrice").shouldHave(value(productPrice)); + productContainer.find(".productCount").shouldHave(exactValue(Integer.toString(productAmount))); } - // -------------------------------------------------------------- - - /** - * @param product - * The product - */ - @Step("validate order contains product '{product.name}'") - public void validateContainsProduct(Product product) + @Step("validate '{product}' on the place order page") + public void validateProduct(int position, Product product) { - SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() - .parent().parent(); - - productContainer.find(".pName").shouldHave(exactText(product.getName())); - productContainer.find(".pSize").shouldHave(exactText(product.getSize())); - productContainer.find(".pStyle").shouldHave(exactText(product.getStyle())); - productContainer.find(".pCount").shouldHave(exactText(Integer.toString(product.getAmount()))); - productContainer.find(".pPrice").shouldHave(exactText(product.getUnitPrice())); - productContainer.find(".productLineItemPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); + validateProduct(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), product.getUnitPrice()); } - - @Step("validate subtotal on the place order page") - public void validateSubtotal(String subtotal) + + /// ----- get price summary information ----- /// + + @Step("get sum of all total product prices") + public String getSubtotal() { - $$("#checkoutSummaryList li").findBy(text("Subtotal")).find(".text-right").shouldBe(exactText(subtotal)); + return $("#SubTotalValue").text(); } - - @Step("validate product '{productName}' on place order page") - public void validateProduct(int position, String productName, int productCount, String productStyle, String productSize) + + @Step("get tax costs") + public String getTax() { - final int index = position - 1; - // Item info evaluation - // The product at index @{index} exists - SelenideElement productContainer = $("#checkoutOverviewTable #product" + index); - productContainer.should(exist); - // Name - // The name equals the parameter - productContainer.find(".pName").shouldHave(exactText(productName)); - // Amount - // The amount equals the parameter - //String Val = productContainer.find(".productCount").getAttribute("value"); - - productContainer.find(".productCount").shouldHave(value(Integer.toString(productCount))); - // Style - // The style equals the parameter - productContainer.find(".productStyle").shouldHave(exactText(productStyle)); - // Size - // The size equals the parameter - productContainer.find(".productSize").shouldHave(exactText(productSize)); + return $("#SubTotalTaxValue").text(); } + + /// ----- validate price summary ----- /// + + @Step("calculate sum of all total product prices") + public String calculateSubtotal() + { + double subtotal = 0; + + for (SelenideElement totalProductPrice : totalProductPrices) + { + subtotal = PriceHelper.calculateSubtotal(subtotal, totalProductPrice.getText()); + } - @Step("get order total costs from place order page") - public String getTotalCosts() + return PriceHelper.format(subtotal); + } + + @Step("validate description strings") + public void validateDescriptionStrings() { - return $("#totalCosts").text(); + $$(".sub p").findBy(matchText(Neodymium.localizedText("General.priceSummary.subtotal"))).shouldBe(visible); + $$(".sub p").findBy(text(Neodymium.localizedText("General.priceSummary.shipping"))).shouldBe(visible); + $$(".sub p").findBy(text(Neodymium.localizedText("General.priceSummary.tax"))).shouldBe(visible); + $$(".grand-total p").findBy(text(Neodymium.localizedText("General.priceSummary.grandTotal"))).shouldBe(visible); } - + + @Step("validate price summary") + public void validatePriceSummary(String subtotal, String shippingCosts) + { + // validate title + $$(".sub").findBy(text(Neodymium.localizedText("General.priceSummary.title"))).shouldBe(visible); + + // validate descriptions + validateDescriptionStrings(); + + // validate subtotal + $("#SubTotalValue").shouldHave(exactText(calculateSubtotal())); + + // validate shipping costs + $("#shippingCosts").shouldHave(exactText(shippingCosts)); + + // validate tax + $("#SubTotalTaxValue").shouldHave(exactText(PriceHelper.calculateTax(shippingCosts, subtotal))); + + // validate grand total + $("#orderTotal").shouldHave(exactText(PriceHelper.calculateGrandTotal(subtotal, shippingCosts, getTax()))); + } + + /// ----- place order page navigation ----- /// + @Step("place the order") public OrderConfirmationPage placeOrder() { - // Opens the OrderConfirmationPage - // Clicks the Order button + // click on "Order with costs" button orderButton.scrollTo().click(); return new OrderConfirmationPage().isExpectedPage(); - - } + + // -------------------------------------------------------------- - + @Step("validate order contains product '{product.name}'") + public void validateContainsProduct(Product product) + { + SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() + .parent().parent(); + productContainer.find(".pName").shouldHave(exactText(product.getName())); + productContainer.find(".pSize").shouldHave(exactText(product.getSize())); + productContainer.find(".pStyle").shouldHave(exactText(product.getStyle())); + productContainer.find(".pCount").shouldHave(exactText(Integer.toString(product.getAmount()))); + productContainer.find(".pPrice").shouldHave(exactText(product.getUnitPrice())); + productContainer.find(".productLineItemPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); + } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java index 9bb3a7ce..d2b9cdcc 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java @@ -1,12 +1,10 @@ package posters.pageobjects.pages.checkout; -import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -16,21 +14,7 @@ public class ShippingAddressPage extends AbstractCheckoutPage { - private SelenideElement headline = $("#titleDelAddr"); - - private SelenideElement nameField = $("#fullName"); - - private SelenideElement companyField = $("#company"); - - private SelenideElement addressField = $("#addressLine"); - - private SelenideElement cityField = $("#city"); - - private SelenideElement stateField = $("#state"); - - private SelenideElement zipField = $("#zip"); - - private SelenideElement countryField = $("#country"); + private SelenideElement title = $("#titleDelAddr"); private SelenideElement addShippingButton = $("#btnAddDelAddr"); @@ -39,56 +23,12 @@ public class ShippingAddressPage extends AbstractCheckoutPage public ShippingAddressPage isExpectedPage() { super.isExpectedPage(); - headline.should(exist); + title.should(exist); return this; } /// ----- validate shipping address page ----- /// - @Step("validate breadcrumb") - public void validateBreadcrumb() - { - $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); - $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); - $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); - $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); - $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); - } - - @Step("validate fill-in form headlines") - public void validateFillInHeadlines(String headline) - { - $$(".form-group").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); - } - - @Step("validate fill-in form headlines") - public void validateFillInHeadlines() - { - validateFillInHeadlines("AddressPages.fillIn.headlines.fullName"); - validateFillInHeadlines("AddressPages.fillIn.headlines.company"); - validateFillInHeadlines("AddressPages.fillIn.headlines.address"); - validateFillInHeadlines("AddressPages.fillIn.headlines.city"); - validateFillInHeadlines("AddressPages.fillIn.headlines.state"); - validateFillInHeadlines("AddressPages.fillIn.headlines.zip"); - // validateFillInHeadlines("AddressPages.fillIn.headlines.country"); - } - - @Step("validate fill-in form placeholder") - public void validateFillInPlaceholder() - { - nameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.yourName")))).shouldBe(visible); - companyField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.companyName")))).shouldBe(visible); - addressField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.address")))).shouldBe(visible); - zipField.shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.zip")))).shouldBe(visible); - } - - @Step("validate country dropdown") - public void validateCountryDropdown() - { - countryField.shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.usa"))).should(exist); - countryField.shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.germany"))).should(exist); - } - @Step("validate shipping address usage for billing address radio") public void validateAddressRadio() { @@ -106,8 +46,10 @@ public void validateStructure() // validate breadcrumb validateBreadcrumb(); + // validate title + title.shouldHave(exactText(Neodymium.localizedText("ShippingAddressPage.fillIn.title"))).shouldBe(visible); + // validate fill in form headline - headline.shouldHave(exactText(Neodymium.localizedText("ShippingAddressPage.fillIn.title"))).shouldBe(visible); validateFillInHeadlines(); // validate fill in form structure @@ -120,7 +62,7 @@ public void validateStructure() validateAddressRadio(); // validate "required fields" string - $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + validateRequiredString(); // validate continue button addShippingButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.button"))).shouldBe(visible); @@ -141,15 +83,15 @@ public BillingAddressPage sendShippingAddressForm(Address shippingAddress, boole @Step("fill and send shipping address form") public BillingAddressPage sendShippingAddressForm(String name, String company, String address, String city, String state, String zip, String country, boolean sameBillingAddress) - { + { // enter parameters - nameField.val(name); - companyField.val(company); - addressField.val(address); - cityField.val(city); - stateField.val(state); - zipField.val(zip); - countryField.selectOption(country); + $("#fullName").val(name); + $("#company").val(company); + $("#addressLine").val(address); + $("#city").val(city); + $("#state").val(state); + $("#zip").val(zip); + $("#country").selectOption(country); // check if shipping address and billing address is equal if (sameBillingAddress) @@ -169,11 +111,6 @@ public BillingAddressPage sendShippingAddressForm(String name, String company, S // --------------------------------------------------------------- - /** - * @param position - * position of the shipping address - * @return BillingAddressPage - */ @Step("select a shipping address") public BillingAddressPage selectShippingAddress(int position) { diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index 3aad3478..9798d26b 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -12,6 +12,8 @@ public class PriceHelper private final static DecimalFormat decimalFormat = new DecimalFormat("##0.00", new DecimalFormatSymbols(Locale.US)); + /// ----- format string ----- /// + @Step("remove $ from {price}") public static String removeCurrency(String price) { @@ -30,20 +32,28 @@ public static String format(double input) return addCurrency(decimalFormat.format(input)); } - @Step("calculate ({unitPrice} * {quantity} * 100) / 100 -> ensure two decimal places") - public static String computeRowPrice(String unitPrice, String quantity) + /// ----- specific calculations ----- /// + + @Step("calculate total product price") + public static String totalProductPrice(String unitPrice, String quantity) { double res = (double) (Math.round((Double.valueOf(removeCurrency(unitPrice)) * Double.valueOf(quantity)) * 100)) / 100; return format(res); } - + @Step("calculate difference") - public static String subtractFromPrice(String minuend, String subtrahend) + public static String substract(String minuend, String subtrahend) { double res = (double) (Math.round((Double.valueOf(removeCurrency(minuend)) - Double.valueOf(removeCurrency(subtrahend))) * 100)) / 100; return format(res); } + @Step("calculate subtotal") + public static double calculateSubtotal(double oldSubtotal, String totalProductPrice) + { + return (double) (Math.round((oldSubtotal + Double.valueOf(totalProductPrice)) * 100)) / 100; + } + @Step("calculate tax") public static String calculateTax(String shippingCosts, String subtotal) { @@ -51,4 +61,11 @@ public static String calculateTax(String shippingCosts, String subtotal) double tax = (double) (Math.round((Double.valueOf(totalPrice) * 0.06) * 100)) / 100; return format(tax); } + + @Step("calculate grand total price") + public static String calculateGrandTotal(String subtotal, String shippingCosts, String tax) + { + double grandTotal = (double) (Math.round((Double.valueOf(removeCurrency(subtotal)) + Double.valueOf(removeCurrency(shippingCosts)) + Double.valueOf(removeCurrency(tax))) * 100)) / 100; + return format(grandTotal); + } } diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index 781059c0..3d993855 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -26,7 +26,6 @@ public class GuestOrderTest extends AbstractTest public void testOrderingAsGuest() { final String shippingCosts = Neodymium.dataValue("shippingCosts"); - int totalCount = 0; final var shippingAddress = DataUtils.get(Address.class); final boolean sameBillingAddress = false; @@ -36,9 +35,6 @@ public void testOrderingAsGuest() // go to homepage var homePage = OpenHomePageFlow.flow(); - // store old subtotal - final String oldSubtotal = homePage.miniCart.getSubtotal(); - // go to category page var categoryPage = homePage.topNav.clickCategory(guestOrderTestData.getTopCategory()); @@ -52,11 +48,11 @@ public void testOrderingAsGuest() // go to shipping address page and validate var shippingAddressPage = cartPage.openShippingAddressPage(); - //shippingAddressPage.validateStructure(); + shippingAddressPage.validateStructure(); // go to billing address page and validate var billingAddressPage = shippingAddressPage.sendShippingAddressForm(shippingAddress, sameBillingAddress); - //billingAddressPage.validateStructure(); + billingAddressPage.validateStructure(); // go to payment page and validate var paymentPage = billingAddressPage.sendBillingAddressForm(billingAddress); @@ -66,29 +62,14 @@ public void testOrderingAsGuest() var placeOrderPage = paymentPage.sendPaymentForm(creditCard); placeOrderPage.validateStructure(); placeOrderPage.validateOrderOverview(shippingAddress, billingAddress, creditCard); - //placeOrderPage.validateProduct(product); - - /* - - placeOrderPage.validateProduct(1, product.getName(), product.getAmount(), product.getStyle(), product.getSize()); - placeOrderPage.validateAddressesAndPayment(shippingAddress, billingAddress, creditCard); - - // Place order - //homePage = placeOrderPage.placeOrder(); + placeOrderPage.validateProduct(1, product); + placeOrderPage.validatePriceSummary(placeOrderPage.getSubtotal(), shippingCosts); - // Place Order + // go to order confirmation page and validate var orderConfirmationPage = placeOrderPage.placeOrder(); + orderConfirmationPage.validateStructure(); - // Validate order confirmation on the Order Confirmation page - orderConfirmationPage.validate(); - orderConfirmationPage.validateSuccessfulOrder(); - - //navigate to the Home Page - homePage = orderConfirmationPage.goHome(); - - - //Validate home page - homePage.validateStructure(); - */ + // go to homepage + homePage = orderConfirmationPage.openHomePage(); } } diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index e8f92cb0..e116430f 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -91,15 +91,14 @@ public void testOrderingAsRegisteredUser() // Send payment data and validate place order page var placeOrderPage = paymentPage.selectCreditCard(1); placeOrderPage.validateStructure(); - placeOrderPage.validateProduct(1, product.getName(), product.getAmount(), product.getStyle(), product.getSize()); - placeOrderPage.validateAddressesAndPayment(shippingAddress, billingAddress, creditCard); + //placeOrderPage.validateProduct(1, product.getName(), product.getAmount(), product.getStyle(), product.getSize()); + placeOrderPage.validateOrderOverview(shippingAddress, billingAddress, creditCard); // Place order var OrderConfirmationPage = placeOrderPage.placeOrder(); // Validate order confirmation on Order Confirmation Page - OrderConfirmationPage.validate(); - OrderConfirmationPage.validateSuccessfulOrder(); + OrderConfirmationPage.validateStructure(); } @After From a3bd9aa2522457a629fd5d1ae96dd28203686c2e Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Fri, 4 Aug 2023 16:43:28 +0200 Subject: [PATCH 21/44] small improvements checkout pages --- config/localization.yaml | 4 +-- .../pageobjects/pages/AbstractPageObject.java | 25 +++++++++++++++++++ .../pages/checkout/BillingAddressPage.java | 13 +++++++--- .../pageobjects/pages/checkout/CartPage.java | 20 +++++++++++++-- .../pages/checkout/OrderConfirmationPage.java | 20 --------------- .../pages/checkout/PaymentPage.java | 9 ++++--- .../pages/checkout/PlaceOrderPage.java | 5 +++- .../pages/checkout/ShippingAddressPage.java | 3 +++ 8 files changed, 67 insertions(+), 32 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index b9f40ef6..f293a83d 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -187,7 +187,6 @@ default: "6": number: "06" name: ORDER COMPLETE - fillIn: headlines: fullName: FULL NAME* @@ -223,9 +222,10 @@ default: tax: "Tax (6.0%)" grandTotal: Total productTable: - products: PRODUCTS + product: PRODUCT unitPrice: UNIT PRICE quantity: QUANTITY + update: REMOVE/UPDATE totalPrice: TOTAL PRICE \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java index a67fe791..c224bc8e 100644 --- a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java +++ b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java @@ -1,5 +1,7 @@ package posters.pageobjects.pages; +import static com.codeborne.selenide.Condition.exactText; +import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import org.apache.commons.lang3.StringUtils; @@ -7,6 +9,7 @@ import com.xceptance.neodymium.util.Neodymium; import com.xceptance.neodymium.visual.ai.AI; +import io.qameta.allure.Step; import posters.pageobjects.components.Title; public abstract class AbstractPageObject @@ -49,4 +52,26 @@ public void scrollToTop() { $("body").scrollTo(); } + + /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage, PlaceOrderPage, OrderConfirmationPage ----- /// + + @Step("validate process wrap") + public void validateProcessWrap() + { + // validate process numbers + $("#crt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.number"))).shouldBe(visible); + $("#ship span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.number"))).shouldBe(visible); + $("#bill span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.number"))).shouldBe(visible); + $("#payment span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.number"))).shouldBe(visible); + $("#chkout span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.number"))).shouldBe(visible); + $("#orderCmplt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.number"))).shouldBe(visible); + + // validate process names + $("#crt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.name"))).shouldBe(visible); + $("#ship h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.name"))).shouldBe(visible); + $("#bill h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.name"))).shouldBe(visible); + $("#payment h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.name"))).shouldBe(visible); + $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); + $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); + } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java index 9fd30b3e..a67ae45a 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java @@ -13,7 +13,7 @@ public class BillingAddressPage extends AbstractCheckoutPage { - private SelenideElement headline = $("#titleBillAddr"); + private SelenideElement title = $("#titleBillAddr"); private SelenideElement addBillingButton = $("#btnAddBillAddr"); @@ -21,7 +21,7 @@ public class BillingAddressPage extends AbstractCheckoutPage @Step("ensure this is a billing address page") public BillingAddressPage isExpectedPage() { - headline.should(exist); + title.should(exist); return this; } @@ -35,9 +35,14 @@ public void validateStructure() // validate breadcrumb validateBreadcrumb(); + + // validate process wrap + //validateProcessWrap(); - // validate fill in form headline - headline.shouldHave(exactText(Neodymium.localizedText("BillingAddressPage.fillIn.title"))).shouldBe(visible); + // validate title + title.shouldHave(exactText(Neodymium.localizedText("BillingAddressPage.fillIn.title"))).shouldBe(visible); + + // validate fill form headline validateFillInHeadlines(); // validate fill in form structure diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 9bb84b2e..8b0ee818 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -11,6 +11,7 @@ import org.junit.Assert; +import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -27,6 +28,8 @@ public class CartPage extends AbstractBrowsingPage private SelenideElement cartTable = $("#cartOverviewTable"); + private ElementsCollection tableHead = $$(".product-name span"); + private SelenideElement subTotal = $("#orderSubTotalValue"); @Override @@ -47,17 +50,30 @@ public void validateEmptyCartPage() $("#errorCartMessage").shouldHave(exactText(Neodymium.localizedText("CartPage.errorMessage"))).shouldBe(visible); } + @Step("validate product table head") + public void validateTableHead() + { + tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.product"))).shouldBe(visible); + tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.unitPrice"))).shouldBe(visible); + tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.quantity"))).shouldBe(visible); + tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.update"))).shouldBe(visible); + tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.totalPrice"))).shouldBe(visible); + } + @Override @Step("validate cart page structure") public void validateStructure() { super.validateStructure(); - // validate process sequence - $(".process-wrap").shouldBe(visible); + // validate process wrap + //validateProcessWrap(); // validate title title.shouldHave(exactText(Neodymium.localizedText("CartPage.title"))).shouldBe(visible); + + // validate product table head + validateTableHead(); // validate product list cartTable.shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java index f63f5920..05b36ad3 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java @@ -26,26 +26,6 @@ public OrderConfirmationPage isExpectedPage() /// ----- validate order confirmation page ----- /// - @Step("validate process wrap") - public void validateProcessWrap() - { - // validate process numbers - $("#crt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.number"))).shouldBe(visible); - $("#ship span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.number"))).shouldBe(visible); - $("#bill span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.number"))).shouldBe(visible); - $("#payment span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.number"))).shouldBe(visible); - $("#chkout span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.number"))).shouldBe(visible); - $("#orderCmplt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.number"))).shouldBe(visible); - - // validate process names - $("#crt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.name"))).shouldBe(visible); - $("#ship h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.name"))).shouldBe(visible); - $("#bill h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.name"))).shouldBe(visible); - $("#payment h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.name"))).shouldBe(visible); - $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); - $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); - } - public void validateStructure() { super.validateStructure(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java index 566fc578..147df7b9 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java @@ -18,7 +18,7 @@ public class PaymentPage extends AbstractCheckoutPage { - private SelenideElement headline = $("#titlePayment"); + private SelenideElement title = $("#titlePayment"); private SelenideElement creditCardNumber = $("#creditCardNumber"); @@ -36,7 +36,7 @@ public class PaymentPage extends AbstractCheckoutPage public PaymentPage isExpectedPage() { super.isExpectedPage(); - headline.should(exist); + title.should(exist); return this; } @@ -127,8 +127,11 @@ public void validateStructure() // validate breadcrumb validateBreadcrumb(); + // validate process wrap + //validateProcessWrap(); + // validate fill in form headline - headline.shouldHave(exactText(Neodymium.localizedText("PaymentPage.fillIn.title"))).shouldBe(visible); + title.shouldHave(exactText(Neodymium.localizedText("PaymentPage.fillIn.title"))).shouldBe(visible); validateFillInHeadlines(); // validate placeholder diff --git a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java index e0917467..866b2097 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java @@ -55,7 +55,7 @@ public PlaceOrderPage isExpectedPage() @Step("validate product table head") public void validateTableHead() { - tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.products"))).shouldBe(visible); + //tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.product"))).shouldBe(visible); tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.unitPrice"))).shouldBe(visible); tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.quantity"))).shouldBe(visible); tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.totalPrice"))).shouldBe(visible); @@ -70,6 +70,9 @@ public void validateStructure() // validate breadcrumb validateBreadcrumb(); + // validate process wrap + //validateProcessWrap(); + // validate product table head validateTableHead(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java index d2b9cdcc..2c092e2a 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java @@ -45,6 +45,9 @@ public void validateStructure() // validate breadcrumb validateBreadcrumb(); + + // validate process wrap + //validateProcessWrap(); // validate title title.shouldHave(exactText(Neodymium.localizedText("ShippingAddressPage.fillIn.title"))).shouldBe(visible); From 0fc2d59cf39f040309df35c646ca0adfe9925e6b Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 7 Aug 2023 14:14:58 +0200 Subject: [PATCH 22/44] extended validation fpr LoginPage and RegisterPage, improved GuestOrderTest --- config/localization.yaml | 40 ++++-- .../java/posters/flows/DeleteUserFlow.java | 6 +- .../java/posters/flows/OpenLoginPageFlow.java | 2 +- .../pageobjects/components/UserMenu.java | 19 +-- .../pageobjects/pages/AbstractPageObject.java | 8 ++ .../pageobjects/pages/browsing/HomePage.java | 22 ++-- .../pages/checkout/AbstractCheckoutPage.java | 8 -- .../pages/checkout/ShippingAddressPage.java | 50 ++++++-- .../pageobjects/pages/user/LoginPage.java | 115 ++++++++---------- .../pageobjects/pages/user/RegisterPage.java | 90 +++++++------- src/test/java/posters/tests/AbstractTest.java | 35 +++++- .../posters/tests/smoke/GuestOrderTest.java | 53 +++++--- .../posters/tests/smoke/RegisterTest.java | 24 ++-- .../tests/smoke/RegisteredOrderTest.java | 2 +- .../tests/testdata/dataobjects/Address.java | 26 +--- .../tests/testdata/dataobjects/User.java | 29 ----- .../processes/GuestOrderTestData.java | 31 +++++ .../posters/tests/smoke/GuestOrderTest.json | 70 +++++++++-- 18 files changed, 362 insertions(+), 268 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index f293a83d..ad11613e 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -145,22 +145,36 @@ default: OrderConfirmationPage: thankYouMessage: Thank you for purchasing, Your order is complete button: Continue Shopping - AccountPages: - email: Email address* - firstName: First name* - lastName: Last name* - password: Password* - passwordRepeat: Repeat password* - yourEmail: Your email* - yourPassword: Your password* - signIn: Sign in + LoginPage: + title: Sign-In + headlines: + email: YOUR EMAIL* + password: YOUR PASSWORD* + placeholder: + email: Email address + password: Password + button: Sign in newCustomer: New customer - createAccount: Create account createNewAccount: Create new Account validation: - successfulAccountCreation: Your account has been created. Log in with your email address and password. - emailDoesNotExistError: The email address you entered doesn't exist. Please try again. - incorrectPasswordError: The password you entered is incorrect. Please try again. + successfulRegistration: Your account has been created. Log in with your email address and password. + emailDoesNotExist: The email address you entered doesn't exist. Please try again. + incorrectPassword: The password you entered is incorrect. Please try again. + RegisterPage: + title: Create an account + headlines: + firstName: FIRST NAME* + lastName: LAST NAME* + email: EMAIL ADDRESS* + password: PASSWORD* + passwordRepeat: REPEAT PASSWORD* + placeholder: + firstName: First name + lastName: Last name + email: Email address + password: Password + passwordRepeat: Confirm password + button: Create account AddressPages: breadcrumb: cart: CART/ diff --git a/src/test/java/posters/flows/DeleteUserFlow.java b/src/test/java/posters/flows/DeleteUserFlow.java index 19a1ba3d..944fce34 100644 --- a/src/test/java/posters/flows/DeleteUserFlow.java +++ b/src/test/java/posters/flows/DeleteUserFlow.java @@ -14,9 +14,9 @@ public static LoginPage flow(User user) // ensure that the user is logged in var loginPage = new LoginPage(); - if (!homePage.userMenu.isLoggedIn()) + if (!homePage.userMenu.validateIsLoggedIn()) { - loginPage = homePage.userMenu.openLogin(); + loginPage = homePage.userMenu.openLoginPage(); homePage = loginPage.sendLoginform(user); } @@ -36,7 +36,7 @@ public static LoginPage flow(User user) homePage.validateSuccessfulDeletedAccount(); // verify that the account is not available anymore - loginPage = homePage.userMenu.openLogin(); + loginPage = homePage.userMenu.openLoginPage(); loginPage.validateStructure(); loginPage.sendFalseLoginform(user); loginPage.validateWrongEmail(user.getEmail()); diff --git a/src/test/java/posters/flows/OpenLoginPageFlow.java b/src/test/java/posters/flows/OpenLoginPageFlow.java index 663aa7f3..bea41038 100644 --- a/src/test/java/posters/flows/OpenLoginPageFlow.java +++ b/src/test/java/posters/flows/OpenLoginPageFlow.java @@ -12,7 +12,7 @@ public static LoginPage flow() var homePage = OpenHomePageFlow.flow(); // open login page and check for expected page - var loginPage = homePage.userMenu.openLogin(); + var loginPage = homePage.userMenu.openLoginPage(); loginPage.isExpectedPage(); return loginPage.isExpectedPage(); diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index 81d6c120..cec0a2e8 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -46,6 +46,14 @@ public void closeUserMenu() $("#brand").hover(); userMenu.waitUntil(not(visible), Neodymium.configuration().selenideTimeout()); } + + @Step("open login page from user menu") + public LoginPage openLoginPage() + { + openUserMenu(); + userMenu.find(".goToLogin").scrollTo().click(); + return new LoginPage().isExpectedPage(); + } /// ----- validate user menu ----- /// @@ -88,7 +96,7 @@ public void validateNotLoggedIn() } @Step("validate that somebody is logged in") - public boolean isLoggedIn() + public boolean validateIsLoggedIn() { return userMenu.find(".goToAccountOverview").exists(); } @@ -98,14 +106,7 @@ public boolean isLoggedIn() - // TODO - check if needed - @Step("open login page from user menu") - public LoginPage openLogin() - { - openUserMenu(); - userMenu.find(".goToLogin").scrollTo().click(); - return new LoginPage().isExpectedPage(); - } + // TODO - check if needed @Step("open account page from user menu") diff --git a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java index c224bc8e..b06da998 100644 --- a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java +++ b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java @@ -74,4 +74,12 @@ public void validateProcessWrap() $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); } + + /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage, LoginPage ----- /// + + @Step("validate required string") + public void validateRequiredString() + { + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index e5196dac..ee972e33 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -33,6 +33,8 @@ public HomePage isExpectedPage() return this; } + /// ----- validate homepage ----- /// + @Step("validate poster slide") public void validatePosterSlide() { @@ -101,6 +103,16 @@ public void validateStructure() $("a.btn-primary-shop").shouldHave(exactText(Neodymium.localizedText("HomePage.shopAllProducts"))).shouldBe(visible); } + @Step("validate successful login on home page") + public void validateSuccessfulLogin(String firstName) + { + // validate success message + successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulLogin")); + + // validate {firstName} in user menu + userMenu.validateLoggedInName(firstName); + } + // -------------------------------------------------- @Step("validate successful order on home page") @@ -111,16 +123,6 @@ public void validateSuccessfulOrder() miniCart.validateTotalCount(0); miniCart.validateSubtotal("$0.00"); } - - @Step("validate successful login on home page") - public void validateSuccessfulLogin(String firstName) - { - // Verify that you are logged in - successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulLogin")); - // Verify that the user menu shows your first name - userMenu.validateLoggedInName(firstName); - - } @Step("validate successful user login on home page") public void validateSuccessfulLogin(User user) diff --git a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java index b69b101c..657aa2cb 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java @@ -48,14 +48,6 @@ public void validateBreadcrumb() $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); } - /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage ----- /// - - @Step("validate required string") - public void validateRequiredString() - { - $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); - } - /// ----- ShippingAddressPage, BillingAddressPage ----- /// @Step("validate fill-in form headlines") diff --git a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java index 2c092e2a..7a8bda38 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java @@ -74,18 +74,18 @@ public void validateStructure() /// ----- send shipping address form ----- /// @Step("fill and send shipping address form") - public BillingAddressPage sendShippingAddressForm(Address shippingAddress, boolean sameBillingAddress) + public BillingAddressPage sendShippingAddressForm(Address shippingAddress) { String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); return sendShippingAddressForm(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), - shippingAddress.getCountry(), sameBillingAddress); + shippingAddress.getCountry()); } @Step("fill and send shipping address form") public BillingAddressPage sendShippingAddressForm(String name, String company, String address, String city, - String state, String zip, String country, boolean sameBillingAddress) + String state, String zip, String country) { // enter parameters $("#fullName").val(name); @@ -95,22 +95,46 @@ public BillingAddressPage sendShippingAddressForm(String name, String company, S $("#state").val(state); $("#zip").val(zip); $("#country").selectOption(country); - - // check if shipping address and billing address is equal - if (sameBillingAddress) - { - $("#billEqualShipp-Yes").scrollTo().click(); - } - else - { - $("#billEqualShipp-No").scrollTo().click(); - } + + $("#billEqualShipp-No").scrollTo().click(); // click on "Continue" button addShippingButton.scrollTo().click(); return new BillingAddressPage().isExpectedPage(); } + + @Step("fill and send shipping address form") + public PaymentPage sendShippingAddressForm2(Address shippingAddress) + { + String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); + + return sendShippingAddressForm2(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), + shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), + shippingAddress.getCountry()); + } + + @Step("fill and send shipping address form") + public PaymentPage sendShippingAddressForm2(String name, String company, String address, String city, + String state, String zip, String country) + { + // enter parameters + $("#fullName").val(name); + $("#company").val(company); + $("#addressLine").val(address); + $("#city").val(city); + $("#state").val(state); + $("#zip").val(zip); + $("#country").selectOption(country); + + $("#billEqualShipp-Yes").scrollTo().click(); + + // click on "Continue" button + addShippingButton.scrollTo().click(); + + return new PaymentPage().isExpectedPage(); + } + // --------------------------------------------------------------- diff --git a/src/test/java/posters/pageobjects/pages/user/LoginPage.java b/src/test/java/posters/pageobjects/pages/user/LoginPage.java index c9a66141..bb1f8368 100644 --- a/src/test/java/posters/pageobjects/pages/user/LoginPage.java +++ b/src/test/java/posters/pageobjects/pages/user/LoginPage.java @@ -1,11 +1,12 @@ package posters.pageobjects.pages.user; +import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exactValue; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -36,72 +37,76 @@ public LoginPage isExpectedPage() return this; } + /// ----- validate login page ----- /// + @Override @Step("validate login page structure") public void validateStructure() { super.validateStructure(); - // Login headline - // Make sure the Headline is there and starts with a capital letter followed by at least 3 more symbols. - loginForm.find(".h2fwpr").should(matchText("[A-Z].{3,}")); - // Email field - // Asserts the Email field has a label displaying the value. - loginForm.find("label.control-label[for=email]").shouldHave(exactText(Neodymium.localizedText("AccountPages.yourEmail"))); - // Asserts the email field is present. - emailField.shouldBe(visible); - // Password field - // Verifies the password field has a label displaying the value. - loginForm.find("label.control-label[for=password]").shouldHave(exactText(Neodymium.localizedText("AccountPages.yourPassword"))); - // Asserts the password field is there. - passwordField.shouldBe(visible); - // Login button - // asserts the login button displays the value. - signInButton.shouldHave(exactText(Neodymium.localizedText("AccountPages.signIn"))); - // Register headline - // Asserts the Headline for the Registration is there. - $(".header-container .h2fwpr").shouldHave(exactText(Neodymium.localizedText("AccountPages.newCustomer"))); - // Registration page link - // Asserts the Register link is there and shows the correct text. - registerLink.shouldHave(exactText(Neodymium.localizedText("AccountPages.createNewAccount"))); + // validate title + loginForm.find("legend").shouldHave(exactText(Neodymium.localizedText("LoginPage.title"))).shouldBe(visible); + + // validate fill in headlines + $$("#formLogin .form-group label").findBy(exactText(Neodymium.localizedText("LoginPage.headlines.email"))).shouldBe(visible); + $$("#formLogin .form-group label").findBy(exactText(Neodymium.localizedText("LoginPage.headlines.password"))).shouldBe(visible); + + // validate fill in placeholder + emailField.shouldHave(attribute("placeholder", (Neodymium.localizedText("LoginPage.placeholder.email")))).shouldBe(visible); + passwordField.shouldHave(attribute("placeholder", (Neodymium.localizedText("LoginPage.placeholder.password")))).shouldBe(visible); + + // validate "required fields" string + validateRequiredString(); + + // validate sign in button + signInButton.shouldHave(exactText(Neodymium.localizedText("LoginPage.button"))); + + // validate new account creation + $(".header-container").shouldHave(exactText(Neodymium.localizedText("LoginPage.newCustomer"))); + registerLink.shouldHave(exactText(Neodymium.localizedText("LoginPage.createNewAccount"))); } - + + @Step("validate successful registration message") + public void validateSuccessfulRegistration() + { + successMessage.validateSuccessMessage(Neodymium.localizedText("LoginPage.validation.successfulRegistration")); + } + + /// ----- login page navigation ----- /// + + @Step("open register page from login page") + public RegisterPage openRegister() + { + registerLink.scrollTo().click(); + return new RegisterPage().isExpectedPage(); + } + @Step("send login form") public void sendFormWithData(String email, String password) { - // Input email - // Fill the email field with the parameter. + // fill out the login form emailField.val(email); - // Input password - // Fill the password field with the parameter. passwordField.val(password); - // Log in and open the homepage - // Click on the Sign In button. + + // click on the Sign In button. signInButton.scrollTo().click(); } - - /** - * @param email - * The email of the account you want to log into - * @param password - * The password of the account you want to log into - */ - @Step("send login form with valid data") + + @Step("send login form with valid user data") + public HomePage sendLoginform(User user) + { + return sendLoginform(user.getEmail(), user.getPassword()); + } + + @Step("send login form with valid user data") public HomePage sendLoginform(String email, String password) { sendFormWithData(email, password); return new HomePage().isExpectedPage(); } - /** - * @param user - * @return - */ - @Step("send login form with valid user data") - public HomePage sendLoginform(User user) - { - return sendLoginform(user.getEmail(), user.getPassword()); - } + // ----------------------------------------------------------- /** * @param user @@ -113,22 +118,6 @@ public LoginPage sendFalseLoginform(User user) return new LoginPage().isExpectedPage(); } - /** - * @return - */ - @Step("open register page from login page") - public RegisterPage openRegister() - { - registerLink.scrollTo().click(); - return new RegisterPage().isExpectedPage(); - } - - @Step("validate successful registration message") - public void validateSuccessfulRegistration() - { - successMessage.validateSuccessMessage(Neodymium.localizedText("AccountPages.validation.successfulAccountCreation")); - } - /** * @param eMail */ diff --git a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java index 33155d13..bec56a57 100644 --- a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java +++ b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java @@ -1,10 +1,12 @@ package posters.pageobjects.pages.user; +import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -18,9 +20,9 @@ public class RegisterPage extends AbstractBrowsingPage private SelenideElement registerForm = $("#formRegister"); - private SelenideElement firstnameField = $("#firstName"); + private SelenideElement firstNameField = $("#firstName"); - private SelenideElement lastnameField = $("#lastName"); + private SelenideElement lastNameField = $("#lastName"); private SelenideElement emailField = $("#eMail"); @@ -39,61 +41,63 @@ public RegisterPage isExpectedPage() return this; } + /// ----- validate register page ----- /// + + @Step("validate fill in form headlines") + public void validateFillInHeadlines() + { + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.firstName"))).shouldBe(visible); + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.lastName"))).shouldBe(visible); + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.email"))).shouldBe(visible); + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.password"))).shouldBe(visible); + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.passwordRepeat"))).shouldBe(visible); + } + + @Step("validate fill in form placeholder") + public void validateFillInPlaceholder() + { + firstNameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.firstName")))).shouldBe(visible); + lastNameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.lastName")))).shouldBe(visible); + emailField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.email")))).shouldBe(visible); + passwordField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.password")))).shouldBe(visible); + passwordRepeatField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.passwordRepeat")))).shouldBe(visible); + } + @Override @Step("validate register page structure") public void validateStructure() { super.validateStructure(); - // Login headline - // Make sure the Headline is there and starts with a capital letter followed by at least 3 more symbols. - registerForm.find(".h2fwpr").should(matchText("[A-Z].{3,}")); - // Form - // Asserts the label belonging to the last name field displays the correct text - $("label[for='lastName']").shouldHave(exactText(Neodymium.localizedText("AccountPages.lastname"))); - // Make sure the field to type in the last name is visible. - lastnameField.shouldBe(visible); - // Asserts the label belonging to the first name field displays the correct text - $("label[for='firstName']").shouldHave(exactText(Neodymium.localizedText("AccountPages.firstname"))); - // Make sure the field to type in the first name is visible. - firstnameField.shouldBe(visible); - // Asserts the label belonging to the email field displays the correct text - $("label[for='eMail']").shouldHave(exactText(Neodymium.localizedText("AccountPages.email"))); - // Make sure the field to type in the e-Mail is visible. - emailField.shouldBe(visible); - // Asserts the label belonging to the password field displays the correct text - $("label[for='password']").shouldHave(exactText(Neodymium.localizedText("AccountPages.password"))); - // Make sure the field to type in the password is visible. - passwordField.shouldBe(visible); - // Asserts the label belonging to the second password field displays the correct text - $("label[for='passwordAgain']").shouldHave(exactText(Neodymium.localizedText("AccountPages.passwordRepeat"))); - // Make sure the field to type in the password again is visible. - passwordRepeatField.shouldBe(visible); - // Register button - // Make sure the Registration button displays the correct text. - registerButton.shouldHave(exactText(Neodymium.localizedText("AccountPages.createAccount"))); + // validate title + registerForm.find("legend").shouldHave(exactText(Neodymium.localizedText("RegisterPage.title"))).shouldBe(visible); + + // validate fill in headlines + validateFillInHeadlines(); + + // validate fill in placeholder + validateFillInPlaceholder(); + + // validate "required fields" string + validateRequiredString(); + + // validate sign in button + registerButton.shouldHave(exactText(Neodymium.localizedText("RegisterPage.button"))); } - /** - * @param user - * The User data of the account you want to log into - */ + /// ----- register page navigation ----- /// + @Step("fill and send register form") public LoginPage sendRegisterForm(User user) { - // Fill out the registration form - // Type the last name parameter into the last name field. - lastnameField.val(user.getLastName()); - // Type the first name parameter into the first name field. - firstnameField.val(user.getFirstName()); - // Type the email parameter into the email field. + // fill out the registration form + lastNameField.val(user.getLastName()); + firstNameField.val(user.getFirstName()); emailField.val(user.getEmail()); - // Type the password parameter into the password field. passwordField.val(user.getPassword()); - // Type the second password parameter into the second password field. passwordRepeatField.val(user.getPassword()); - // Register and open the login page if successful - // Click on the Register Button + + // click on the Register Button registerButton.scrollTo().click(); return new LoginPage().isExpectedPage(); diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index edee2c4d..c10357f7 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -12,6 +12,10 @@ import posters.tests.testdata.processes.AddToCartTestData; import posters.tests.testdata.processes.BrowseTestData; import posters.tests.testdata.processes.GuestOrderTestData; +import posters.tests.testdata.dataobjects.Address; +import posters.tests.testdata.dataobjects.CreditCard; +import posters.tests.testdata.dataobjects.Product; +import posters.tests.testdata.dataobjects.User; import posters.tests.testdata.pageobjects.components.HeaderTestData; import posters.tests.testdata.pageobjects.components.PaginationTestData; import posters.tests.testdata.pageobjects.components.SearchTestData; @@ -20,24 +24,47 @@ @Browser("Chrome_1024x768") public abstract class AbstractTest { - protected HeaderTestData headerTestData; + /// ----- dataobjects ----- /// + protected Address addressData; + + protected CreditCard creditCardData; + + protected Product productData; + + protected User userData; + + /// ----- components ----- /// + + protected HeaderTestData headerTestData; + protected PaginationTestData paginationTestData; - + protected SearchTestData searchTestData; + /// ----- processes ----- /// + protected AddToCartTestData addToCartTestData; - + protected BrowseTestData browseTestData; - + protected GuestOrderTestData guestOrderTestData; @Before public void setup() { + // dataobjects + addressData = DataUtils.get(Address.class); + creditCardData = DataUtils.get(CreditCard.class); + productData = DataUtils.get(Product.class); + userData = DataUtils.get(User.class); + + // components headerTestData = DataUtils.get(HeaderTestData.class); paginationTestData = DataUtils.get(PaginationTestData.class); searchTestData = DataUtils.get(SearchTestData.class); + + // processes addToCartTestData = DataUtils.get(AddToCartTestData.class); browseTestData = DataUtils.get(BrowseTestData.class); guestOrderTestData = DataUtils.get(GuestOrderTestData.class); diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index 3d993855..6a04a231 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -3,16 +3,15 @@ import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; -import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; -import posters.tests.testdata.dataobjects.Address; -import posters.tests.testdata.dataobjects.CreditCard; import posters.flows.OpenHomePageFlow; +import posters.pageobjects.pages.checkout.PaymentPage; +import posters.pageobjects.pages.checkout.PlaceOrderPage; import posters.tests.AbstractTest; @Owner("Joe Fix") @@ -20,18 +19,14 @@ @Tag("smoke") @Tag("registered") public class GuestOrderTest extends AbstractTest -{ +{ @Test @DataSet(1) + @DataSet(2) public void testOrderingAsGuest() - { + { final String shippingCosts = Neodymium.dataValue("shippingCosts"); - final var shippingAddress = DataUtils.get(Address.class); - final boolean sameBillingAddress = false; - final var billingAddress = DataUtils.get(Address.class); - final var creditCard = DataUtils.get(CreditCard.class); - // go to homepage var homePage = OpenHomePageFlow.flow(); @@ -50,25 +45,43 @@ public void testOrderingAsGuest() var shippingAddressPage = cartPage.openShippingAddressPage(); shippingAddressPage.validateStructure(); - // go to billing address page and validate - var billingAddressPage = shippingAddressPage.sendShippingAddressForm(shippingAddress, sameBillingAddress); - billingAddressPage.validateStructure(); + // declare variables used in if + PaymentPage paymentPage; + PlaceOrderPage placeOrderPage; + + if (!guestOrderTestData.getShipAndBillAddressAreEqual()) + { + // go to billing address page and validate + var billingAddressPage = shippingAddressPage.sendShippingAddressForm(guestOrderTestData.getShippingAddress()); + billingAddressPage.validateStructure(); - // go to payment page and validate - var paymentPage = billingAddressPage.sendBillingAddressForm(billingAddress); - //paymentPage.validateStructure(); + // go to payment page and validate + paymentPage = billingAddressPage.sendBillingAddressForm(guestOrderTestData.getBillingAddress()); + paymentPage.validateStructure(); + + // go to place order page and validate order overview + placeOrderPage = paymentPage.sendPaymentForm(guestOrderTestData.getCreditCard()); + placeOrderPage.validateOrderOverview(guestOrderTestData.getShippingAddress(), guestOrderTestData.getBillingAddress(), guestOrderTestData.getCreditCard()); + } + else + { + // got to payment page and validate + paymentPage = shippingAddressPage.sendShippingAddressForm2(guestOrderTestData.getShippingAddress()); + paymentPage.validateStructure(); + + // go to place order page and validate order overview + placeOrderPage = paymentPage.sendPaymentForm(guestOrderTestData.getCreditCard()); + placeOrderPage.validateOrderOverview(guestOrderTestData.getShippingAddress(), guestOrderTestData.getShippingAddress(), guestOrderTestData.getCreditCard()); + } - // go to place order page and validate - var placeOrderPage = paymentPage.sendPaymentForm(creditCard); placeOrderPage.validateStructure(); - placeOrderPage.validateOrderOverview(shippingAddress, billingAddress, creditCard); placeOrderPage.validateProduct(1, product); placeOrderPage.validatePriceSummary(placeOrderPage.getSubtotal(), shippingCosts); // go to order confirmation page and validate var orderConfirmationPage = placeOrderPage.placeOrder(); orderConfirmationPage.validateStructure(); - + // go to homepage homePage = orderConfirmationPage.openHomePage(); } diff --git a/src/test/java/posters/tests/smoke/RegisterTest.java b/src/test/java/posters/tests/smoke/RegisterTest.java index 0c53d2b3..e45c9375 100644 --- a/src/test/java/posters/tests/smoke/RegisterTest.java +++ b/src/test/java/posters/tests/smoke/RegisterTest.java @@ -4,8 +4,8 @@ import org.junit.Before; import org.junit.Test; -import com.xceptance.neodymium.module.statement.browser.multibrowser.Browser; import com.xceptance.neodymium.module.statement.testdata.DataSet; +import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; @@ -21,8 +21,7 @@ @Severity(SeverityLevel.CRITICAL) @Tag("smoke") @Tag("registered") -//@Browser("Chrome_1024x768") -@Browser("Firefox_1024x768") +@SuppressDataSets public class RegisterTest extends AbstractTest { private User user; @@ -35,29 +34,24 @@ public void setup() @Test @DataSet(2) - @DataSet(4) - @DataSet(id = "Jim's test") +// @DataSet(4) +// @DataSet(6) public void testRegistering() { - // Go to homepage + // go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validateStructure(); - // Assure that nobody is logged in - homePage.userMenu.validateNotLoggedIn(); - - // Go to login form - var loginPage = homePage.userMenu.openLogin(); + // go to login page and validate + var loginPage = homePage.userMenu.openLoginPage(); loginPage.validateStructure(); - // Go to register form + // go to register page and validate var registerPage = loginPage.openRegister(); registerPage.validateStructure(); loginPage = registerPage.sendRegisterForm(user); loginPage.validateSuccessfulRegistration(); - loginPage.validateStructure(); - + homePage = loginPage.sendLoginform(user); homePage.validateSuccessfulLogin(user); } diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index e116430f..71dc40ca 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -42,7 +42,7 @@ public void testOrderingAsRegisteredUser() final String oldSubtotal = homePage.miniCart.getSubtotal(); // Go to login form - var loginPage = homePage.userMenu.openLogin(); + var loginPage = homePage.userMenu.openLoginPage(); loginPage.validateStructure(); final String email = Neodymium.dataValue("email"); final String password = Neodymium.dataValue("password"); diff --git a/src/test/java/posters/tests/testdata/dataobjects/Address.java b/src/test/java/posters/tests/testdata/dataobjects/Address.java index b3bc22e0..878cd273 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/Address.java +++ b/src/test/java/posters/tests/testdata/dataobjects/Address.java @@ -1,7 +1,7 @@ package posters.tests.testdata.dataobjects; public class Address -{ +{ String firstName; String lastName; @@ -17,20 +17,7 @@ public class Address String zip; String country; - - // needed??? - public Address(String firstName, String lastName, String company, String street, String city, String state, String zip, String country) - { - this.firstName = firstName; - this.lastName = lastName; - this.company = company; - this.street = street; - this.city = city; - this.state = state; - this.zip = zip; - this.country = country; - } - + public String getFirstName() { return firstName; @@ -70,11 +57,4 @@ public String getCountry() { return country; } - - @Override - public String toString() - { - return String.format("Address [firtName()=%s, lastName()=%s, company()=%s, street()=%s, zip()=%s, city()=%s, state()=%s, country()=%s]", - getFirstName(), getLastName(), getCompany(), getStreet(), getZip(), getCity(), getState(), getCountry()); - } -} +} \ No newline at end of file diff --git a/src/test/java/posters/tests/testdata/dataobjects/User.java b/src/test/java/posters/tests/testdata/dataobjects/User.java index 6b94e854..a820a481 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/User.java +++ b/src/test/java/posters/tests/testdata/dataobjects/User.java @@ -10,23 +10,6 @@ public class User String password; - /** - * - */ - public User() - { - } - - /** - * @param firstName - * the firstName to set - * @param lastName - * the lastName to set - * @param email - * the email to set - * @param password - * the password to set - */ public User(String firstName, String lastName, String email, String password) { this.firstName = firstName; @@ -35,33 +18,21 @@ public User(String firstName, String lastName, String email, String password) this.password = password; } - /** - * @return the firstName - */ public String getFirstName() { return firstName; } - /** - * @return the lastName - */ public String getLastName() { return lastName; } - /** - * @return the email - */ public String getEmail() { return email; } - /** - * @return the password - */ public String getPassword() { return password; diff --git a/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java b/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java index 83987282..96e9e975 100644 --- a/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java +++ b/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java @@ -1,5 +1,8 @@ package posters.tests.testdata.processes; +import posters.tests.testdata.dataobjects.Address; +import posters.tests.testdata.dataobjects.CreditCard; + public class GuestOrderTestData { private String topCategory; @@ -10,6 +13,14 @@ public class GuestOrderTestData private String styleProduct; + private Address shippingAddress; + + private Boolean sameBillingAddress; + + private Address billingAddress; + + private CreditCard creditCard; + public String getTopCategory() { return topCategory; @@ -29,4 +40,24 @@ public String getStyleProduct() { return styleProduct; } + + public Address getShippingAddress() + { + return shippingAddress; + } + + public Boolean getShipAndBillAddressAreEqual() + { + return sameBillingAddress; + } + + public Address getBillingAddress() + { + return billingAddress; + } + + public CreditCard getCreditCard() + { + return creditCard; + } } \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/GuestOrderTest.json b/src/test/resources/posters/tests/smoke/GuestOrderTest.json index ed1d6f93..b4e09838 100644 --- a/src/test/resources/posters/tests/smoke/GuestOrderTest.json +++ b/src/test/resources/posters/tests/smoke/GuestOrderTest.json @@ -4,18 +4,62 @@ "resultPosition": "5", "sizeProduct": "64 x 48 in", "styleProduct": "gloss", - "firstName": "Jimmy Blue", - "lastName": "Ochsenknecht", - "company": "Ochsenknecht Records", - "street": "6 Wall St", - "city": "Burlington", - "state": "Massachusetts", - "zip": "01803", - "country": "United States", - "fullName": "Jimmy Blue", - "cardNumber": "4111111111111111", - "crypticCardNumber": "xxxx xxxx xxxx 1111", - "expDateMonth": "04", - "expDateYear": "2023" + "creditCard": + { + "fullName": "Jimmy Blue", + "cardNumber": "4111111111111111", + "crypticCardNumber": "xxxx xxxx xxxx 1111", + "expDateMonth": "12", + "expDateYear": "2026" + }, + "shippingAddress": + { + "firstName": "Jimmy Blue", + "lastName": "Ochsenknecht", + "company": "Ochsenknecht Records", + "street": "6 Wall St", + "city": "Burlington", + "state": "Massachusetts", + "zip": "01803", + "country": "United States" + }, + "sameBillingAddress": false, + "billingAddress": + { + "firstName": "Jimmy Blue", + "lastName": "Ochsenknecht", + "company": "Ochsenknecht Records", + "street": "9 Floor St", + "city": "Los Angeles", + "state": "California", + "zip": "00018", + "country": "United States" + } + }, + { + "topCategory": "header.topNavigation.2.title", + "resultPosition": "2", + "sizeProduct": "16 x 12 in", + "styleProduct": "matte", + "creditCard": + { + "fullName": "Erik Range", + "cardNumber": "4111111111111111", + "crypticCardNumber": "xxxx xxxx xxxx 1111", + "expDateMonth": "05", + "expDateYear": "2028" + }, + "shippingAddress": + { + "firstName": "Gregor", + "lastName": "Onkh", + "company": "Ocha-Ocha GmbH", + "street": "Lizardstraße 77", + "city": "Braunschweig", + "state": "Niedersachsen", + "zip": "38100", + "country": "Germany" + }, + "sameBillingAddress": true } ] From 249b1105c52505df6ed803523b6858de1098e5ab Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 7 Aug 2023 14:14:58 +0200 Subject: [PATCH 23/44] extended validation for LoginPage and RegisterPage, improved GuestOrderTest --- config/localization.yaml | 40 ++++-- .../java/posters/flows/DeleteUserFlow.java | 6 +- .../java/posters/flows/OpenLoginPageFlow.java | 2 +- .../pageobjects/components/UserMenu.java | 19 +-- .../pageobjects/pages/AbstractPageObject.java | 8 ++ .../pageobjects/pages/browsing/HomePage.java | 22 ++-- .../pages/checkout/AbstractCheckoutPage.java | 8 -- .../pages/checkout/ShippingAddressPage.java | 50 ++++++-- .../pageobjects/pages/user/LoginPage.java | 115 ++++++++---------- .../pageobjects/pages/user/RegisterPage.java | 90 +++++++------- src/test/java/posters/tests/AbstractTest.java | 35 +++++- .../posters/tests/smoke/GuestOrderTest.java | 53 +++++--- .../posters/tests/smoke/RegisterTest.java | 24 ++-- .../tests/smoke/RegisteredOrderTest.java | 2 +- .../tests/testdata/dataobjects/Address.java | 26 +--- .../tests/testdata/dataobjects/User.java | 29 ----- .../processes/GuestOrderTestData.java | 31 +++++ .../posters/tests/smoke/GuestOrderTest.json | 70 +++++++++-- 18 files changed, 362 insertions(+), 268 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index f293a83d..ad11613e 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -145,22 +145,36 @@ default: OrderConfirmationPage: thankYouMessage: Thank you for purchasing, Your order is complete button: Continue Shopping - AccountPages: - email: Email address* - firstName: First name* - lastName: Last name* - password: Password* - passwordRepeat: Repeat password* - yourEmail: Your email* - yourPassword: Your password* - signIn: Sign in + LoginPage: + title: Sign-In + headlines: + email: YOUR EMAIL* + password: YOUR PASSWORD* + placeholder: + email: Email address + password: Password + button: Sign in newCustomer: New customer - createAccount: Create account createNewAccount: Create new Account validation: - successfulAccountCreation: Your account has been created. Log in with your email address and password. - emailDoesNotExistError: The email address you entered doesn't exist. Please try again. - incorrectPasswordError: The password you entered is incorrect. Please try again. + successfulRegistration: Your account has been created. Log in with your email address and password. + emailDoesNotExist: The email address you entered doesn't exist. Please try again. + incorrectPassword: The password you entered is incorrect. Please try again. + RegisterPage: + title: Create an account + headlines: + firstName: FIRST NAME* + lastName: LAST NAME* + email: EMAIL ADDRESS* + password: PASSWORD* + passwordRepeat: REPEAT PASSWORD* + placeholder: + firstName: First name + lastName: Last name + email: Email address + password: Password + passwordRepeat: Confirm password + button: Create account AddressPages: breadcrumb: cart: CART/ diff --git a/src/test/java/posters/flows/DeleteUserFlow.java b/src/test/java/posters/flows/DeleteUserFlow.java index 19a1ba3d..944fce34 100644 --- a/src/test/java/posters/flows/DeleteUserFlow.java +++ b/src/test/java/posters/flows/DeleteUserFlow.java @@ -14,9 +14,9 @@ public static LoginPage flow(User user) // ensure that the user is logged in var loginPage = new LoginPage(); - if (!homePage.userMenu.isLoggedIn()) + if (!homePage.userMenu.validateIsLoggedIn()) { - loginPage = homePage.userMenu.openLogin(); + loginPage = homePage.userMenu.openLoginPage(); homePage = loginPage.sendLoginform(user); } @@ -36,7 +36,7 @@ public static LoginPage flow(User user) homePage.validateSuccessfulDeletedAccount(); // verify that the account is not available anymore - loginPage = homePage.userMenu.openLogin(); + loginPage = homePage.userMenu.openLoginPage(); loginPage.validateStructure(); loginPage.sendFalseLoginform(user); loginPage.validateWrongEmail(user.getEmail()); diff --git a/src/test/java/posters/flows/OpenLoginPageFlow.java b/src/test/java/posters/flows/OpenLoginPageFlow.java index 663aa7f3..bea41038 100644 --- a/src/test/java/posters/flows/OpenLoginPageFlow.java +++ b/src/test/java/posters/flows/OpenLoginPageFlow.java @@ -12,7 +12,7 @@ public static LoginPage flow() var homePage = OpenHomePageFlow.flow(); // open login page and check for expected page - var loginPage = homePage.userMenu.openLogin(); + var loginPage = homePage.userMenu.openLoginPage(); loginPage.isExpectedPage(); return loginPage.isExpectedPage(); diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index 81d6c120..cec0a2e8 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -46,6 +46,14 @@ public void closeUserMenu() $("#brand").hover(); userMenu.waitUntil(not(visible), Neodymium.configuration().selenideTimeout()); } + + @Step("open login page from user menu") + public LoginPage openLoginPage() + { + openUserMenu(); + userMenu.find(".goToLogin").scrollTo().click(); + return new LoginPage().isExpectedPage(); + } /// ----- validate user menu ----- /// @@ -88,7 +96,7 @@ public void validateNotLoggedIn() } @Step("validate that somebody is logged in") - public boolean isLoggedIn() + public boolean validateIsLoggedIn() { return userMenu.find(".goToAccountOverview").exists(); } @@ -98,14 +106,7 @@ public boolean isLoggedIn() - // TODO - check if needed - @Step("open login page from user menu") - public LoginPage openLogin() - { - openUserMenu(); - userMenu.find(".goToLogin").scrollTo().click(); - return new LoginPage().isExpectedPage(); - } + // TODO - check if needed @Step("open account page from user menu") diff --git a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java index c224bc8e..b06da998 100644 --- a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java +++ b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java @@ -74,4 +74,12 @@ public void validateProcessWrap() $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); } + + /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage, LoginPage ----- /// + + @Step("validate required string") + public void validateRequiredString() + { + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index e5196dac..ee972e33 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -33,6 +33,8 @@ public HomePage isExpectedPage() return this; } + /// ----- validate homepage ----- /// + @Step("validate poster slide") public void validatePosterSlide() { @@ -101,6 +103,16 @@ public void validateStructure() $("a.btn-primary-shop").shouldHave(exactText(Neodymium.localizedText("HomePage.shopAllProducts"))).shouldBe(visible); } + @Step("validate successful login on home page") + public void validateSuccessfulLogin(String firstName) + { + // validate success message + successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulLogin")); + + // validate {firstName} in user menu + userMenu.validateLoggedInName(firstName); + } + // -------------------------------------------------- @Step("validate successful order on home page") @@ -111,16 +123,6 @@ public void validateSuccessfulOrder() miniCart.validateTotalCount(0); miniCart.validateSubtotal("$0.00"); } - - @Step("validate successful login on home page") - public void validateSuccessfulLogin(String firstName) - { - // Verify that you are logged in - successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulLogin")); - // Verify that the user menu shows your first name - userMenu.validateLoggedInName(firstName); - - } @Step("validate successful user login on home page") public void validateSuccessfulLogin(User user) diff --git a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java index b69b101c..657aa2cb 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java @@ -48,14 +48,6 @@ public void validateBreadcrumb() $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); } - /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage ----- /// - - @Step("validate required string") - public void validateRequiredString() - { - $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); - } - /// ----- ShippingAddressPage, BillingAddressPage ----- /// @Step("validate fill-in form headlines") diff --git a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java index 2c092e2a..7a8bda38 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java @@ -74,18 +74,18 @@ public void validateStructure() /// ----- send shipping address form ----- /// @Step("fill and send shipping address form") - public BillingAddressPage sendShippingAddressForm(Address shippingAddress, boolean sameBillingAddress) + public BillingAddressPage sendShippingAddressForm(Address shippingAddress) { String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); return sendShippingAddressForm(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), - shippingAddress.getCountry(), sameBillingAddress); + shippingAddress.getCountry()); } @Step("fill and send shipping address form") public BillingAddressPage sendShippingAddressForm(String name, String company, String address, String city, - String state, String zip, String country, boolean sameBillingAddress) + String state, String zip, String country) { // enter parameters $("#fullName").val(name); @@ -95,22 +95,46 @@ public BillingAddressPage sendShippingAddressForm(String name, String company, S $("#state").val(state); $("#zip").val(zip); $("#country").selectOption(country); - - // check if shipping address and billing address is equal - if (sameBillingAddress) - { - $("#billEqualShipp-Yes").scrollTo().click(); - } - else - { - $("#billEqualShipp-No").scrollTo().click(); - } + + $("#billEqualShipp-No").scrollTo().click(); // click on "Continue" button addShippingButton.scrollTo().click(); return new BillingAddressPage().isExpectedPage(); } + + @Step("fill and send shipping address form") + public PaymentPage sendShippingAddressForm2(Address shippingAddress) + { + String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); + + return sendShippingAddressForm2(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), + shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), + shippingAddress.getCountry()); + } + + @Step("fill and send shipping address form") + public PaymentPage sendShippingAddressForm2(String name, String company, String address, String city, + String state, String zip, String country) + { + // enter parameters + $("#fullName").val(name); + $("#company").val(company); + $("#addressLine").val(address); + $("#city").val(city); + $("#state").val(state); + $("#zip").val(zip); + $("#country").selectOption(country); + + $("#billEqualShipp-Yes").scrollTo().click(); + + // click on "Continue" button + addShippingButton.scrollTo().click(); + + return new PaymentPage().isExpectedPage(); + } + // --------------------------------------------------------------- diff --git a/src/test/java/posters/pageobjects/pages/user/LoginPage.java b/src/test/java/posters/pageobjects/pages/user/LoginPage.java index c9a66141..bb1f8368 100644 --- a/src/test/java/posters/pageobjects/pages/user/LoginPage.java +++ b/src/test/java/posters/pageobjects/pages/user/LoginPage.java @@ -1,11 +1,12 @@ package posters.pageobjects.pages.user; +import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exactValue; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -36,72 +37,76 @@ public LoginPage isExpectedPage() return this; } + /// ----- validate login page ----- /// + @Override @Step("validate login page structure") public void validateStructure() { super.validateStructure(); - // Login headline - // Make sure the Headline is there and starts with a capital letter followed by at least 3 more symbols. - loginForm.find(".h2fwpr").should(matchText("[A-Z].{3,}")); - // Email field - // Asserts the Email field has a label displaying the value. - loginForm.find("label.control-label[for=email]").shouldHave(exactText(Neodymium.localizedText("AccountPages.yourEmail"))); - // Asserts the email field is present. - emailField.shouldBe(visible); - // Password field - // Verifies the password field has a label displaying the value. - loginForm.find("label.control-label[for=password]").shouldHave(exactText(Neodymium.localizedText("AccountPages.yourPassword"))); - // Asserts the password field is there. - passwordField.shouldBe(visible); - // Login button - // asserts the login button displays the value. - signInButton.shouldHave(exactText(Neodymium.localizedText("AccountPages.signIn"))); - // Register headline - // Asserts the Headline for the Registration is there. - $(".header-container .h2fwpr").shouldHave(exactText(Neodymium.localizedText("AccountPages.newCustomer"))); - // Registration page link - // Asserts the Register link is there and shows the correct text. - registerLink.shouldHave(exactText(Neodymium.localizedText("AccountPages.createNewAccount"))); + // validate title + loginForm.find("legend").shouldHave(exactText(Neodymium.localizedText("LoginPage.title"))).shouldBe(visible); + + // validate fill in headlines + $$("#formLogin .form-group label").findBy(exactText(Neodymium.localizedText("LoginPage.headlines.email"))).shouldBe(visible); + $$("#formLogin .form-group label").findBy(exactText(Neodymium.localizedText("LoginPage.headlines.password"))).shouldBe(visible); + + // validate fill in placeholder + emailField.shouldHave(attribute("placeholder", (Neodymium.localizedText("LoginPage.placeholder.email")))).shouldBe(visible); + passwordField.shouldHave(attribute("placeholder", (Neodymium.localizedText("LoginPage.placeholder.password")))).shouldBe(visible); + + // validate "required fields" string + validateRequiredString(); + + // validate sign in button + signInButton.shouldHave(exactText(Neodymium.localizedText("LoginPage.button"))); + + // validate new account creation + $(".header-container").shouldHave(exactText(Neodymium.localizedText("LoginPage.newCustomer"))); + registerLink.shouldHave(exactText(Neodymium.localizedText("LoginPage.createNewAccount"))); } - + + @Step("validate successful registration message") + public void validateSuccessfulRegistration() + { + successMessage.validateSuccessMessage(Neodymium.localizedText("LoginPage.validation.successfulRegistration")); + } + + /// ----- login page navigation ----- /// + + @Step("open register page from login page") + public RegisterPage openRegister() + { + registerLink.scrollTo().click(); + return new RegisterPage().isExpectedPage(); + } + @Step("send login form") public void sendFormWithData(String email, String password) { - // Input email - // Fill the email field with the parameter. + // fill out the login form emailField.val(email); - // Input password - // Fill the password field with the parameter. passwordField.val(password); - // Log in and open the homepage - // Click on the Sign In button. + + // click on the Sign In button. signInButton.scrollTo().click(); } - - /** - * @param email - * The email of the account you want to log into - * @param password - * The password of the account you want to log into - */ - @Step("send login form with valid data") + + @Step("send login form with valid user data") + public HomePage sendLoginform(User user) + { + return sendLoginform(user.getEmail(), user.getPassword()); + } + + @Step("send login form with valid user data") public HomePage sendLoginform(String email, String password) { sendFormWithData(email, password); return new HomePage().isExpectedPage(); } - /** - * @param user - * @return - */ - @Step("send login form with valid user data") - public HomePage sendLoginform(User user) - { - return sendLoginform(user.getEmail(), user.getPassword()); - } + // ----------------------------------------------------------- /** * @param user @@ -113,22 +118,6 @@ public LoginPage sendFalseLoginform(User user) return new LoginPage().isExpectedPage(); } - /** - * @return - */ - @Step("open register page from login page") - public RegisterPage openRegister() - { - registerLink.scrollTo().click(); - return new RegisterPage().isExpectedPage(); - } - - @Step("validate successful registration message") - public void validateSuccessfulRegistration() - { - successMessage.validateSuccessMessage(Neodymium.localizedText("AccountPages.validation.successfulAccountCreation")); - } - /** * @param eMail */ diff --git a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java index 33155d13..bec56a57 100644 --- a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java +++ b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java @@ -1,10 +1,12 @@ package posters.pageobjects.pages.user; +import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -18,9 +20,9 @@ public class RegisterPage extends AbstractBrowsingPage private SelenideElement registerForm = $("#formRegister"); - private SelenideElement firstnameField = $("#firstName"); + private SelenideElement firstNameField = $("#firstName"); - private SelenideElement lastnameField = $("#lastName"); + private SelenideElement lastNameField = $("#lastName"); private SelenideElement emailField = $("#eMail"); @@ -39,61 +41,63 @@ public RegisterPage isExpectedPage() return this; } + /// ----- validate register page ----- /// + + @Step("validate fill in form headlines") + public void validateFillInHeadlines() + { + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.firstName"))).shouldBe(visible); + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.lastName"))).shouldBe(visible); + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.email"))).shouldBe(visible); + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.password"))).shouldBe(visible); + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.passwordRepeat"))).shouldBe(visible); + } + + @Step("validate fill in form placeholder") + public void validateFillInPlaceholder() + { + firstNameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.firstName")))).shouldBe(visible); + lastNameField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.lastName")))).shouldBe(visible); + emailField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.email")))).shouldBe(visible); + passwordField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.password")))).shouldBe(visible); + passwordRepeatField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.passwordRepeat")))).shouldBe(visible); + } + @Override @Step("validate register page structure") public void validateStructure() { super.validateStructure(); - // Login headline - // Make sure the Headline is there and starts with a capital letter followed by at least 3 more symbols. - registerForm.find(".h2fwpr").should(matchText("[A-Z].{3,}")); - // Form - // Asserts the label belonging to the last name field displays the correct text - $("label[for='lastName']").shouldHave(exactText(Neodymium.localizedText("AccountPages.lastname"))); - // Make sure the field to type in the last name is visible. - lastnameField.shouldBe(visible); - // Asserts the label belonging to the first name field displays the correct text - $("label[for='firstName']").shouldHave(exactText(Neodymium.localizedText("AccountPages.firstname"))); - // Make sure the field to type in the first name is visible. - firstnameField.shouldBe(visible); - // Asserts the label belonging to the email field displays the correct text - $("label[for='eMail']").shouldHave(exactText(Neodymium.localizedText("AccountPages.email"))); - // Make sure the field to type in the e-Mail is visible. - emailField.shouldBe(visible); - // Asserts the label belonging to the password field displays the correct text - $("label[for='password']").shouldHave(exactText(Neodymium.localizedText("AccountPages.password"))); - // Make sure the field to type in the password is visible. - passwordField.shouldBe(visible); - // Asserts the label belonging to the second password field displays the correct text - $("label[for='passwordAgain']").shouldHave(exactText(Neodymium.localizedText("AccountPages.passwordRepeat"))); - // Make sure the field to type in the password again is visible. - passwordRepeatField.shouldBe(visible); - // Register button - // Make sure the Registration button displays the correct text. - registerButton.shouldHave(exactText(Neodymium.localizedText("AccountPages.createAccount"))); + // validate title + registerForm.find("legend").shouldHave(exactText(Neodymium.localizedText("RegisterPage.title"))).shouldBe(visible); + + // validate fill in headlines + validateFillInHeadlines(); + + // validate fill in placeholder + validateFillInPlaceholder(); + + // validate "required fields" string + validateRequiredString(); + + // validate sign in button + registerButton.shouldHave(exactText(Neodymium.localizedText("RegisterPage.button"))); } - /** - * @param user - * The User data of the account you want to log into - */ + /// ----- register page navigation ----- /// + @Step("fill and send register form") public LoginPage sendRegisterForm(User user) { - // Fill out the registration form - // Type the last name parameter into the last name field. - lastnameField.val(user.getLastName()); - // Type the first name parameter into the first name field. - firstnameField.val(user.getFirstName()); - // Type the email parameter into the email field. + // fill out the registration form + lastNameField.val(user.getLastName()); + firstNameField.val(user.getFirstName()); emailField.val(user.getEmail()); - // Type the password parameter into the password field. passwordField.val(user.getPassword()); - // Type the second password parameter into the second password field. passwordRepeatField.val(user.getPassword()); - // Register and open the login page if successful - // Click on the Register Button + + // click on the Register Button registerButton.scrollTo().click(); return new LoginPage().isExpectedPage(); diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index edee2c4d..c10357f7 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -12,6 +12,10 @@ import posters.tests.testdata.processes.AddToCartTestData; import posters.tests.testdata.processes.BrowseTestData; import posters.tests.testdata.processes.GuestOrderTestData; +import posters.tests.testdata.dataobjects.Address; +import posters.tests.testdata.dataobjects.CreditCard; +import posters.tests.testdata.dataobjects.Product; +import posters.tests.testdata.dataobjects.User; import posters.tests.testdata.pageobjects.components.HeaderTestData; import posters.tests.testdata.pageobjects.components.PaginationTestData; import posters.tests.testdata.pageobjects.components.SearchTestData; @@ -20,24 +24,47 @@ @Browser("Chrome_1024x768") public abstract class AbstractTest { - protected HeaderTestData headerTestData; + /// ----- dataobjects ----- /// + protected Address addressData; + + protected CreditCard creditCardData; + + protected Product productData; + + protected User userData; + + /// ----- components ----- /// + + protected HeaderTestData headerTestData; + protected PaginationTestData paginationTestData; - + protected SearchTestData searchTestData; + /// ----- processes ----- /// + protected AddToCartTestData addToCartTestData; - + protected BrowseTestData browseTestData; - + protected GuestOrderTestData guestOrderTestData; @Before public void setup() { + // dataobjects + addressData = DataUtils.get(Address.class); + creditCardData = DataUtils.get(CreditCard.class); + productData = DataUtils.get(Product.class); + userData = DataUtils.get(User.class); + + // components headerTestData = DataUtils.get(HeaderTestData.class); paginationTestData = DataUtils.get(PaginationTestData.class); searchTestData = DataUtils.get(SearchTestData.class); + + // processes addToCartTestData = DataUtils.get(AddToCartTestData.class); browseTestData = DataUtils.get(BrowseTestData.class); guestOrderTestData = DataUtils.get(GuestOrderTestData.class); diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index 3d993855..6a04a231 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -3,16 +3,15 @@ import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; -import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; -import posters.tests.testdata.dataobjects.Address; -import posters.tests.testdata.dataobjects.CreditCard; import posters.flows.OpenHomePageFlow; +import posters.pageobjects.pages.checkout.PaymentPage; +import posters.pageobjects.pages.checkout.PlaceOrderPage; import posters.tests.AbstractTest; @Owner("Joe Fix") @@ -20,18 +19,14 @@ @Tag("smoke") @Tag("registered") public class GuestOrderTest extends AbstractTest -{ +{ @Test @DataSet(1) + @DataSet(2) public void testOrderingAsGuest() - { + { final String shippingCosts = Neodymium.dataValue("shippingCosts"); - final var shippingAddress = DataUtils.get(Address.class); - final boolean sameBillingAddress = false; - final var billingAddress = DataUtils.get(Address.class); - final var creditCard = DataUtils.get(CreditCard.class); - // go to homepage var homePage = OpenHomePageFlow.flow(); @@ -50,25 +45,43 @@ public void testOrderingAsGuest() var shippingAddressPage = cartPage.openShippingAddressPage(); shippingAddressPage.validateStructure(); - // go to billing address page and validate - var billingAddressPage = shippingAddressPage.sendShippingAddressForm(shippingAddress, sameBillingAddress); - billingAddressPage.validateStructure(); + // declare variables used in if + PaymentPage paymentPage; + PlaceOrderPage placeOrderPage; + + if (!guestOrderTestData.getShipAndBillAddressAreEqual()) + { + // go to billing address page and validate + var billingAddressPage = shippingAddressPage.sendShippingAddressForm(guestOrderTestData.getShippingAddress()); + billingAddressPage.validateStructure(); - // go to payment page and validate - var paymentPage = billingAddressPage.sendBillingAddressForm(billingAddress); - //paymentPage.validateStructure(); + // go to payment page and validate + paymentPage = billingAddressPage.sendBillingAddressForm(guestOrderTestData.getBillingAddress()); + paymentPage.validateStructure(); + + // go to place order page and validate order overview + placeOrderPage = paymentPage.sendPaymentForm(guestOrderTestData.getCreditCard()); + placeOrderPage.validateOrderOverview(guestOrderTestData.getShippingAddress(), guestOrderTestData.getBillingAddress(), guestOrderTestData.getCreditCard()); + } + else + { + // got to payment page and validate + paymentPage = shippingAddressPage.sendShippingAddressForm2(guestOrderTestData.getShippingAddress()); + paymentPage.validateStructure(); + + // go to place order page and validate order overview + placeOrderPage = paymentPage.sendPaymentForm(guestOrderTestData.getCreditCard()); + placeOrderPage.validateOrderOverview(guestOrderTestData.getShippingAddress(), guestOrderTestData.getShippingAddress(), guestOrderTestData.getCreditCard()); + } - // go to place order page and validate - var placeOrderPage = paymentPage.sendPaymentForm(creditCard); placeOrderPage.validateStructure(); - placeOrderPage.validateOrderOverview(shippingAddress, billingAddress, creditCard); placeOrderPage.validateProduct(1, product); placeOrderPage.validatePriceSummary(placeOrderPage.getSubtotal(), shippingCosts); // go to order confirmation page and validate var orderConfirmationPage = placeOrderPage.placeOrder(); orderConfirmationPage.validateStructure(); - + // go to homepage homePage = orderConfirmationPage.openHomePage(); } diff --git a/src/test/java/posters/tests/smoke/RegisterTest.java b/src/test/java/posters/tests/smoke/RegisterTest.java index 0c53d2b3..e45c9375 100644 --- a/src/test/java/posters/tests/smoke/RegisterTest.java +++ b/src/test/java/posters/tests/smoke/RegisterTest.java @@ -4,8 +4,8 @@ import org.junit.Before; import org.junit.Test; -import com.xceptance.neodymium.module.statement.browser.multibrowser.Browser; import com.xceptance.neodymium.module.statement.testdata.DataSet; +import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; @@ -21,8 +21,7 @@ @Severity(SeverityLevel.CRITICAL) @Tag("smoke") @Tag("registered") -//@Browser("Chrome_1024x768") -@Browser("Firefox_1024x768") +@SuppressDataSets public class RegisterTest extends AbstractTest { private User user; @@ -35,29 +34,24 @@ public void setup() @Test @DataSet(2) - @DataSet(4) - @DataSet(id = "Jim's test") +// @DataSet(4) +// @DataSet(6) public void testRegistering() { - // Go to homepage + // go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validateStructure(); - // Assure that nobody is logged in - homePage.userMenu.validateNotLoggedIn(); - - // Go to login form - var loginPage = homePage.userMenu.openLogin(); + // go to login page and validate + var loginPage = homePage.userMenu.openLoginPage(); loginPage.validateStructure(); - // Go to register form + // go to register page and validate var registerPage = loginPage.openRegister(); registerPage.validateStructure(); loginPage = registerPage.sendRegisterForm(user); loginPage.validateSuccessfulRegistration(); - loginPage.validateStructure(); - + homePage = loginPage.sendLoginform(user); homePage.validateSuccessfulLogin(user); } diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index e116430f..71dc40ca 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -42,7 +42,7 @@ public void testOrderingAsRegisteredUser() final String oldSubtotal = homePage.miniCart.getSubtotal(); // Go to login form - var loginPage = homePage.userMenu.openLogin(); + var loginPage = homePage.userMenu.openLoginPage(); loginPage.validateStructure(); final String email = Neodymium.dataValue("email"); final String password = Neodymium.dataValue("password"); diff --git a/src/test/java/posters/tests/testdata/dataobjects/Address.java b/src/test/java/posters/tests/testdata/dataobjects/Address.java index b3bc22e0..878cd273 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/Address.java +++ b/src/test/java/posters/tests/testdata/dataobjects/Address.java @@ -1,7 +1,7 @@ package posters.tests.testdata.dataobjects; public class Address -{ +{ String firstName; String lastName; @@ -17,20 +17,7 @@ public class Address String zip; String country; - - // needed??? - public Address(String firstName, String lastName, String company, String street, String city, String state, String zip, String country) - { - this.firstName = firstName; - this.lastName = lastName; - this.company = company; - this.street = street; - this.city = city; - this.state = state; - this.zip = zip; - this.country = country; - } - + public String getFirstName() { return firstName; @@ -70,11 +57,4 @@ public String getCountry() { return country; } - - @Override - public String toString() - { - return String.format("Address [firtName()=%s, lastName()=%s, company()=%s, street()=%s, zip()=%s, city()=%s, state()=%s, country()=%s]", - getFirstName(), getLastName(), getCompany(), getStreet(), getZip(), getCity(), getState(), getCountry()); - } -} +} \ No newline at end of file diff --git a/src/test/java/posters/tests/testdata/dataobjects/User.java b/src/test/java/posters/tests/testdata/dataobjects/User.java index 6b94e854..a820a481 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/User.java +++ b/src/test/java/posters/tests/testdata/dataobjects/User.java @@ -10,23 +10,6 @@ public class User String password; - /** - * - */ - public User() - { - } - - /** - * @param firstName - * the firstName to set - * @param lastName - * the lastName to set - * @param email - * the email to set - * @param password - * the password to set - */ public User(String firstName, String lastName, String email, String password) { this.firstName = firstName; @@ -35,33 +18,21 @@ public User(String firstName, String lastName, String email, String password) this.password = password; } - /** - * @return the firstName - */ public String getFirstName() { return firstName; } - /** - * @return the lastName - */ public String getLastName() { return lastName; } - /** - * @return the email - */ public String getEmail() { return email; } - /** - * @return the password - */ public String getPassword() { return password; diff --git a/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java b/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java index 83987282..96e9e975 100644 --- a/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java +++ b/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java @@ -1,5 +1,8 @@ package posters.tests.testdata.processes; +import posters.tests.testdata.dataobjects.Address; +import posters.tests.testdata.dataobjects.CreditCard; + public class GuestOrderTestData { private String topCategory; @@ -10,6 +13,14 @@ public class GuestOrderTestData private String styleProduct; + private Address shippingAddress; + + private Boolean sameBillingAddress; + + private Address billingAddress; + + private CreditCard creditCard; + public String getTopCategory() { return topCategory; @@ -29,4 +40,24 @@ public String getStyleProduct() { return styleProduct; } + + public Address getShippingAddress() + { + return shippingAddress; + } + + public Boolean getShipAndBillAddressAreEqual() + { + return sameBillingAddress; + } + + public Address getBillingAddress() + { + return billingAddress; + } + + public CreditCard getCreditCard() + { + return creditCard; + } } \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/GuestOrderTest.json b/src/test/resources/posters/tests/smoke/GuestOrderTest.json index ed1d6f93..b4e09838 100644 --- a/src/test/resources/posters/tests/smoke/GuestOrderTest.json +++ b/src/test/resources/posters/tests/smoke/GuestOrderTest.json @@ -4,18 +4,62 @@ "resultPosition": "5", "sizeProduct": "64 x 48 in", "styleProduct": "gloss", - "firstName": "Jimmy Blue", - "lastName": "Ochsenknecht", - "company": "Ochsenknecht Records", - "street": "6 Wall St", - "city": "Burlington", - "state": "Massachusetts", - "zip": "01803", - "country": "United States", - "fullName": "Jimmy Blue", - "cardNumber": "4111111111111111", - "crypticCardNumber": "xxxx xxxx xxxx 1111", - "expDateMonth": "04", - "expDateYear": "2023" + "creditCard": + { + "fullName": "Jimmy Blue", + "cardNumber": "4111111111111111", + "crypticCardNumber": "xxxx xxxx xxxx 1111", + "expDateMonth": "12", + "expDateYear": "2026" + }, + "shippingAddress": + { + "firstName": "Jimmy Blue", + "lastName": "Ochsenknecht", + "company": "Ochsenknecht Records", + "street": "6 Wall St", + "city": "Burlington", + "state": "Massachusetts", + "zip": "01803", + "country": "United States" + }, + "sameBillingAddress": false, + "billingAddress": + { + "firstName": "Jimmy Blue", + "lastName": "Ochsenknecht", + "company": "Ochsenknecht Records", + "street": "9 Floor St", + "city": "Los Angeles", + "state": "California", + "zip": "00018", + "country": "United States" + } + }, + { + "topCategory": "header.topNavigation.2.title", + "resultPosition": "2", + "sizeProduct": "16 x 12 in", + "styleProduct": "matte", + "creditCard": + { + "fullName": "Erik Range", + "cardNumber": "4111111111111111", + "crypticCardNumber": "xxxx xxxx xxxx 1111", + "expDateMonth": "05", + "expDateYear": "2028" + }, + "shippingAddress": + { + "firstName": "Gregor", + "lastName": "Onkh", + "company": "Ocha-Ocha GmbH", + "street": "Lizardstraße 77", + "city": "Braunschweig", + "state": "Niedersachsen", + "zip": "38100", + "country": "Germany" + }, + "sameBillingAddress": true } ] From 0b237528ef1a38c7be9415d0f3becac69077369e Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Tue, 8 Aug 2023 14:02:07 +0200 Subject: [PATCH 24/44] finished RegisterTest.java --- config/localization.yaml | 128 ++++++++++-------- .../java/posters/flows/DeleteUserFlow.java | 31 ++--- .../pageobjects/components/ErrorMessage.java | 4 +- .../components/SuccessMessage.java | 6 +- .../pageobjects/components/UserMenu.java | 58 +++----- .../pageobjects/pages/browsing/HomePage.java | 18 +-- .../pages/browsing/NoHitsPage.java | 4 +- .../pages/checkout/BillingAddressPage.java | 2 +- .../pages/checkout/ShippingAddressPage.java | 2 +- .../pages/user/AccountOverviewPage.java | 76 ++++++----- .../pages/user/DeleteAccountPage.java | 40 +++--- .../pageobjects/pages/user/LoginPage.java | 41 +++--- .../pages/user/MyAddressesPage.java | 38 ++++++ .../pages/user/PaymentSettingsPage.java | 38 ++++++ .../pages/user/PersonalDataPage.java | 55 ++++---- .../tests/smoke/RegisterFromUserMenuTest.java | 59 -------- .../posters/tests/smoke/RegisterTest.java | 33 ++--- .../tests/smoke/RegisteredOrderTest.java | 2 +- .../java/posters/tests/unit/LoginTest.java | 12 +- .../tests/smoke/RegisterFromUserMenuTest.json | 9 -- 20 files changed, 328 insertions(+), 328 deletions(-) create mode 100644 src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java create mode 100644 src/test/java/posters/pageobjects/pages/user/PaymentSettingsPage.java delete mode 100644 src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java delete mode 100644 src/test/resources/posters/tests/smoke/RegisterFromUserMenuTest.json diff --git a/config/localization.yaml b/config/localization.yaml index ad11613e..d5e499c0 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -78,7 +78,7 @@ default: goToFirstPage: "<<" NoHitsPage: validation: - noProductsFound: × Sorry! No results found matching your search. Please try again. + noProductsFound: Sorry! No results found matching your search. Please try again. ProductdetailPage: size: "16x12": 16 x 12 in @@ -93,12 +93,58 @@ default: CartPage: title: Cart errorMessage: Your cart is empty. Continue shopping. - ShippingAddressPage: - fillIn: - title: Enter a shipping address - BillingAddressPage: + AddressPages: + breadcrumb: + cart: CART/ + shippingAddress: SHIPPING ADDRESS / + billingAddress: BILLING ADDRESS / + payment: PAYMENT / + placeOrder: PLACE ORDER / + processWrap: + "1": + number: "01" + name: SHOPPING CART + "2": + number: "02" + name: SHIPPING ADDRESS + "3": + number: "03" + name: BILLING ADDRESS + "4": + number: "04" + name: PAYMENT METHOD + "5": + number: "05" + name: CHECKOUT + "6": + number: "06" + name: ORDER COMPLETE fillIn: - title: Enter a billing address + title: + shipping: Enter a shipping address + billing: Enter a billing address + headlines: + fullName: FULL NAME* + company: COMPANY + address: ADDRESS* + city: CITY* + state: STATE/PROVINCE* + zip: ZIP/POSTAL CODE* + country: COUNTRY* + useAddressForBilling: "Use this address for billing?*" + requiredFields: "* Required fields" + placeholder: + yourName: Your Name + companyName: company name + address: "Street address, Apartment, etc." + zip: "Zip / Postal" + dropdown: + usa: United States + germany: Germany + radio: + "yes": "YES" + "no": "NO" + button: Continue PaymentPage: fillIn: title: Enter a payment method @@ -175,55 +221,27 @@ default: password: Password passwordRepeat: Confirm password button: Create account - AddressPages: - breadcrumb: - cart: CART/ - shippingAddress: SHIPPING ADDRESS / - billingAddress: BILLING ADDRESS / - payment: PAYMENT / - placeOrder: PLACE ORDER / - processWrap: - "1": - number: "01" - name: SHOPPING CART - "2": - number: "02" - name: SHIPPING ADDRESS - "3": - number: "03" - name: BILLING ADDRESS - "4": - number: "04" - name: PAYMENT METHOD - "5": - number: "05" - name: CHECKOUT - "6": - number: "06" - name: ORDER COMPLETE - fillIn: - headlines: - fullName: FULL NAME* - company: COMPANY - address: ADDRESS* - city: CITY* - state: STATE/PROVINCE* - zip: ZIP/POSTAL CODE* - country: COUNTRY* - useAddressForBilling: "Use this address for billing?*" - requiredFields: "* Required fields" - placeholder: - yourName: Your Name - companyName: company name - address: "Street address, Apartment, etc." - zip: "Zip / Postal" - dropdown: - usa: United States - germany: Germany - radio: - "yes": "YES" - "no": "NO" - button: Continue + AccountOverviewPage: + title: My Account + button: + orderHistory: Order History + myAddresses: My Addresses + paymentSettings: Payment Settings + personalData: Personal Data + PersonalDataPage: + title: Personal Data + headlines: + name: Name + email: Email + buttons: + changeData: Change Name or Email + changePassword: Change your password + deleteAccount: Delete your account + DeleteAccontPage: + title: Delete your account + headline: YOUR PASSWORD* + placeholder: Password + button: Delete General: product: style: style diff --git a/src/test/java/posters/flows/DeleteUserFlow.java b/src/test/java/posters/flows/DeleteUserFlow.java index 944fce34..9c58e6c0 100644 --- a/src/test/java/posters/flows/DeleteUserFlow.java +++ b/src/test/java/posters/flows/DeleteUserFlow.java @@ -10,37 +10,30 @@ public class DeleteUserFlow @Step("delete user flow") public static LoginPage flow(User user) { - var homePage = new HomePage(); + HomePage homePage = new HomePage(); - // ensure that the user is logged in - var loginPage = new LoginPage(); - if (!homePage.userMenu.validateIsLoggedIn()) - { - loginPage = homePage.userMenu.openLoginPage(); - homePage = loginPage.sendLoginform(user); - } - - // go to account page - var accountOverviewPage = homePage.userMenu.openAccountOverview(); + // go to account page and validate + var accountOverviewPage = homePage.userMenu.openAccountOverviewPage(); accountOverviewPage.validateStructure(); - // go to personal data page + // go to personal data page and validate var personalDataPage = accountOverviewPage.openPersonalData(); personalDataPage.validateStructure(); + personalDataPage.validatePersonalData(user); - // go to account deletion page - var deleteAccountPage = personalDataPage.openDeleteAccount(); + // go to account deletion page and validate + var deleteAccountPage = personalDataPage.openDeleteAccountPage(); + deleteAccountPage.validateStructure(); - // delete the account + // delete the account and validate success message homePage = deleteAccountPage.deleteAccount(user.getPassword()); homePage.validateSuccessfulDeletedAccount(); // verify that the account is not available anymore - loginPage = homePage.userMenu.openLoginPage(); - loginPage.validateStructure(); - loginPage.sendFalseLoginform(user); + var loginPage = homePage.userMenu.openLoginPage(); + loginPage.sendFalseLoginForm(user); loginPage.validateWrongEmail(user.getEmail()); - + return loginPage.isExpectedPage(); } } diff --git a/src/test/java/posters/pageobjects/components/ErrorMessage.java b/src/test/java/posters/pageobjects/components/ErrorMessage.java index 41f8244f..40c02a1c 100644 --- a/src/test/java/posters/pageobjects/components/ErrorMessage.java +++ b/src/test/java/posters/pageobjects/components/ErrorMessage.java @@ -6,7 +6,6 @@ import static com.codeborne.selenide.Selenide.$; import com.codeborne.selenide.SelenideElement; -import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; @@ -24,7 +23,8 @@ public void isComponentAvailable() @Step("validate that the error message {message} is visible") public void validateErrorMessage(String message) { - errorMessage.shouldHave(exactText(Neodymium.localizedText(message))).shouldBe(visible); + errorMessage.find("strong").shouldHave(exactText(message)).shouldBe(visible); + errorMessage.find(".close").shouldHave(exactText("×")).shouldBe(visible); } @Step("validate that no error message is visible") diff --git a/src/test/java/posters/pageobjects/components/SuccessMessage.java b/src/test/java/posters/pageobjects/components/SuccessMessage.java index fc72f60b..7290fc4e 100644 --- a/src/test/java/posters/pageobjects/components/SuccessMessage.java +++ b/src/test/java/posters/pageobjects/components/SuccessMessage.java @@ -13,6 +13,8 @@ public class SuccessMessage extends AbstractComponent { private SelenideElement successMessage = $("#successMessage"); + @Override + @Step("ensure availability success message") public void isComponentAvailable() { successMessage.should(exist); @@ -21,7 +23,7 @@ public void isComponentAvailable() @Step("validate that the success message '{message}' is visible") public void validateSuccessMessage(String message) { - successMessage.shouldBe(visible); - successMessage.shouldHave(exactText("× " + message)); + successMessage.find("strong").shouldHave(exactText(message)).shouldBe(visible); + successMessage.find(".close").shouldHave(exactText("×")).shouldBe(visible); } } diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index cec0a2e8..fd4c4006 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -1,6 +1,5 @@ package posters.pageobjects.components; -import static com.codeborne.selenide.Condition.cssClass; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.not; @@ -8,7 +7,6 @@ import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; -import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -36,25 +34,41 @@ public void isComponentAvailable() @Step("open user menu") public void openUserMenu() { - showUserMenu.scrollTo().click(); - userMenu.waitUntil(visible, Neodymium.configuration().selenideTimeout()); + showUserMenu.hover(); + userMenu.waitUntil(visible, 9000); } @Step("close user menu") public void closeUserMenu() { $("#brand").hover(); - userMenu.waitUntil(not(visible), Neodymium.configuration().selenideTimeout()); + userMenu.waitUntil(not(visible), 9000); + } + + @Step("open register page from user menu") + public RegisterPage openRegisterPage() + { + openUserMenu(); + userMenu.find(".goToRegistration").click(); + return new RegisterPage().isExpectedPage(); } @Step("open login page from user menu") public LoginPage openLoginPage() { openUserMenu(); - userMenu.find(".goToLogin").scrollTo().click(); + userMenu.find(".goToLogin").click(); return new LoginPage().isExpectedPage(); } + @Step("open account page from user menu") + public AccountOverviewPage openAccountOverviewPage() + { + openUserMenu(); + userMenu.find(".goToAccountOverview").click(); + return new AccountOverviewPage().isExpectedPage(); + } + /// ----- validate user menu ----- /// @Step("validate logged in user menu") @@ -92,7 +106,7 @@ public static void validateGuestUserMenu() @Step("validate that nobody is logged in") public void validateNotLoggedIn() { - userMenu.find(".goToLogin").should(exist); + userMenu.find(".goToLogin").exists(); } @Step("validate that somebody is logged in") @@ -101,41 +115,11 @@ public boolean validateIsLoggedIn() return userMenu.find(".goToAccountOverview").exists(); } - - // --------------------------------------------------------------------- - - - - - - // TODO - check if needed - @Step("open account page from user menu") - public AccountOverviewPage openAccountOverview() - { - openUserMenu(); - userMenu.find(".goToAccountOverview").scrollTo().click(); - return new AccountOverviewPage().isExpectedPage(); - } - - // TODO - check if needed - @Step("open register page from user menu") - public RegisterPage openRegister() - { - openUserMenu(); - userMenu.find(".goToRegistration").scrollTo().click(); - return new RegisterPage().isExpectedPage(); - } - - // TODO - check if needed @Step("validate that '{firstName}' is logged in") public void validateLoggedInName(String firstName) { - // Click on the mini user menu symbol openUserMenu(); - // Asserts the Menu shows your first name. userMenu.find(".firstName").shouldHave(exactText(firstName)); closeUserMenu(); - // Makes sure the mini menu element has the "logged" class active instead of the "not-logged" class. - showUserMenu.find(".icon-user2").shouldHave(cssClass("logged")).shouldHave(exactText("")); } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index ee972e33..cb50df3e 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -113,6 +113,12 @@ public void validateSuccessfulLogin(String firstName) userMenu.validateLoggedInName(firstName); } + @Step("validate successful account deletion on home page") + public void validateSuccessfulDeletedAccount() + { + successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulAccountDeletion")); + } + // -------------------------------------------------- @Step("validate successful order on home page") @@ -123,18 +129,6 @@ public void validateSuccessfulOrder() miniCart.validateTotalCount(0); miniCart.validateSubtotal("$0.00"); } - - @Step("validate successful user login on home page") - public void validateSuccessfulLogin(User user) - { - validateSuccessfulLogin(user.getFirstName()); - } - - @Step("validate successful account deletion on home page") - public void validateSuccessfulDeletedAccount() - { - successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulAccountDeletion")); - } public void validateAndVisualAssert() { diff --git a/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java b/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java index f182c3b7..bdd9dc00 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java @@ -3,6 +3,8 @@ import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Selenide.$; +import com.xceptance.neodymium.util.Neodymium; + import io.qameta.allure.Step; public class NoHitsPage extends AbstractBrowsingPage @@ -19,7 +21,7 @@ public NoHitsPage isExpectedPage() @Step("validate that no products are on no hits page") public void validateNoProductsFound() { - errorMessage.validateErrorMessage("NoHitsPage.validation.noProductsFound"); + errorMessage.validateErrorMessage(Neodymium.localizedText("NoHitsPage.validation.noProductsFound")); } @Override diff --git a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java index a67ae45a..c7f0f4bc 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java @@ -40,7 +40,7 @@ public void validateStructure() //validateProcessWrap(); // validate title - title.shouldHave(exactText(Neodymium.localizedText("BillingAddressPage.fillIn.title"))).shouldBe(visible); + title.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.title.billing"))).shouldBe(visible); // validate fill form headline validateFillInHeadlines(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java index 7a8bda38..8df3df2b 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java @@ -50,7 +50,7 @@ public void validateStructure() //validateProcessWrap(); // validate title - title.shouldHave(exactText(Neodymium.localizedText("ShippingAddressPage.fillIn.title"))).shouldBe(visible); + title.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.title.shipping"))).shouldBe(visible); // validate fill in form headline validateFillInHeadlines(); diff --git a/src/test/java/posters/pageobjects/pages/user/AccountOverviewPage.java b/src/test/java/posters/pageobjects/pages/user/AccountOverviewPage.java index c76c8ddc..bffd740b 100644 --- a/src/test/java/posters/pageobjects/pages/user/AccountOverviewPage.java +++ b/src/test/java/posters/pageobjects/pages/user/AccountOverviewPage.java @@ -1,20 +1,25 @@ package posters.pageobjects.pages.user; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; +import static com.codeborne.selenide.Condition.exactText; +import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; -/** - * @author pfotenhauer - */ public class AccountOverviewPage extends AbstractBrowsingPage { - private SelenideElement headline = $("#titleAccountOverview"); + private SelenideElement title = $("#titleAccountOverview"); + + private SelenideElement orderOverviewLink = $("#linkOrderOverview"); + + private SelenideElement myAddressesLink = $("#linkAddressOverview"); + + private SelenideElement paymentSettingsLink = $("#linkPaymentOverview"); private SelenideElement personalDataLink = $("#linkSettingOverview"); @@ -23,48 +28,55 @@ public class AccountOverviewPage extends AbstractBrowsingPage public AccountOverviewPage isExpectedPage() { super.isExpectedPage(); - headline.should(exist); + title.should(exist); return this; } + /// ----- validate account overview page ----- /// + @Override @Step("validate account overview page structure") public void validateStructure() { super.validateStructure(); - // Headline - // Make sure the headline is there and start with a capital letter - headline.should(matchText("[A-Z].{3,}")); - // Order Overview Link - // Make sure the link to the order history is there and the text starts with a capital letter - $("#linkOrderOverview").should(matchText("[A-Z].{3,}")); - // My Addresses Link - // Make sure the link to the Addresses page is there and the text starts with a capital letter - $("#linkAddressOverview").should(matchText("[A-Z].{3,}")); - // Payment Settings Link - // Make sure the link to the Credit Cards page is there and the text starts with a capital letter - $("#linkPaymentOverview").should(matchText("[A-Z].{3,}")); - // Personal Data Link - // Make sure the link to the Personal Data page is there and the text starts with a capital letter - personalDataLink.should(matchText("[A-Z].{3,}")); + // validate title + title.shouldHave(exactText(Neodymium.localizedText("AccountOverviewPage.title"))).shouldBe(visible); + + // validate navigation buttons + orderOverviewLink.shouldHave(exactText(Neodymium.localizedText("AccountOverviewPage.button.orderHistory"))).shouldBe(visible); + myAddressesLink.shouldHave(exactText(Neodymium.localizedText("AccountOverviewPage.button.myAddresses"))).shouldBe(visible); + paymentSettingsLink.shouldHave(exactText(Neodymium.localizedText("AccountOverviewPage.button.paymentSettings"))).shouldBe(visible); + personalDataLink.shouldHave(exactText(Neodymium.localizedText("AccountOverviewPage.button.personalData"))).shouldBe(visible); } - /** - * @return - */ + /// ----- account overview page navigation ----- /// + + @Step("open order history page") + public OrderHistoryPage openOrderHistory() + { + orderOverviewLink.scrollTo().click(); + return new OrderHistoryPage().isExpectedPage(); + } + + @Step("open my addresses page") + public MyAddressesPage openMyAddresses() + { + myAddressesLink.scrollTo().click(); + return new MyAddressesPage().isExpectedPage(); + } + + @Step("open payment settings page") + public PaymentSettingsPage openPaymentSettings() + { + paymentSettingsLink.scrollTo().click(); + return new PaymentSettingsPage().isExpectedPage(); + } + @Step("open personal data page") public PersonalDataPage openPersonalData() { - // Open the personal data page - // Click on the link to Personal Data personalDataLink.scrollTo().click(); return new PersonalDataPage().isExpectedPage(); } - - public OrderHistoryPage openOrderHistory() - { - $("#linkOrderOverview").scrollTo().click(); - return new OrderHistoryPage().isExpectedPage(); - } } diff --git a/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java b/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java index 8178db7c..eae0b7c5 100644 --- a/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java +++ b/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java @@ -1,8 +1,8 @@ package posters.pageobjects.pages.user; +import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; @@ -13,9 +13,6 @@ import posters.pageobjects.pages.browsing.AbstractBrowsingPage; import posters.pageobjects.pages.browsing.HomePage; -/** - * @author pfotenhauer - */ public class DeleteAccountPage extends AbstractBrowsingPage { private SelenideElement deleteForm = $("#formDeleteAccount"); @@ -30,37 +27,42 @@ public DeleteAccountPage isExpectedPage() { super.isExpectedPage(); deleteForm.should(exist); + return this; } + /// ----- validate delete account page ----- /// + @Override @Step("validate delete account page structure") public void validateStructure() { super.validateStructure(); - // Headline - // Asserts the headline is there and starts with a capital letter - deleteForm.find(".h2").should(matchText("[A-Z].{3,}")); - // Password field - // Asserts the label belonging to the password field displays the correct text - $("label[for='password']").shouldBe(exactText(Neodymium.localizedText("AccountPages.yourPassword"))); - // Asserts the field to enter your password is there - passwordField.shouldBe(visible); - // Button - // Asserts the delete button is there - deleteButton.shouldBe(visible); + // validate title + deleteForm.find(".h2").shouldHave(exactText(Neodymium.localizedText("DeleteAccontPage.title"))).shouldBe(visible); + + // validate headline + $("label[for='password']").shouldBe(exactText(Neodymium.localizedText("DeleteAccontPage.headline"))); + + // validate placeholder + passwordField.shouldHave(attribute("placeholder", (Neodymium.localizedText("DeleteAccontPage.placeholder")))).shouldBe(visible); + + // validate "required fields" string + validateRequiredString(); + + // validate button + deleteButton.shouldHave(exactText(Neodymium.localizedText("DeleteAccontPage.button"))).shouldBe(visible); } + + /// ----- delete account page navigation ----- /// @Step("delete account") public HomePage deleteAccount(String password) { - // Password - // Type the parameter into the password field passwordField.setValue(password); - // Delete account and open the homepage - // click the confirmation button deleteButton.scrollTo().click(); + return new HomePage().isExpectedPage(); } } diff --git a/src/test/java/posters/pageobjects/pages/user/LoginPage.java b/src/test/java/posters/pageobjects/pages/user/LoginPage.java index bb1f8368..fdfc0e24 100644 --- a/src/test/java/posters/pageobjects/pages/user/LoginPage.java +++ b/src/test/java/posters/pageobjects/pages/user/LoginPage.java @@ -8,6 +8,8 @@ import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; +import org.junit.Assert; + import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -72,6 +74,13 @@ public void validateSuccessfulRegistration() { successMessage.validateSuccessMessage(Neodymium.localizedText("LoginPage.validation.successfulRegistration")); } + + @Step("validate invalid email for login error message") + public void validateWrongEmail(String email) + { + errorMessage.validateErrorMessage(Neodymium.localizedText("LoginPage.validation.emailDoesNotExist")); + Assert.assertEquals(emailField.val(), email); + } /// ----- login page navigation ----- /// @@ -94,39 +103,21 @@ public void sendFormWithData(String email, String password) } @Step("send login form with valid user data") - public HomePage sendLoginform(User user) + public HomePage sendLoginForm(User user) { - return sendLoginform(user.getEmail(), user.getPassword()); - } - - @Step("send login form with valid user data") - public HomePage sendLoginform(String email, String password) - { - sendFormWithData(email, password); + sendFormWithData(user.getEmail(), user.getPassword()); return new HomePage().isExpectedPage(); } - - // ----------------------------------------------------------- - - /** - * @param user - */ - @Step("send login form with erroneous user data") - public LoginPage sendFalseLoginform(User user) + + @Step("send login form with invalid user data") + public LoginPage sendFalseLoginForm(User user) { sendFormWithData(user.getEmail(), user.getPassword()); return new LoginPage().isExpectedPage(); } - /** - * @param eMail - */ - @Step("validate invalid email for login error message") - public void validateWrongEmail(String eMail) - { - errorMessage.validateErrorMessage(Neodymium.localizedText("AccountPages.validation.emailDoesNotExistError")); - emailField.shouldHave(exactValue(eMail)); - } + // ----------------------------------------------------------- + /** * @param eMail diff --git a/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java b/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java new file mode 100644 index 00000000..dbca7bfc --- /dev/null +++ b/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java @@ -0,0 +1,38 @@ +package posters.pageobjects.pages.user; + +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.matchText; +import static com.codeborne.selenide.Condition.visible; +import static com.codeborne.selenide.Selenide.$; + +import com.codeborne.selenide.SelenideElement; + +import io.qameta.allure.Step; +import posters.pageobjects.pages.browsing.AbstractBrowsingPage; + +public class MyAddressesPage extends AbstractBrowsingPage +{ +// private SelenideElement headline = $("#titlePersonalData"); +// +// private SelenideElement deleteButton = $("#btnDeleteAccount"); + + @Override + @Step("ensure this is a personal data page") + public MyAddressesPage isExpectedPage() + { +// super.isExpectedPage(); +// headline.should(exist); + return this; + } + + /// ----- validate my addresses page ----- /// + + @Override + @Step("validate personal data page structure") + public void validateStructure() + { + super.validateStructure(); + + // TODO + } +} \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/pages/user/PaymentSettingsPage.java b/src/test/java/posters/pageobjects/pages/user/PaymentSettingsPage.java new file mode 100644 index 00000000..c18eb6fd --- /dev/null +++ b/src/test/java/posters/pageobjects/pages/user/PaymentSettingsPage.java @@ -0,0 +1,38 @@ +package posters.pageobjects.pages.user; + +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.matchText; +import static com.codeborne.selenide.Condition.visible; +import static com.codeborne.selenide.Selenide.$; + +import com.codeborne.selenide.SelenideElement; + +import io.qameta.allure.Step; +import posters.pageobjects.pages.browsing.AbstractBrowsingPage; + +public class PaymentSettingsPage extends AbstractBrowsingPage +{ +// private SelenideElement headline = $("#titlePersonalData"); +// +// private SelenideElement deleteButton = $("#btnDeleteAccount"); + + @Override + @Step("ensure this is a personal data page") + public PaymentSettingsPage isExpectedPage() + { +// super.isExpectedPage(); +// headline.should(exist); + return this; + } + + /// ----- validate my addresses page ----- /// + + @Override + @Step("validate personal data page structure") + public void validateStructure() + { + super.validateStructure(); + + // TODO + } +} \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java b/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java index eea2048d..2b8862ba 100644 --- a/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java +++ b/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java @@ -1,21 +1,21 @@ package posters.pageobjects.pages.user; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; +import posters.tests.testdata.dataobjects.User; -/** - * @author pfotenhauer - */ public class PersonalDataPage extends AbstractBrowsingPage { - private SelenideElement headline = $("#titlePersonalData"); + private SelenideElement title = $("#titlePersonalData"); private SelenideElement deleteButton = $("#btnDeleteAccount"); @@ -24,36 +24,45 @@ public class PersonalDataPage extends AbstractBrowsingPage public PersonalDataPage isExpectedPage() { super.isExpectedPage(); - headline.should(exist); + title.should(exist); return this; } + /// ----- validate personal data page ----- /// + @Override @Step("validate personal data page structure") public void validateStructure() { super.validateStructure(); - // Headline - // Makes sure the headline is there and starts with a capital letter - headline.should(matchText("[A-Z].{3,}")); - // Data - // Makes sure the form with your user Data is there - $("#customerName").shouldBe(visible); - $("#customerEmail").shouldBe(visible); - // Delete Account Button - // Make sure the button to delete your account is there - deleteButton.shouldBe(visible); + // validate title + title.shouldHave(exactText(Neodymium.localizedText("PersonalDataPage.title"))).shouldBe(visible); + + // validate buttons + $("#btnChangeNameEmail").shouldHave(exactText(Neodymium.localizedText("PersonalDataPage.buttons.changeData"))).shouldBe(visible); + $("#btnChangePassword").shouldHave(exactText(Neodymium.localizedText("PersonalDataPage.buttons.changePassword"))).shouldBe(visible); + deleteButton.shouldHave(exactText(Neodymium.localizedText("PersonalDataPage.buttons.deleteAccount"))).shouldBe(visible); } - - /** - * @return - */ + + @Step("validate personal data") + public void validatePersonalData(User user) + { + // validate name + String fullName = user.getFirstName() + " " + user.getLastName(); + $$(".form-group strong").findBy(exactText(Neodymium.localizedText("PersonalDataPage.headlines.name"))).shouldBe(visible); + $("#customerName").shouldHave(exactText(fullName)).shouldBe(visible); + + // validate email + $$(".form-group strong").findBy(exactText(Neodymium.localizedText("PersonalDataPage.headlines.email"))).shouldBe(visible); + $("#customerEmail").shouldHave(exactText(user.getEmail())).shouldBe(visible); + } + + /// ----- personal data page navigation ----- /// + @Step("open delete account page from personal data page") - public DeleteAccountPage openDeleteAccount() + public DeleteAccountPage openDeleteAccountPage() { - // Open the delete account page - // Clicks the button to get to the Delete Account page deleteButton.scrollTo().click(); return new DeleteAccountPage().isExpectedPage(); } diff --git a/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java b/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java deleted file mode 100644 index 2377e964..00000000 --- a/src/test/java/posters/tests/smoke/RegisterFromUserMenuTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package posters.tests.smoke; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.xceptance.neodymium.util.DataUtils; - -import io.qameta.allure.Owner; -import io.qameta.allure.Severity; -import io.qameta.allure.SeverityLevel; -import io.qameta.allure.junit4.Tag; -import posters.tests.testdata.dataobjects.User; -import posters.flows.DeleteUserFlow; -import posters.flows.OpenHomePageFlow; -import posters.tests.AbstractTest; - -@Owner("Lisa Smith") -@Severity(SeverityLevel.NORMAL) -@Tag("smoke") -@Tag("registered") -public class RegisterFromUserMenuTest extends AbstractTest -{ - private User user; - - @Before - public void setup() - { - user = DataUtils.get(User.class); - } - - @Test - public void testRegisteringFromUserMenu() - { - // Go to homepage - var homePage = OpenHomePageFlow.flow(); - homePage.validateStructure(); - - // Assure not logged in status - homePage.userMenu.validateNotLoggedIn(); - - // Go to register form - var registerPage = homePage.userMenu.openRegister(); - registerPage.validateStructure(); - - var loginPage = registerPage.sendRegisterForm(user); - loginPage.validateSuccessfulRegistration(); - loginPage.validateStructure(); - - homePage = loginPage.sendLoginform(user); - homePage.validateSuccessfulLogin(user); - } - - @After - public void after() - { - DeleteUserFlow.flow(user); - } -} diff --git a/src/test/java/posters/tests/smoke/RegisterTest.java b/src/test/java/posters/tests/smoke/RegisterTest.java index e45c9375..f45e7d79 100644 --- a/src/test/java/posters/tests/smoke/RegisterTest.java +++ b/src/test/java/posters/tests/smoke/RegisterTest.java @@ -1,18 +1,15 @@ package posters.tests.smoke; import org.junit.After; -import org.junit.Before; import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; -import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; -import posters.tests.testdata.dataobjects.User; import posters.flows.DeleteUserFlow; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; @@ -24,41 +21,29 @@ @SuppressDataSets public class RegisterTest extends AbstractTest { - private User user; - - @Before - public void setup() - { - user = DataUtils.get(User.class); - } - @Test - @DataSet(2) -// @DataSet(4) -// @DataSet(6) + @DataSet(1) public void testRegistering() { // go to homepage var homePage = OpenHomePageFlow.flow(); - // go to login page and validate - var loginPage = homePage.userMenu.openLoginPage(); - loginPage.validateStructure(); - // go to register page and validate - var registerPage = loginPage.openRegister(); + var registerPage = homePage.userMenu.openRegisterPage(); registerPage.validateStructure(); - - loginPage = registerPage.sendRegisterForm(user); + + // go to login page and validate + var loginPage = registerPage.sendRegisterForm(userData); + loginPage.validateStructure(); loginPage.validateSuccessfulRegistration(); - homePage = loginPage.sendLoginform(user); - homePage.validateSuccessfulLogin(user); + homePage = loginPage.sendLoginForm(userData); + homePage.validateSuccessfulLogin(userData.getFirstName()); } @After public void after() { - DeleteUserFlow.flow(user); + DeleteUserFlow.flow(userData); } } diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 71dc40ca..5f3e89dd 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -46,7 +46,7 @@ public void testOrderingAsRegisteredUser() loginPage.validateStructure(); final String email = Neodymium.dataValue("email"); final String password = Neodymium.dataValue("password"); - homePage = loginPage.sendLoginform(email, password); + homePage = loginPage.sendLoginForm(userData); final String firstName = Neodymium.dataValue("firstName"); homePage.validateSuccessfulLogin(firstName); diff --git a/src/test/java/posters/tests/unit/LoginTest.java b/src/test/java/posters/tests/unit/LoginTest.java index f89c7133..84285fd6 100644 --- a/src/test/java/posters/tests/unit/LoginTest.java +++ b/src/test/java/posters/tests/unit/LoginTest.java @@ -41,8 +41,8 @@ public void setup() @DataSet(1) public void testSuccessfulLogin() { - var homePage = loginPage.sendLoginform(user); - homePage.validateSuccessfulLogin(user); + var homePage = loginPage.sendLoginForm(user); + homePage.validateSuccessfulLogin(user.getFirstName()); } @Test @@ -50,7 +50,7 @@ public void testSuccessfulLogin() @DataSet(3) public void testLoginWithPasswordFailure() { - loginPage.sendFalseLoginform(user); + //loginPage.sendFalseLoginform(user); loginPage.validateWrongPassword(user.getEmail()); } @@ -58,7 +58,7 @@ public void testLoginWithPasswordFailure() @DataSet(4) public void testLoginWithEmailFailure() { - loginPage.sendFalseLoginform(user); + //loginPage.sendFalseLoginform(user); loginPage.validateWrongEmail(user.getEmail()); } @@ -67,7 +67,7 @@ public void testLoginWithEmailFailure() @DataSet(6) public void testLoginWithoutRequiredFields() { - loginPage.sendFalseLoginform(user); + //loginPage.sendFalseLoginform(user); loginPage.errorMessage.validateNoErrorMessageOnPage(); } @@ -76,7 +76,7 @@ public void testLoginWithoutRequiredFields() public void testLoginWithUnregisteredUser() { final var user = new User("Jens", "Doe", "jens@doe.com", "topsecret"); - loginPage.sendFalseLoginform(user); + //loginPage.sendFalseLoginform(user); loginPage.validateWrongEmail(user.getEmail()); } diff --git a/src/test/resources/posters/tests/smoke/RegisterFromUserMenuTest.json b/src/test/resources/posters/tests/smoke/RegisterFromUserMenuTest.json deleted file mode 100644 index 26180a1f..00000000 --- a/src/test/resources/posters/tests/smoke/RegisterFromUserMenuTest.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "firstName": "Jane", - "lastName": "Doe", - "email": "jane@doe.com", - "password": "topsecret", - "testId": "Jane's test" - } -] From 29b978f7cd544956905acea3109f39d9dc7c4099 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Wed, 9 Aug 2023 13:16:32 +0200 Subject: [PATCH 25/44] divided ShippingAddressPage, BillingAddressPage, PaymentPage in Guest and ReturningCustomer --- config/localization.yaml | 29 +++- .../java/posters/flows/CartCleanUpFlow.java | 12 +- .../pageobjects/pages/checkout/CartPage.java | 17 ++- ...Page.java => GuestBillingAddressPage.java} | 65 +++------ ...PaymentPage.java => GuestPaymentPage.java} | 45 ++---- ...age.java => GuestShippingAddressPage.java} | 89 +++++------- .../ReturningCustomerBillingAddressPage.java | 85 +++++++++++ .../ReturningCustomerPaymentPage.java | 82 +++++++++++ .../ReturningCustomerShippingAddressPage.java | 86 +++++++++++ src/test/java/posters/tests/AbstractTest.java | 4 + .../posters/tests/smoke/GuestOrderTest.java | 20 +-- .../posters/tests/smoke/RegisterTest.java | 1 + .../tests/smoke/RegisteredOrderTest.java | 136 ++++++++---------- .../processes/GuestOrderTestData.java | 6 +- .../processes/RegisteredOrderTestData.java | 92 ++++++++++++ .../posters/tests/smoke/GuestOrderTest.json | 36 ++--- .../tests/smoke/RegisteredOrderTest.json | 98 ++++++++++--- 17 files changed, 635 insertions(+), 268 deletions(-) rename src/test/java/posters/pageobjects/pages/checkout/{BillingAddressPage.java => GuestBillingAddressPage.java} (50%) rename src/test/java/posters/pageobjects/pages/checkout/{PaymentPage.java => GuestPaymentPage.java} (80%) rename src/test/java/posters/pageobjects/pages/checkout/{ShippingAddressPage.java => GuestShippingAddressPage.java} (54%) create mode 100644 src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java create mode 100644 src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java create mode 100644 src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java create mode 100644 src/test/java/posters/tests/testdata/processes/RegisteredOrderTestData.java diff --git a/config/localization.yaml b/config/localization.yaml index d5e499c0..e363afaf 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -93,6 +93,20 @@ default: CartPage: title: Cart errorMessage: Your cart is empty. Continue shopping. + GuestShippingAddressPage: + title: Enter a shipping address + ReturningCustomerShippingAddressPage: + title: Select or enter a shipping address + button: + addNewShipAddr: Add a new shipping address + useShipAddr: Continue + GuestBillingAddressPage: + title: Enter a billing address + ReturningCustomerBillingAddressPage: + title: Select or enter a billing address + button: + addNewBillAddr: Add a new billing address + useBillAddr: Use this billing address AddressPages: breadcrumb: cart: CART/ @@ -120,9 +134,6 @@ default: number: "06" name: ORDER COMPLETE fillIn: - title: - shipping: Enter a shipping address - billing: Enter a billing address headlines: fullName: FULL NAME* company: COMPANY @@ -144,10 +155,10 @@ default: radio: "yes": "YES" "no": "NO" - button: Continue - PaymentPage: + button: Continue + GuestPaymentPage: + title: Enter a payment method fillIn: - title: Enter a payment method headlines: cardNumber: "CARD NUMBER*" cardHolderName: "CARDHOLDER'S NAME*" @@ -180,6 +191,12 @@ default: "2031": 2031 "2032": 2032 "2033": 2033 + button: Continue + ReturningCustomerPaymentPage: + title: Select or enter a credit card + button: + addNewCreditCard: Add a new credit card + useCreditCard: Use this credit card PlaceOrderPage: overview: title: Order Overview diff --git a/src/test/java/posters/flows/CartCleanUpFlow.java b/src/test/java/posters/flows/CartCleanUpFlow.java index 3e0972a6..1a9f6002 100644 --- a/src/test/java/posters/flows/CartCleanUpFlow.java +++ b/src/test/java/posters/flows/CartCleanUpFlow.java @@ -1,7 +1,5 @@ package posters.flows; -import static com.codeborne.selenide.Selenide.$; - import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.HomePage; @@ -10,18 +8,14 @@ public class CartCleanUpFlow @Step("cart clean up flow") public static void flow() { - // click on the shop logo to ensure a home page afterwards - $(".colorlib-nav #brand").click(); - - // open the minicart - var homePage = new HomePage(); - homePage.miniCart.openMiniCart(); + HomePage homePage = new HomePage(); // go to cart page var cartPage = homePage.miniCart.openCartPage(); + + // remove the first product as long as one is available while (cartPage.hasProductsInCart()) { - // remove the first product as long as one is available cartPage.removeProduct(1); } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 8b0ee818..08d11baf 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -268,12 +268,23 @@ public HomePage openHomePage() return new HomePage().isExpectedPage(); } - @Step("open shipping address from the cart page") - public ShippingAddressPage openShippingAddressPage() + @Step("open guest shipping address from the cart page") + public GuestShippingAddressPage openGuestShippingAddressPage() { $("#btnStartCheckout").scrollTo().click(); - return new ShippingAddressPage().isExpectedPage(); + return new GuestShippingAddressPage().isExpectedPage(); } + + @Step("open returning customer shipping address from the cart page") + public ReturningCustomerShippingAddressPage openReturningCustomerShippingAddressPage() + { + $("#btnStartCheckout").scrollTo().click(); + return new ReturningCustomerShippingAddressPage().isExpectedPage(); + } + + + + // ----------------------------------------------------------------------------- // diff --git a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java similarity index 50% rename from src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java rename to src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java index c7f0f4bc..9e46437b 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/BillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java @@ -11,7 +11,7 @@ import io.qameta.allure.Step; import posters.tests.testdata.dataobjects.Address; -public class BillingAddressPage extends AbstractCheckoutPage +public class GuestBillingAddressPage extends AbstractCheckoutPage { private SelenideElement title = $("#titleBillAddr"); @@ -19,13 +19,13 @@ public class BillingAddressPage extends AbstractCheckoutPage @Override @Step("ensure this is a billing address page") - public BillingAddressPage isExpectedPage() + public GuestBillingAddressPage isExpectedPage() { title.should(exist); return this; } - /// ----- validate billing address page ----- /// + /// ----- validate guest billing address page ----- /// @Override @Step("validate shipping address page structure") @@ -35,14 +35,14 @@ public void validateStructure() // validate breadcrumb validateBreadcrumb(); - + // validate process wrap - //validateProcessWrap(); + // validateProcessWrap(); // validate title - title.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.title.billing"))).shouldBe(visible); - - // validate fill form headline + title.shouldHave(exactText(Neodymium.localizedText("GuestShippingAddressPage.title"))).shouldBe(visible); + + // validate fill form headlines validateFillInHeadlines(); // validate fill in form structure @@ -55,26 +55,26 @@ public void validateStructure() validateRequiredString(); // validate continue button - addBillingButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.button"))).shouldBe(visible); + addBillingButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.button"))).shouldBe(visible); } - + /// ----- send billing address form ----- /// - + @Step("fill and send new billing address form") - public PaymentPage sendBillingAddressForm(Address billingAddress) + public GuestPaymentPage goToGuestPaymentPage(Address billingAddress) { String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); - return sendBillingAddressForm(fullName, billingAddress.getCompany(), billingAddress.getStreet(), - billingAddress.getCity(), billingAddress.getState(), billingAddress.getZip(), - billingAddress.getCountry()); + return goToGuestPaymentPage(fullName, billingAddress.getCompany(), billingAddress.getStreet(), + billingAddress.getCity(), billingAddress.getState(), billingAddress.getZip(), + billingAddress.getCountry()); } - + @Step("fill and send new billing address form") - public PaymentPage sendBillingAddressForm(String name, String company, String address, String city, - String state, String zip, String country) + public GuestPaymentPage goToGuestPaymentPage(String name, String company, String address, String city, + String state, String zip, String country) { - // enter parameters + // fill in form with parameters $("#fullName").val(name); $("#company").val(company); $("#addressLine").val(address); @@ -82,31 +82,10 @@ public PaymentPage sendBillingAddressForm(String name, String company, String ad $("#state").val(state); $("#zip").val(zip); $("#country").selectOption(country); - - // click on "Continue" button - addBillingButton.scrollTo().click(); - return new PaymentPage().isExpectedPage(); - } + // go to guest payment page + addBillingButton.scrollTo().click(); - // --------------------------------------------------- - - /** - * @param position - * The position of the billing address you want to choose - * @return PaymentPage - */ - @Step("select a billing address") - public PaymentPage selectBillingAddress(int position) - { - final int index = position - 1; - // Select address - // Checks the radio button belonging to the delivery address with index @{index} - $("#billAddr" + index + " input").scrollTo().click(); - // Open the billing address page in the checkout process - // Clicks the continue button - $("#btnUseBillAddress").scrollTo().click(); - - return new PaymentPage().isExpectedPage(); + return new GuestPaymentPage().isExpectedPage(); } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java similarity index 80% rename from src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java rename to src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java index 147df7b9..1da724e2 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java @@ -16,7 +16,7 @@ import io.qameta.allure.Step; import posters.tests.testdata.dataobjects.CreditCard; -public class PaymentPage extends AbstractCheckoutPage +public class GuestPaymentPage extends AbstractCheckoutPage { private SelenideElement title = $("#titlePayment"); @@ -33,14 +33,14 @@ public class PaymentPage extends AbstractCheckoutPage @Override @Step("ensure this is a payment page") - public PaymentPage isExpectedPage() + public GuestPaymentPage isExpectedPage() { super.isExpectedPage(); title.should(exist); return this; } - /// ----- validate payment page ----- /// + /// ----- validate guest payment page ----- /// @Step("validate fill-in form headlines") public void validateFillInHeadlines(String headline) @@ -130,8 +130,10 @@ public void validateStructure() // validate process wrap //validateProcessWrap(); - // validate fill in form headline - title.shouldHave(exactText(Neodymium.localizedText("PaymentPage.fillIn.title"))).shouldBe(visible); + // validate title + title.shouldHave(exactText(Neodymium.localizedText("GuestPaymentPage.title"))).shouldBe(visible); + + // validate fill in form headlines validateFillInHeadlines(); // validate placeholder @@ -147,50 +149,29 @@ public void validateStructure() validateRequiredString(); // validate continue button - addPaymentButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.button"))).shouldBe(visible); + addPaymentButton.shouldHave(exactText(Neodymium.localizedText("GuestPaymentPage.button"))).shouldBe(visible); } /// ----- send payment form ----- /// @Step("fill and send payment form") - public PlaceOrderPage sendPaymentForm(CreditCard creditcard) + public PlaceOrderPage goToPlaceOrderPage(CreditCard creditcard) { - return sendPaymentForm(creditcard.getCardNumber(), creditcard.getFullName(), creditcard.getExpDateMonth(), creditcard.getExpDateYear()); + return goToPlaceOrderPage(creditcard.getCardNumber(), creditcard.getFullName(), creditcard.getExpDateMonth(), creditcard.getExpDateYear()); } @Step("fill and send payment form") - public PlaceOrderPage sendPaymentForm(String number, String name, String month, String year) + public PlaceOrderPage goToPlaceOrderPage(String number, String name, String month, String year) { - // enter parameters + // fill in form with parameters creditCardNumber.val(number); creditCardName.val(name); expirationMonth.selectOption(month); expirationYear.selectOption(year); - // click on "Continue" button + // go to place order page addPaymentButton.scrollTo().click(); return new PlaceOrderPage().isExpectedPage(); } - - // -------------------------------------------------------- - - /** - * @param position - * The position of the credit card you want to select - * @return PPlaceOrder - */ - @Step("select a payment") - public PlaceOrderPage selectCreditCard(int position) - { - final int index = position - 1; - // Select address - // Checks the radio button belonging to the delivery address with index @{index} - $("#payment" + index + " input").scrollTo().click(); - // Open the billing address page in the checkout process - // Clicks the continue button - $("#btnUsePayment").scrollTo().click(); - - return new PlaceOrderPage().isExpectedPage(); - } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java similarity index 54% rename from src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java rename to src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java index 8df3df2b..b5c1df69 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java @@ -12,7 +12,7 @@ import io.qameta.allure.Step; import posters.tests.testdata.dataobjects.Address; -public class ShippingAddressPage extends AbstractCheckoutPage +public class GuestShippingAddressPage extends AbstractCheckoutPage { private SelenideElement title = $("#titleDelAddr"); @@ -20,14 +20,14 @@ public class ShippingAddressPage extends AbstractCheckoutPage @Override @Step("ensure this is a shipping address page") - public ShippingAddressPage isExpectedPage() + public GuestShippingAddressPage isExpectedPage() { super.isExpectedPage(); title.should(exist); return this; } - /// ----- validate shipping address page ----- /// + /// ----- validate guest shipping address page ----- /// @Step("validate shipping address usage for billing address radio") public void validateAddressRadio() @@ -45,14 +45,14 @@ public void validateStructure() // validate breadcrumb validateBreadcrumb(); - + // validate process wrap - //validateProcessWrap(); + // validateProcessWrap(); // validate title - title.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.title.shipping"))).shouldBe(visible); - - // validate fill in form headline + title.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.title.enterShipping"))).shouldBe(visible); + + // validate fill in form headlines validateFillInHeadlines(); // validate fill in form structure @@ -68,26 +68,26 @@ public void validateStructure() validateRequiredString(); // validate continue button - addShippingButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.button"))).shouldBe(visible); + addShippingButton.shouldHave(exactText(Neodymium.localizedText("AddressPages.button"))).shouldBe(visible); } /// ----- send shipping address form ----- /// - @Step("fill and send shipping address form") - public BillingAddressPage sendShippingAddressForm(Address shippingAddress) + @Step("fill and send shipping address form and go to guest billing address page") + public GuestBillingAddressPage goToGuestBillingAddressPage(Address shippingAddress) { String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); - return sendShippingAddressForm(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), - shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), - shippingAddress.getCountry()); + return goToGuestBillingAddressPage(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), + shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), + shippingAddress.getCountry()); } - @Step("fill and send shipping address form") - public BillingAddressPage sendShippingAddressForm(String name, String company, String address, String city, - String state, String zip, String country) - { - // enter parameters + @Step("fill and send shipping address form and go to guest billing address page") + public GuestBillingAddressPage goToGuestBillingAddressPage(String name, String company, String address, String city, + String state, String zip, String country) + { + // fill in form with parameters $("#fullName").val(name); $("#company").val(company); $("#addressLine").val(address); @@ -95,30 +95,30 @@ public BillingAddressPage sendShippingAddressForm(String name, String company, S $("#state").val(state); $("#zip").val(zip); $("#country").selectOption(country); - + $("#billEqualShipp-No").scrollTo().click(); - // click on "Continue" button + // go to guest billing address page addShippingButton.scrollTo().click(); - return new BillingAddressPage().isExpectedPage(); + return new GuestBillingAddressPage().isExpectedPage(); } - - @Step("fill and send shipping address form") - public PaymentPage sendShippingAddressForm2(Address shippingAddress) + + @Step("fill and send shipping address form and go to guest payment page") + public GuestPaymentPage goToGuestPaymentPage(Address shippingAddress) { String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); - return sendShippingAddressForm2(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), - shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), - shippingAddress.getCountry()); + return goToGuestPaymentPage(fullName, shippingAddress.getCompany(), shippingAddress.getStreet(), + shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), + shippingAddress.getCountry()); } - @Step("fill and send shipping address form") - public PaymentPage sendShippingAddressForm2(String name, String company, String address, String city, - String state, String zip, String country) - { - // enter parameters + @Step("fill and send shipping address form and go to guest payment page") + public GuestPaymentPage goToGuestPaymentPage(String name, String company, String address, String city, + String state, String zip, String country) + { + // fill in form with parameters $("#fullName").val(name); $("#company").val(company); $("#addressLine").val(address); @@ -126,29 +126,12 @@ public PaymentPage sendShippingAddressForm2(String name, String company, String $("#state").val(state); $("#zip").val(zip); $("#country").selectOption(country); - + $("#billEqualShipp-Yes").scrollTo().click(); - // click on "Continue" button + // go to guest payment page addShippingButton.scrollTo().click(); - return new PaymentPage().isExpectedPage(); - } - - - // --------------------------------------------------------------- - - @Step("select a shipping address") - public BillingAddressPage selectShippingAddress(int position) - { - final int index = position - 1; - // Select address - // Checks the radio button belonging to the delivery address with index @{index} - $("#delAddr" + index + " input").scrollTo().click(); - // Open the billing address page in the checkout process - // Clicks the continue button - $("#btnUseAddressContinue").scrollTo().click(); - - return new BillingAddressPage().isExpectedPage(); + return new GuestPaymentPage().isExpectedPage(); } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java new file mode 100644 index 00000000..402585d7 --- /dev/null +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java @@ -0,0 +1,85 @@ +package posters.pageobjects.pages.checkout; + +import static com.codeborne.selenide.Condition.exactText; +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.visible; +import static com.codeborne.selenide.Selenide.$; + +import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; + +import io.qameta.allure.Step; +import posters.tests.testdata.dataobjects.Address; + +public class ReturningCustomerBillingAddressPage extends AbstractCheckoutPage +{ + private SelenideElement title = $("#titleBillAddr"); + + private SelenideElement addBillingAddressButton = $(".form-group .btn"); + + private SelenideElement useBillingAddressButton = $("#btnUseBillAddress"); + + @Override + @Step("ensure this is a billing address page") + public ReturningCustomerBillingAddressPage isExpectedPage() + { + $("#billAddr0").should(exist); + return this; + } + + /// ----- validate returning customer billing address page ----- /// + + @Override + @Step("validate returning customer billing address page structure") + public void validateStructure() + { + super.validateStructure(); + + // validate breadcrumb + validateBreadcrumb(); + + // validate process wrap + //validateProcessWrap(); + + // validate title + title.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerBillingAddressPage.title"))).shouldBe(visible); + + // TODO - validate address count, get function needed + + // validate add new shipping address button + addBillingAddressButton.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerBillingAddressPage.button.addNewBillAddr"))).shouldBe(visible); + + // validate continue button + useBillingAddressButton.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerBillingAddressPage.button.useBillAddr"))).shouldBe(visible); + } + + @Step("validate specific position in address container") + public void validateAddressContainer(int position, Address billingAddress) + { + final int index = position - 1; + final SelenideElement addressContainer = $("#billAddr" + index); + final String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); + + // validate address data + addressContainer.find(".name").shouldHave(exactText(fullName)).shouldBe(visible); + addressContainer.find(".company").shouldHave(exactText(billingAddress.getCompany())).shouldBe(visible); + addressContainer.find(".city").shouldHave(exactText(billingAddress.getCity())).shouldBe(visible); + addressContainer.find(".state").shouldHave(exactText(billingAddress.getState())).shouldBe(visible); + addressContainer.find(".zip").shouldHave(exactText(billingAddress.getZip())).shouldBe(visible); + addressContainer.find(".country").shouldHave(exactText(billingAddress.getCountry())).shouldBe(visible); + } + + /// ----- select billing address ----- /// + + @Step("select a billing address") + public ReturningCustomerPaymentPage selectBillingAddress(int position) + { + final int index = position - 1; + + // select address, press "Use this billing address" + $("#billAddr" + index + " input").scrollTo().click(); + useBillingAddressButton.scrollTo().click(); + + return new ReturningCustomerPaymentPage().isExpectedPage(); + } +} \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java new file mode 100644 index 00000000..753daec3 --- /dev/null +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java @@ -0,0 +1,82 @@ +package posters.pageobjects.pages.checkout; + +import static com.codeborne.selenide.Condition.exactText; +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.visible; +import static com.codeborne.selenide.Selenide.$; + +import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; + +import io.qameta.allure.Step; +import posters.tests.testdata.dataobjects.CreditCard; + +public class ReturningCustomerPaymentPage extends AbstractCheckoutPage +{ + private SelenideElement title = $("#titlePayment"); + + private SelenideElement addCreditCardButton = $(".form-group .btn"); + + private SelenideElement useCreditCardButton = $("#btnUsePayment"); + + + @Override + @Step("ensure this is a payment page") + public ReturningCustomerPaymentPage isExpectedPage() + { + super.isExpectedPage(); + $("#payment0").should(exist); + return this; + } + + /// ----- validate returning customer payment page ----- /// + + @Override + @Step("validate returning customer payment page structure") + public void validateStructure() + { + super.validateStructure(); + + // validate breadcrumb + validateBreadcrumb(); + + // validate process wrap + //validateProcessWrap(); + + // validate title + title.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerPaymentPage.title"))).shouldBe(visible); + + // validate add new shipping address button + addCreditCardButton.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerPaymentPage.button.addNewCreditCard"))).shouldBe(visible); + + // validate continue button + useCreditCardButton.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerPaymentPage.button.useCreditCard"))).shouldBe(visible); + } + + @Step("validate specific position in credit card container") + public void validateCreditCardContainer(int position, CreditCard creditCard) + { + final int index = position - 1; + final SelenideElement creditCardContainer = $("#payment" + index); + final String expDate = creditCard.getExpDateMonth() + "/" + creditCard.getExpDateYear(); + + // validate address data + creditCardContainer.find(".name").shouldHave(exactText(creditCard.getFullName())).shouldBe(visible); + creditCardContainer.find(".creditCard").shouldHave(exactText(creditCard.getCrypticCardNumber())).shouldBe(visible); + creditCardContainer.find(".validTo").shouldHave(exactText(expDate)).shouldBe(visible); + } + + /// ----- select credit card ----- /// + + @Step("select a credit card for payment") + public PlaceOrderPage selectCreditCard(int position) + { + final int index = position - 1; + + // select address, press "Use this credit card" + $("#payment" + index + " input").scrollTo().click(); + useCreditCardButton.scrollTo().click(); + + return new PlaceOrderPage().isExpectedPage(); + } +} \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java new file mode 100644 index 00000000..76f3b375 --- /dev/null +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java @@ -0,0 +1,86 @@ +package posters.pageobjects.pages.checkout; + +import static com.codeborne.selenide.Condition.exactText; +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.visible; +import static com.codeborne.selenide.Selenide.$; + +import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; + +import io.qameta.allure.Step; +import posters.tests.testdata.dataobjects.Address; + +public class ReturningCustomerShippingAddressPage extends AbstractCheckoutPage +{ + private SelenideElement title = $("#titleDelAddr"); + + private SelenideElement addShippingAddressButton = $(".form-group .btn"); + + private SelenideElement useShippingAddressButton = $("#btnUseAddressContinue"); + + @Override + @Step("ensure this is a shipping address page") + public ReturningCustomerShippingAddressPage isExpectedPage() + { + super.isExpectedPage(); + $("#delAddr0").should(exist); + return this; + } + + /// ----- validate returning customer shipping address page ----- /// + + @Override + @Step("validate returning customer shipping address page structure") + public void validateStructure() + { + super.validateStructure(); + + // validate breadcrumb + validateBreadcrumb(); + + // validate process wrap + //validateProcessWrap(); + + // validate title + title.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerShippingAddressPage.title"))).shouldBe(visible); + + // TODO - validate address count, get function needed + + // validate add new shipping address button + addShippingAddressButton.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerShippingAddressPage.button.addNewShipAddr"))).shouldBe(visible); + + // validate continue button + useShippingAddressButton.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerShippingAddressPage.button.useShipAddr"))).shouldBe(visible); + } + + @Step("validate specific position in address container") + public void validateAddressContainer(int position, Address shippingAddress) + { + final int index = position - 1; + final SelenideElement addressContainer = $("#delAddr" + index); + final String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); + + // validate address data + addressContainer.find(".name").shouldHave(exactText(fullName)).shouldBe(visible); + addressContainer.find(".company").shouldHave(exactText(shippingAddress.getCompany())).shouldBe(visible); + addressContainer.find(".city").shouldHave(exactText(shippingAddress.getCity())).shouldBe(visible); + addressContainer.find(".state").shouldHave(exactText(shippingAddress.getState())).shouldBe(visible); + addressContainer.find(".zip").shouldHave(exactText(shippingAddress.getZip())).shouldBe(visible); + addressContainer.find(".country").shouldHave(exactText(shippingAddress.getCountry())).shouldBe(visible); + } + + /// ----- select shipping address ----- /// + + @Step("select a shipping address") + public ReturningCustomerBillingAddressPage selectShippingAddress(int position) + { + final int index = position - 1; + + // select address, press "Continue" + $("#delAddr" + index + " input").scrollTo().click(); + useShippingAddressButton.scrollTo().click(); + + return new ReturningCustomerBillingAddressPage().isExpectedPage(); + } +} diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index c10357f7..170cf99b 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -12,6 +12,7 @@ import posters.tests.testdata.processes.AddToCartTestData; import posters.tests.testdata.processes.BrowseTestData; import posters.tests.testdata.processes.GuestOrderTestData; +import posters.tests.testdata.processes.RegisteredOrderTestData; import posters.tests.testdata.dataobjects.Address; import posters.tests.testdata.dataobjects.CreditCard; import posters.tests.testdata.dataobjects.Product; @@ -49,6 +50,8 @@ public abstract class AbstractTest protected BrowseTestData browseTestData; protected GuestOrderTestData guestOrderTestData; + + protected RegisteredOrderTestData registeredOrderTestData; @Before public void setup() @@ -68,6 +71,7 @@ public void setup() addToCartTestData = DataUtils.get(AddToCartTestData.class); browseTestData = DataUtils.get(BrowseTestData.class); guestOrderTestData = DataUtils.get(GuestOrderTestData.class); + registeredOrderTestData = DataUtils.get(RegisteredOrderTestData.class); } protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTest.class); diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index 6a04a231..dc8c669c 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -10,7 +10,7 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; -import posters.pageobjects.pages.checkout.PaymentPage; +import posters.pageobjects.pages.checkout.GuestPaymentPage; import posters.pageobjects.pages.checkout.PlaceOrderPage; import posters.tests.AbstractTest; @@ -42,35 +42,35 @@ public void testOrderingAsGuest() var cartPage = productDetailPage.miniCart.openCartPage(); // go to shipping address page and validate - var shippingAddressPage = cartPage.openShippingAddressPage(); + var shippingAddressPage = cartPage.openGuestShippingAddressPage(); shippingAddressPage.validateStructure(); // declare variables used in if - PaymentPage paymentPage; + GuestPaymentPage paymentPage; PlaceOrderPage placeOrderPage; - if (!guestOrderTestData.getShipAndBillAddressAreEqual()) + if (!guestOrderTestData.getShipAddrEqualBillAddr()) { // go to billing address page and validate - var billingAddressPage = shippingAddressPage.sendShippingAddressForm(guestOrderTestData.getShippingAddress()); + var billingAddressPage = shippingAddressPage.goToGuestBillingAddressPage(guestOrderTestData.getShippingAddress()); billingAddressPage.validateStructure(); // go to payment page and validate - paymentPage = billingAddressPage.sendBillingAddressForm(guestOrderTestData.getBillingAddress()); + paymentPage = billingAddressPage.goToGuestPaymentPage(guestOrderTestData.getBillingAddress()); paymentPage.validateStructure(); // go to place order page and validate order overview - placeOrderPage = paymentPage.sendPaymentForm(guestOrderTestData.getCreditCard()); + placeOrderPage = paymentPage.goToPlaceOrderPage(guestOrderTestData.getCreditCard()); placeOrderPage.validateOrderOverview(guestOrderTestData.getShippingAddress(), guestOrderTestData.getBillingAddress(), guestOrderTestData.getCreditCard()); } else { - // got to payment page and validate - paymentPage = shippingAddressPage.sendShippingAddressForm2(guestOrderTestData.getShippingAddress()); + // go to payment page and validate + paymentPage = shippingAddressPage.goToGuestPaymentPage(guestOrderTestData.getShippingAddress()); paymentPage.validateStructure(); // go to place order page and validate order overview - placeOrderPage = paymentPage.sendPaymentForm(guestOrderTestData.getCreditCard()); + placeOrderPage = paymentPage.goToPlaceOrderPage(guestOrderTestData.getCreditCard()); placeOrderPage.validateOrderOverview(guestOrderTestData.getShippingAddress(), guestOrderTestData.getShippingAddress(), guestOrderTestData.getCreditCard()); } diff --git a/src/test/java/posters/tests/smoke/RegisterTest.java b/src/test/java/posters/tests/smoke/RegisterTest.java index f45e7d79..0793f889 100644 --- a/src/test/java/posters/tests/smoke/RegisterTest.java +++ b/src/test/java/posters/tests/smoke/RegisterTest.java @@ -37,6 +37,7 @@ public void testRegistering() loginPage.validateStructure(); loginPage.validateSuccessfulRegistration(); + // send login form homePage = loginPage.sendLoginForm(userData); homePage.validateSuccessfulLogin(userData.getFirstName()); } diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 5f3e89dd..1e32bb4f 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -1,18 +1,14 @@ package posters.tests.smoke; -import org.junit.After; import org.junit.Test; -import com.xceptance.neodymium.util.DataUtils; +import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; -import posters.tests.testdata.dataobjects.Address; -import posters.tests.testdata.dataobjects.CreditCard; -import posters.flows.CartCleanUpFlow; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; @@ -22,88 +18,78 @@ @Tag("registered") public class RegisteredOrderTest extends AbstractTest { + @DataSet(1) + //@DataSet(2) @Test public void testOrderingAsRegisteredUser() { - // total product count will be updated throughout the test - int totalCount = 0; final String shippingCosts = Neodymium.dataValue("shippingCosts"); - - // Go to homepage + + // go to homepage var homePage = OpenHomePageFlow.flow(); - homePage.validateStructure(); - - // Assure not logged in status - homePage.userMenu.validateNotLoggedIn(); - // Assure an empty cart - homePage.miniCart.validateTotalCount(totalCount); - homePage.miniCart.validateSubtotal("$0.00"); - final String oldSubtotal = homePage.miniCart.getSubtotal(); - - // Go to login form + // go to login page var loginPage = homePage.userMenu.openLoginPage(); - loginPage.validateStructure(); - final String email = Neodymium.dataValue("email"); - final String password = Neodymium.dataValue("password"); - homePage = loginPage.sendLoginForm(userData); - final String firstName = Neodymium.dataValue("firstName"); - homePage.validateSuccessfulLogin(firstName); - - // Go to category - final String categoryName = homePage.topNav.getSubCategoryNameByPosition(2, 3); - var categoryPage = homePage.topNav.clickSubCategoryByPosition(2, 3); - //categoryPage.validate(categoryName); - - // Go to product page - final String productName = categoryPage.getProductNameByPosition(2, 1); - var productDetailPage = categoryPage.clickProductByPosition(2, 1); - productDetailPage.validate(productName); - productDetailPage.addToCart("32 x 24 in", "matte"); - - // Go to cart and validate - var product = productDetailPage.getProduct(); + + // send login form + homePage = loginPage.sendLoginForm(registeredOrderTestData.getUser()); + homePage.validateSuccessfulLogin(registeredOrderTestData.getUser().getFirstName()); + + // go to category page + var categoryPage = homePage.topNav.clickCategory(registeredOrderTestData.getTopCategory()); + + // go to product detail page, add and store displayed product + var productDetailPage = categoryPage.clickProductByPosition(registeredOrderTestData.getResultPosition()); + productDetailPage.addToCart(registeredOrderTestData.getsSizeProduct(), registeredOrderTestData.getStyleProduct()); + final var product = productDetailPage.getProduct(); + + // go to cart page var cartPage = productDetailPage.miniCart.openCartPage(); - cartPage.validateStructure(); - cartPage.validateShippingCosts(shippingCosts); - cartPage.miniCart.validateMiniCart(1, product); - cartPage.miniCart.validateTotalCount(++totalCount); - cartPage.validateCartItem(1, product); - cartPage.validateTotalAfterAdd(1, oldSubtotal, 0.00); - // Go to shipping address and validate - var shippingAddressPage = cartPage.openShippingAddressPage(); + // go to shipping address page + var shippingAddressPage = cartPage.openReturningCustomerShippingAddressPage(); shippingAddressPage.validateStructure(); - - // Send shipping address and validate billing form - var billingAddressPage = shippingAddressPage.selectShippingAddress(1); + shippingAddressPage.validateAddressContainer(registeredOrderTestData.getShipAddrPos(), registeredOrderTestData.getShippingAddress()); + + // go to billing address page + var billingAddressPage = shippingAddressPage.selectShippingAddress(registeredOrderTestData.getShipAddrPos()); billingAddressPage.validateStructure(); - - // Send billing address and validate payment form - var paymentPage = billingAddressPage.selectBillingAddress(1); + + if (!registeredOrderTestData.getShipAddrEqualBillAddr()) + { + billingAddressPage.validateAddressContainer(registeredOrderTestData.getBillAddrPos(), registeredOrderTestData.getBillingAddress()); + } + else + { + billingAddressPage.validateAddressContainer(registeredOrderTestData.getBillAddrPos(), registeredOrderTestData.getShippingAddress()); + } + + // go to payment page + var paymentPage = billingAddressPage.selectBillingAddress(registeredOrderTestData.getBillAddrPos()); paymentPage.validateStructure(); - - // setup checkout data for validation - final var shippingAddress = DataUtils.get(Address.class); - final var billingAddress = DataUtils.get(Address.class); - final var creditCard = DataUtils.get(CreditCard.class); - - // Send payment data and validate place order page - var placeOrderPage = paymentPage.selectCreditCard(1); + paymentPage.validateCreditCardContainer(registeredOrderTestData.getCreditCardPos(), registeredOrderTestData.getCreditCard()); + + // go to place order page + var placeOrderPage = paymentPage.selectCreditCard(registeredOrderTestData.getCreditCardPos()); + + if (!registeredOrderTestData.getShipAddrEqualBillAddr()) + { + placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getBillingAddress(), registeredOrderTestData.getCreditCard()); + } + else + { + placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getCreditCard()); + } + placeOrderPage.validateStructure(); - //placeOrderPage.validateProduct(1, product.getName(), product.getAmount(), product.getStyle(), product.getSize()); - placeOrderPage.validateOrderOverview(shippingAddress, billingAddress, creditCard); - - // Place order - var OrderConfirmationPage = placeOrderPage.placeOrder(); - - // Validate order confirmation on Order Confirmation Page - OrderConfirmationPage.validateStructure(); - } - - @After - public void after() - { - CartCleanUpFlow.flow(); + placeOrderPage.validateProduct(1, product); + placeOrderPage.validatePriceSummary(placeOrderPage.getSubtotal(), shippingCosts); + + // go to order confirmation page + var orderConfirmationPage = placeOrderPage.placeOrder(); + orderConfirmationPage.validateStructure(); + + // go to homepage + homePage = orderConfirmationPage.openHomePage(); } } diff --git a/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java b/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java index 96e9e975..1ef0fffa 100644 --- a/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java +++ b/src/test/java/posters/tests/testdata/processes/GuestOrderTestData.java @@ -15,7 +15,7 @@ public class GuestOrderTestData private Address shippingAddress; - private Boolean sameBillingAddress; + private Boolean shipAddrEqualBillAddr; private Address billingAddress; @@ -46,9 +46,9 @@ public Address getShippingAddress() return shippingAddress; } - public Boolean getShipAndBillAddressAreEqual() + public Boolean getShipAddrEqualBillAddr() { - return sameBillingAddress; + return shipAddrEqualBillAddr; } public Address getBillingAddress() diff --git a/src/test/java/posters/tests/testdata/processes/RegisteredOrderTestData.java b/src/test/java/posters/tests/testdata/processes/RegisteredOrderTestData.java new file mode 100644 index 00000000..d1a07717 --- /dev/null +++ b/src/test/java/posters/tests/testdata/processes/RegisteredOrderTestData.java @@ -0,0 +1,92 @@ +package posters.tests.testdata.processes; + +import posters.tests.testdata.dataobjects.Address; +import posters.tests.testdata.dataobjects.CreditCard; +import posters.tests.testdata.dataobjects.User; + +public class RegisteredOrderTestData +{ + private User user; + + private String topCategory; + + private int resultPosition; + + private String sizeProduct; + + private String styleProduct; + + private int shipAddrPos; + + private int billAddrPos; + + private int creditCardPos; + + private Boolean shipAddrEqualBillAddr; + + private Address shippingAddress; + + private Address billingAddress; + + private CreditCard creditCard; + + public User getUser() + { + return user; + } + + public String getTopCategory() + { + return topCategory; + } + + public int getResultPosition() + { + return resultPosition; + } + + public String getsSizeProduct() + { + return sizeProduct; + } + + public String getStyleProduct() + { + return styleProduct; + } + + public int getShipAddrPos() + { + return shipAddrPos; + } + + public int getBillAddrPos() + { + return billAddrPos; + } + + public int getCreditCardPos() + { + return creditCardPos; + } + + public Boolean getShipAddrEqualBillAddr() + { + return shipAddrEqualBillAddr; + } + + public Address getShippingAddress() + { + return shippingAddress; + } + + public Address getBillingAddress() + { + return billingAddress; + } + + public CreditCard getCreditCard() + { + return creditCard; + } +} \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/GuestOrderTest.json b/src/test/resources/posters/tests/smoke/GuestOrderTest.json index b4e09838..dd51fe96 100644 --- a/src/test/resources/posters/tests/smoke/GuestOrderTest.json +++ b/src/test/resources/posters/tests/smoke/GuestOrderTest.json @@ -4,14 +4,6 @@ "resultPosition": "5", "sizeProduct": "64 x 48 in", "styleProduct": "gloss", - "creditCard": - { - "fullName": "Jimmy Blue", - "cardNumber": "4111111111111111", - "crypticCardNumber": "xxxx xxxx xxxx 1111", - "expDateMonth": "12", - "expDateYear": "2026" - }, "shippingAddress": { "firstName": "Jimmy Blue", @@ -23,7 +15,7 @@ "zip": "01803", "country": "United States" }, - "sameBillingAddress": false, + "shipAddrEqualBillAddr": false, "billingAddress": { "firstName": "Jimmy Blue", @@ -34,6 +26,14 @@ "state": "California", "zip": "00018", "country": "United States" + }, + "creditCard": + { + "fullName": "Jimmy Blue", + "cardNumber": "4111111111111111", + "crypticCardNumber": "xxxx xxxx xxxx 1111", + "expDateMonth": "12", + "expDateYear": "2026" } }, { @@ -41,14 +41,6 @@ "resultPosition": "2", "sizeProduct": "16 x 12 in", "styleProduct": "matte", - "creditCard": - { - "fullName": "Erik Range", - "cardNumber": "4111111111111111", - "crypticCardNumber": "xxxx xxxx xxxx 1111", - "expDateMonth": "05", - "expDateYear": "2028" - }, "shippingAddress": { "firstName": "Gregor", @@ -60,6 +52,14 @@ "zip": "38100", "country": "Germany" }, - "sameBillingAddress": true + "shipAddrEqualBillAddr": true, + "creditCard": + { + "fullName": "Jimmy Blue", + "cardNumber": "4111111111111111", + "crypticCardNumber": "xxxx xxxx xxxx 1111", + "expDateMonth": "12", + "expDateYear": "2026" + } } ] diff --git a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json index 4b48ccb3..fff7a852 100644 --- a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json +++ b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json @@ -1,19 +1,85 @@ [ { - "email": "john@doe.com", - "password": "topsecret", - "firstName": "John", - "lastName": "Doe", - "company": "John Doe Inc.", - "street": "5-7 John Doe street", - "city": "New York", - "state": "NY", - "zip": "12345", - "country": "United States", - "fullName": "John Doe", - "cardNumber": "4111111111111111", - "crypticCardNumber": "xxxx xxxx xxxx 1111", - "expDateMonth": "08", - "expDateYear": "2022" - } + "user": + { + "firstName": "Jonas", + "lastName": "Doe", + "email": "jonas@doe.com", + "password": "topsecret" + }, + "topCategory": "header.topNavigation.2.title", + "resultPosition": "6", + "sizeProduct": "32 x 24 in", + "styleProduct": "gloss", + "shipAddrPos": 1, + "billAddrPos": 1, + "creditCardPos": 1, + "shipAddrEqualBillAddr": true, + "shippingAddress": + { + "firstName": "Jonas", + "lastName": "Doe", + "company": "Jonas Doe Inc.", + "street": "5-7 Jonas Doe street", + "city": "New York City", + "state": "New York", + "zip": "12345", + "country": "United States" + }, + "creditCard": + { + "fullName": "Jonas Doe", + "cardNumber": "4111111111111111", + "crypticCardNumber": "xxxx xxxx xxxx 1111", + "expDateMonth": "06", + "expDateYear": "2028" + } + }, + { + "user": + { + "firstName": "Jonas", + "lastName": "Doe", + "email": "jonas@doe.com", + "password": "topsecret" + }, + "topCategory": "header.topNavigation.4.title", + "resultPosition": "2", + "sizeProduct": "16 x 12 in", + "styleProduct": "matte", + "shipAddrPos": 1, + "shipBillPos": 2, + "creditCartPos": 1, + "shipAddrEqualBillAddr": false, + "shippingAddress": + { + "firstName": "Jonas", + "lastName": "Doe", + "company": "Jonas Doe Inc.", + "street": "5-7 Jonas Doe street", + "city": "New York City", + "state": "New York", + "zip": "12345", + "country": "United States" + }, + "billingAddress": + { + "firstName": "Jonas", + "lastName": "Doe", + "company": "Jonas Doe GmbH", + "street": "Jonas Doe Straße 10", + "city": "Hannover", + "state": "Niedersachsen", + "zip": "30159", + "country": "Germany" + }, + "creditCard": + { + "fullName": "Jonas Doe", + "cardNumber": "4111111111111111", + "crypticCardNumber": "xxxx xxxx xxxx 1111", + "expDateMonth": "06", + "expDateYear": "2028" + } + } ] From 4543c2b41ba3f53b4b39915f098d86ad07266425 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Wed, 9 Aug 2023 16:45:33 +0200 Subject: [PATCH 26/44] fixed GuestOrderTest and RegisteredOrderTest --- config/localization.yaml | 8 +++ .../checkout/GuestBillingAddressPage.java | 2 +- .../pages/checkout/GuestPaymentPage.java | 56 +++++++++---------- .../checkout/GuestShippingAddressPage.java | 2 +- .../pages/user/MyAddressesPage.java | 24 +++++--- .../tests/smoke/RegisteredOrderTest.java | 40 ++++++------- .../posters/tests/smoke/GuestOrderTest.json | 2 +- .../tests/smoke/RegisteredOrderTest.json | 4 +- 8 files changed, 78 insertions(+), 60 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index e363afaf..d7a18733 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -245,6 +245,11 @@ default: myAddresses: My Addresses paymentSettings: Payment Settings personalData: Personal Data + MyAddressesPage: + title: My Addresses + headlines: + shipAddr: Shipping Address + billAddr: Billing Address PersonalDataPage: title: Personal Data headlines: @@ -276,5 +281,8 @@ default: quantity: QUANTITY update: REMOVE/UPDATE totalPrice: TOTAL PRICE + button: + addNewShipAddr: Add a new shipping address + addNewBillAddr: Add a new billing address \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java index 9e46437b..33d624fe 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java @@ -40,7 +40,7 @@ public void validateStructure() // validateProcessWrap(); // validate title - title.shouldHave(exactText(Neodymium.localizedText("GuestShippingAddressPage.title"))).shouldBe(visible); + title.shouldHave(exactText(Neodymium.localizedText("GuestBillingAddressPage.title"))).shouldBe(visible); // validate fill form headlines validateFillInHeadlines(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java index 1da724e2..e9a19522 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java @@ -51,16 +51,16 @@ public void validateFillInHeadlines(String headline) @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - validateFillInHeadlines("PaymentPage.fillIn.headlines.cardNumber"); - validateFillInHeadlines("PaymentPage.fillIn.headlines.cardHolderName"); - validateFillInHeadlines("PaymentPage.fillIn.headlines.expirationDate"); + validateFillInHeadlines("GuestPaymentPage.fillIn.headlines.cardNumber"); + validateFillInHeadlines("GuestPaymentPage.fillIn.headlines.cardHolderName"); + validateFillInHeadlines("GuestPaymentPage.fillIn.headlines.expirationDate"); } @Step("validate fill-in form placeholder") public void validateFillInPlaceholder() { - creditCardNumber.shouldHave(attribute("placeholder", (Neodymium.localizedText("PaymentPage.fillIn.placeholder.cardNumber")))).shouldBe(visible); - creditCardName.shouldHave(attribute("placeholder", (Neodymium.localizedText("PaymentPage.fillIn.placeholder.cardOwnerName")))).shouldBe(visible); + creditCardNumber.shouldHave(attribute("placeholder", (Neodymium.localizedText("GuestPaymentPage.fillIn.placeholder.cardNumber")))).shouldBe(visible); + creditCardName.shouldHave(attribute("placeholder", (Neodymium.localizedText("GuestPaymentPage.fillIn.placeholder.cardOwnerName")))).shouldBe(visible); $("#expirationDateMonth [selected]").shouldHave(exactText("0" + Integer.toString(LocalDate.now().getMonthValue()))).shouldBe(visible); $("#expirationDateYear [selected]").shouldHave(exactText(Integer.toString(LocalDate.now().getYear()))).shouldBe(visible); } @@ -78,18 +78,18 @@ public void validateMonthDropdown() expirationMonth.scrollTo().click(); // validate months - validateMonthDropdown("PaymentPage.fillIn.expireMonth.january"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.february"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.march"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.april"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.may"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.june"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.july"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.august"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.september"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.october"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.november"); - validateMonthDropdown("PaymentPage.fillIn.expireMonth.december"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.january"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.february"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.march"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.april"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.may"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.june"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.july"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.august"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.september"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.october"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.november"); + validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.december"); } @Step("validate year dropdown") @@ -105,17 +105,17 @@ public void validateYearDropdown() expirationYear.scrollTo().click(); // validate years - validateYearDropdown("PaymentPage.fillIn.expireYear.2023"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2024"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2025"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2026"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2027"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2028"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2029"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2030"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2031"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2032"); - validateYearDropdown("PaymentPage.fillIn.expireYear.2033"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2023"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2024"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2025"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2026"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2027"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2028"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2029"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2030"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2031"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2032"); + validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2033"); } @Override diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java index b5c1df69..84c6d6b3 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java @@ -50,7 +50,7 @@ public void validateStructure() // validateProcessWrap(); // validate title - title.shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.title.enterShipping"))).shouldBe(visible); + title.shouldHave(exactText(Neodymium.localizedText("GuestShippingAddressPage.title"))).shouldBe(visible); // validate fill in form headlines validateFillInHeadlines(); diff --git a/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java b/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java index dbca7bfc..0f86ce2e 100644 --- a/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java +++ b/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java @@ -1,38 +1,46 @@ package posters.pageobjects.pages.user; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; public class MyAddressesPage extends AbstractBrowsingPage { -// private SelenideElement headline = $("#titlePersonalData"); -// -// private SelenideElement deleteButton = $("#btnDeleteAccount"); + private SelenideElement title = $("#titleAddressOverview"); @Override @Step("ensure this is a personal data page") public MyAddressesPage isExpectedPage() { -// super.isExpectedPage(); -// headline.should(exist); + super.isExpectedPage(); + title.should(exist); return this; } /// ----- validate my addresses page ----- /// - + @Override @Step("validate personal data page structure") public void validateStructure() { super.validateStructure(); - // TODO + // validate title + title.shouldHave(exactText(Neodymium.localizedText("MyAddressesPage.title"))).shouldBe(visible); + + // validate shipping addresses overview + $("#titleDelAddr").shouldHave(exactText(Neodymium.localizedText("MyAddressesPage.headlines.shipAddr"))).shouldBe(visible); + $("#linkAddNewShipAddr").shouldHave(exactText(Neodymium.localizedText("General.button.addNewShipAddr"))).shouldBe(visible); + + // validate billing addresses overview + $("#titleBillAddr").shouldHave(exactText(Neodymium.localizedText("MyAddressesPage.headlines.billAddr"))).shouldBe(visible); + $("#linkAddNewBillAddr").shouldHave(exactText(Neodymium.localizedText("General.button.addNewBillAddr"))).shouldBe(visible); } } \ No newline at end of file diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 1e32bb4f..1ad68937 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -19,30 +19,30 @@ public class RegisteredOrderTest extends AbstractTest { @DataSet(1) - //@DataSet(2) + @DataSet(2) @Test public void testOrderingAsRegisteredUser() { final String shippingCosts = Neodymium.dataValue("shippingCosts"); - + // go to homepage var homePage = OpenHomePageFlow.flow(); // go to login page var loginPage = homePage.userMenu.openLoginPage(); - + // send login form homePage = loginPage.sendLoginForm(registeredOrderTestData.getUser()); homePage.validateSuccessfulLogin(registeredOrderTestData.getUser().getFirstName()); - + // go to category page var categoryPage = homePage.topNav.clickCategory(registeredOrderTestData.getTopCategory()); - + // go to product detail page, add and store displayed product var productDetailPage = categoryPage.clickProductByPosition(registeredOrderTestData.getResultPosition()); productDetailPage.addToCart(registeredOrderTestData.getsSizeProduct(), registeredOrderTestData.getStyleProduct()); final var product = productDetailPage.getProduct(); - + // go to cart page var cartPage = productDetailPage.miniCart.openCartPage(); @@ -50,45 +50,47 @@ public void testOrderingAsRegisteredUser() var shippingAddressPage = cartPage.openReturningCustomerShippingAddressPage(); shippingAddressPage.validateStructure(); shippingAddressPage.validateAddressContainer(registeredOrderTestData.getShipAddrPos(), registeredOrderTestData.getShippingAddress()); - + // go to billing address page var billingAddressPage = shippingAddressPage.selectShippingAddress(registeredOrderTestData.getShipAddrPos()); billingAddressPage.validateStructure(); - - if (!registeredOrderTestData.getShipAddrEqualBillAddr()) + + if (!registeredOrderTestData.getShipAddrEqualBillAddr()) { billingAddressPage.validateAddressContainer(registeredOrderTestData.getBillAddrPos(), registeredOrderTestData.getBillingAddress()); } - else + else { billingAddressPage.validateAddressContainer(registeredOrderTestData.getBillAddrPos(), registeredOrderTestData.getShippingAddress()); } - + // go to payment page var paymentPage = billingAddressPage.selectBillingAddress(registeredOrderTestData.getBillAddrPos()); paymentPage.validateStructure(); paymentPage.validateCreditCardContainer(registeredOrderTestData.getCreditCardPos(), registeredOrderTestData.getCreditCard()); - + // go to place order page var placeOrderPage = paymentPage.selectCreditCard(registeredOrderTestData.getCreditCardPos()); - - if (!registeredOrderTestData.getShipAddrEqualBillAddr()) + + if (!registeredOrderTestData.getShipAddrEqualBillAddr()) { - placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getBillingAddress(), registeredOrderTestData.getCreditCard()); + placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getBillingAddress(), + registeredOrderTestData.getCreditCard()); } else { - placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getCreditCard()); + placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getShippingAddress(), + registeredOrderTestData.getCreditCard()); } - + placeOrderPage.validateStructure(); placeOrderPage.validateProduct(1, product); placeOrderPage.validatePriceSummary(placeOrderPage.getSubtotal(), shippingCosts); - + // go to order confirmation page var orderConfirmationPage = placeOrderPage.placeOrder(); orderConfirmationPage.validateStructure(); - + // go to homepage homePage = orderConfirmationPage.openHomePage(); } diff --git a/src/test/resources/posters/tests/smoke/GuestOrderTest.json b/src/test/resources/posters/tests/smoke/GuestOrderTest.json index dd51fe96..26bc702f 100644 --- a/src/test/resources/posters/tests/smoke/GuestOrderTest.json +++ b/src/test/resources/posters/tests/smoke/GuestOrderTest.json @@ -55,7 +55,7 @@ "shipAddrEqualBillAddr": true, "creditCard": { - "fullName": "Jimmy Blue", + "fullName": "Gregor Onkh", "cardNumber": "4111111111111111", "crypticCardNumber": "xxxx xxxx xxxx 1111", "expDateMonth": "12", diff --git a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json index fff7a852..3a00802f 100644 --- a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json +++ b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json @@ -48,8 +48,8 @@ "sizeProduct": "16 x 12 in", "styleProduct": "matte", "shipAddrPos": 1, - "shipBillPos": 2, - "creditCartPos": 1, + "billAddrPos": 2, + "creditCardPos": 1, "shipAddrEqualBillAddr": false, "shippingAddress": { From 552814df0390bbbe609d04afa8e018b74e1d90ca Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Fri, 11 Aug 2023 15:04:27 +0200 Subject: [PATCH 27/44] cleaned validation MiniCart --- config/localization.yaml | 6 +- .../java/posters/flows/CartCleanUpFlow.java | 2 +- .../pageobjects/components/Header.java | 2 +- .../pageobjects/components/MiniCart.java | 175 +++++++++++------- .../pages/checkout/AbstractCheckoutPage.java | 4 +- .../pageobjects/pages/checkout/CartPage.java | 109 +++-------- .../pages/checkout/PlaceOrderPage.java | 48 ++--- .../pages/user/OrderHistoryPage.java | 16 -- .../pageobjects/utility/PriceHelper.java | 20 +- .../posters/tests/smoke/AddToCartTest.java | 30 ++- .../tests/testdata/dataobjects/Address.java | 14 ++ .../testdata/dataobjects/CreditCard.java | 36 +--- .../tests/testdata/dataobjects/Product.java | 42 ----- .../tests/testdata/dataobjects/User.java | 8 +- .../posters/tests/smoke/GuestOrderTest.json | 2 +- 15 files changed, 201 insertions(+), 313 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index d7a18733..4ebd8476 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -30,8 +30,10 @@ default: greeting: "WELCOME: GUEST" createAccount: CREATE ACCOUNT signIn: SIGN IN - shoppingCart: - noItemsInCart: 0 ITEMS IN THE CART + miniCart: + title: + singular: ITEM IN THE CART + plural: ITEMS IN THE CART subtotal: SUBTOTAL viewCart: VIEW CART sale: diff --git a/src/test/java/posters/flows/CartCleanUpFlow.java b/src/test/java/posters/flows/CartCleanUpFlow.java index 1a9f6002..a7df5b92 100644 --- a/src/test/java/posters/flows/CartCleanUpFlow.java +++ b/src/test/java/posters/flows/CartCleanUpFlow.java @@ -14,7 +14,7 @@ public static void flow() var cartPage = homePage.miniCart.openCartPage(); // remove the first product as long as one is available - while (cartPage.hasProductsInCart()) + while (cartPage.miniCart.getTotalCount() != 0) { cartPage.removeProduct(1); } diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index b555df01..4461a317 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -23,7 +23,7 @@ public void validateStructure() Search.validateStructure(); TopNavigation.validateStructure(); UserMenu.validateGuestUserMenu(); - MiniCart.validateEmptyMiniCart(); + MiniCart.validateStructure(); SaleBanner.validateStructure(); } } diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 2aa57eaf..105367d8 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -2,12 +2,12 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchesText; import static com.codeborne.selenide.Condition.not; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; +import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -20,14 +20,20 @@ public class MiniCart extends AbstractComponent { private static SelenideElement headerCart = $("#headerCartOverview"); - private static SelenideElement subOrderPrice = $("#miniCartMenu .subOrderPrice"); + private static SelenideElement subOrderPrice = $("#miniCartMenu .subOrderPrice"); private static SelenideElement miniCart = $("#miniCartMenu"); + + private static SelenideElement miniCartTitle = $(".cartMiniProductCounter"); private static SelenideElement totalCountElement = $("#headerCartOverview .headerCartProductCount"); private SelenideElement goToCartButton = $(".goToCart"); + private static ElementsCollection productCounts = $$(".prodCount"); + + private static ElementsCollection productPrices = $$(".prodPrice strong"); + @Override @Step("ensure availability mini cart") public void isComponentAvailable() @@ -35,7 +41,7 @@ public void isComponentAvailable() $("#btnCartOverviewForm").should(exist); } - // ----- mini cart navigation ------ // + /// ----- mini cart navigation ------ /// @Step("open the mini cart") public static void openMiniCart() @@ -59,56 +65,121 @@ public CartPage openCartPage() return new CartPage().isExpectedPage(); } - // ----- validate product data in mini cart ----- // - - @Step("validate shopping cart menu") - public static void validateStructure() - { - // TODO - verify (not) empty shopping cart in one function for header component - } + /// ----- get data mini cart ----- /// - @Step("validate the mini cart subtotal price") - public void validateSubtotal(String subtotal) + @Step("get the subtotal price from mini cart") + public String getSubtotal() { openMiniCart(); - subOrderPrice.shouldHave(exactText(subtotal)); + String subtotal = subOrderPrice.text(); closeMiniCart(); + + return subtotal; + } + + @Step("get the total product count from mini cart") + public static int getTotalCount() + { + return Integer.parseInt(totalCountElement.text()); } + @Step("calculate sum of all total product prices") + public static String calculateSubtotal() + { + double subtotal = 0; + + for (SelenideElement totalProductPrice : productPrices) + { + subtotal = PriceHelper.calculateSubtotalMiniCart(subtotal, totalProductPrice.getText()); + } + + return PriceHelper.format(subtotal); + } + + @Step("calculate total count via product counts") + public static int calculateTotalCount() + { + int totalCount = 0; + + if ($(".cartItems").exists()) + { + for (SelenideElement productCount : productCounts) + { + totalCount = PriceHelper.calculateTotalCountMiniCart(totalCount, productCount.getText()); + } + + return totalCount; + } + + return totalCount; + } + + /// ----- validate mini cart structure ----- /// + @Step("validate the mini cart total product count") - public void validateTotalCount(int totalCount) + public static void validateTotalCount(int totalCount) { totalCountElement.shouldHave(exactText(Integer.toString(totalCount))); } - @Step("validate empty mini cart") - public static void validateEmptyMiniCart() + @Step("validate the mini cart title") + public static void validateTitle() + { + if (getTotalCount() == 1) + { + miniCartTitle.shouldHave(exactText(getTotalCount() + " " + Neodymium.localizedText("header.miniCart.title.singular"))).shouldBe(visible); + } + else + { + miniCartTitle.shouldHave(exactText(getTotalCount() + " " + Neodymium.localizedText("header.miniCart.title.plural"))).shouldBe(visible); + } + } + + @Step("validate the mini cart subtotal price") + public static void validateSubtotal(String subtotal) + { + subOrderPrice.shouldHave(exactText(subtotal)).shouldBe(visible); + } + + @Step("validate mini cart menu") + public static void validateStructure() { - // validate shopping cart icon, item count + openMiniCart(); + + // validate shopping cart icon $(".icon-shopping-cart").shouldBe(visible); - totalCountElement.shouldHave(exactText("0")).shouldBe(visible); - openMiniCart(); + // validate total count + validateTotalCount((int)(calculateTotalCount())); - // validate cart window header - $$("#miniCartMenu .cartMiniHeader").findBy(matchesText(Neodymium.localizedText("header.shoppingCart.noItemsInCart"))).shouldBe(visible); + // validate title + // TODO - fix consistency mini cart title + //validateTitle(); - // validate subtotal - $("#miniCartMenu .cartMiniSubOrderTotal").shouldHave(matchesText(Neodymium.localizedText("header.shoppingCart.subtotal"))).shouldBe(visible); - subOrderPrice.shouldHave(exactText("$0.00")).shouldBe(visible); + // validate label subtotal + $(".labelText").shouldHave(exactText(Neodymium.localizedText("header.miniCart.subtotal"))).shouldBe(visible); // validate view cart button - $("#miniCartMenu .linkButton").shouldHave(exactText(Neodymium.localizedText("header.shoppingCart.viewCart"))).shouldBe(visible); + $("#miniCartMenu .linkButton").shouldHave(exactText(Neodymium.localizedText("header.miniCart.viewCart"))).shouldBe(visible); + + // validate subtotal + if (getTotalCount() == 0) + { + validateSubtotal("$0.00"); + } + else + { + validateSubtotal(calculateSubtotal()); + } closeMiniCart(); } + /// ----- validate mini cart item ----- /// + @Step("validate data cart item in mini cart") - private void validateMiniCart(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) - { - // validate shopping cart icon, item count - $(".icon-shopping-cart").shouldBe(visible); - + private void validateMiniCartItem(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) + { openMiniCart(); // selector for product @@ -133,50 +204,14 @@ private void validateMiniCart(int position, String productName, String productSt } @Step("validate '{product}' in the mini cart") - public void validateMiniCart(int position, Product product) + public void validateMiniCartItem(int position, Product product) { - validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), PriceHelper.format(product.getTotalPrice())); + validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), PriceHelper.format(product.getTotalPrice())); } @Step("validate '{product}' in the mini cart") - public void validateMiniCart(int position, Product product, int productAmount, String productPrice) - { - validateMiniCart(position, product.getName(), product.getStyle(), product.getSize(), productAmount, productPrice); - } - - /// ----- get data mini cart ----- /// - - @Step("get the subtotal price from mini cart") - public String getSubtotal() - { - openMiniCart(); - String subtotal = subOrderPrice.text(); - closeMiniCart(); - - return subtotal; - } - - - // -------------------------------------------------------------- - - - - @Step("get the total product count from mini cart") - public int getTotalCount() + public void validateMiniCartItem(int position, Product product, int productAmount, String productPrice) { - return Integer.parseInt(totalCountElement.text()); - } - - - @Step("validate '{product}' in the mini cart by name") - public void validateMiniCartByProduct(Product product) - { - SelenideElement productContainer = $$(".cartItems").filter(matchesText(product.getCartRowRegex())).shouldHaveSize(1).first(); - - productContainer.find(".prodName").shouldHave(exactText(product.getName())); - productContainer.find(".prodStyle").shouldHave(exactText(product.getStyle())); - productContainer.find(".prodSize").shouldHave(exactText(product.getSize())); - productContainer.find(".prodCount").shouldHave(exactText(Integer.toString(product.getAmount()))); - productContainer.find(".prodPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); + validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), productAmount, productPrice); } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java index 657aa2cb..55ec2393 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java @@ -20,7 +20,7 @@ public abstract class AbstractCheckoutPage extends AbstractPageObject { - public CheckoutHeader header = new CheckoutHeader(); + public CheckoutHeader checkoutHeader = new CheckoutHeader(); public Footer footer = new Footer(); @@ -31,7 +31,7 @@ public void validateStructure() { isExpectedPage(); - header.isComponentAvailable(); + checkoutHeader.isComponentAvailable(); footer.isComponentAvailable(); userMenu.isComponentAvailable(); } diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 08d11baf..20df9e6e 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -42,13 +42,6 @@ public CartPage isExpectedPage() } /// ----- validate content cart page ----- /// - - @Step("validate empty cart page") - public void validateEmptyCartPage() - { - title.shouldHave(exactText(Neodymium.localizedText("CartPage.title"))).shouldBe(visible); - $("#errorCartMessage").shouldHave(exactText(Neodymium.localizedText("CartPage.errorMessage"))).shouldBe(visible); - } @Step("validate product table head") public void validateTableHead() @@ -66,26 +59,34 @@ public void validateStructure() { super.validateStructure(); - // validate process wrap - //validateProcessWrap(); - // validate title title.shouldHave(exactText(Neodymium.localizedText("CartPage.title"))).shouldBe(visible); - // validate product table head - validateTableHead(); + // check for empty cart page + if (miniCart.getTotalCount() == 0) + { + $("#errorCartMessage").shouldHave(exactText(Neodymium.localizedText("CartPage.errorMessage"))).shouldBe(visible); + } + else + { + // validate process wrap + //validateProcessWrap(); + + // validate product table head + validateTableHead(); - // validate product list - cartTable.shouldBe(visible); + // validate product list + cartTable.shouldBe(visible); - // validate at least 1 product in product list - $("#product0").shouldBe(visible); + // validate at least 1 product in product list + $("#product0").shouldBe(visible); - // validate cart summary list - $("#cartSummaryList").shouldBe(visible); + // validate cart summary list + $("#cartSummaryList").shouldBe(visible); - // validate checkout button - $("#btnStartCheckout").should(visible); + // validate checkout button + $("#btnStartCheckout").should(visible); + } } @Step("validate shipping costs on cart page") @@ -281,72 +282,4 @@ public ReturningCustomerShippingAddressPage openReturningCustomerShippingAddress $("#btnStartCheckout").scrollTo().click(); return new ReturningCustomerShippingAddressPage().isExpectedPage(); } - - - - - - - // ----------------------------------------------------------------------------- // - - @Step("validate subtotal in the cart") - public void validateSubtotal(String subtotal) - { - $$("#cartSummaryList li").findBy(text("Subtotal")).find(".text-right").shouldHave(exactText(subtotal)); - } - - @Step("validate product in the cart") - public void validateContainsProduct(Product product) - { - SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() - .parent().parent(); - productContainer.find(".productName").shouldHave(exactText(product.getName())); - productContainer.find(".productSize").shouldHave(exactText(product.getSize())); - productContainer.find(".productStyle").shouldHave(exactText(product.getStyle())); - productContainer.find(".productCount").shouldHave(value(Integer.toString(product.getAmount()))); - productContainer.find(".productUnitPrice").shouldHave(exactText(product.getUnitPrice())); - productContainer.find(".productTotalUnitPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); - } - - private SelenideElement findProductContainer(String productName, String style, String size) - { - SelenideElement productContainer = $$("div.hidden-xs").filter(text(productName)).first().parent().parent(); - for (int i = 0; i < $$("div.hidden-xs").filter(text(productName)).size(); i++) - { - SelenideElement product = $$("div.hidden-xs").filter(text(productName)).get(i); - if (product.find(".productStyle").text().equals(style) && product.find(".productSize").text().equals(size)) - { - productContainer = product.parent().parent(); - } - } - return productContainer; - } - - @Step("update product count by the name") - public void updateProductCountByName(String productName, String style, String size, int amount) - { - SelenideElement productContainer = findProductContainer(productName, style, size); - productContainer.find(".productCount").setValue(Integer.toString(amount)); - productContainer.find(".btnUpdateProduct").scrollTo().click(); - } - - @Step("remove product by name") - public void removeProductByName(String productName, String style, String size) - { - SelenideElement productContainer = findProductContainer(productName, style, size); - productContainer.find(".btnRemoveProduct").click(); - $("#buttonDelete").click(); - } - - // needed??? - private void clickCheckoutButton() - { - $("#btnStartCheckout").scrollTo().click(); - } - - @Step("check if there are product on the cart page") - public boolean hasProductsInCart() - { - return $("#btnRemoveProdCount0").exists(); - } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java index 866b2097..a8e5d56c 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java @@ -2,7 +2,6 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exactValue; -import static com.codeborne.selenide.Condition.value; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.text; @@ -13,7 +12,6 @@ import org.apache.commons.lang3.StringUtils; import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -39,6 +37,10 @@ public class PlaceOrderPage extends AbstractCheckoutPage private ElementsCollection totalProductPrices = $$(".totalUnitPriceShort"); + private SelenideElement subtotalContainer = $("#SubTotalValue"); + + private SelenideElement taxContainer = $("#SubTotalTaxValue"); + private SelenideElement orderButton = $("#btnOrder"); @Override @@ -71,10 +73,12 @@ public void validateStructure() validateBreadcrumb(); // validate process wrap + // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress indicator //validateProcessWrap(); // validate product table head - validateTableHead(); + // TODO - after fixing issue 191: consistent table head CartPage and PlaceOrderPage + //validateTableHead(); // validate order with costs button $("#btnOrder").shouldHave(exactText(Neodymium.localizedText("PlaceOrderPage.button"))).shouldBe(visible); @@ -92,9 +96,8 @@ public void validateShippingAddressOverview(Address shippingAddress, String head String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); shippingAddressForm.find(".name").shouldHave(exactText(fullName)).shouldBe(visible); - // TODO - fix, so it also works for empty string/ null // validate optional company name - if (!StringUtils.isBlank(shippingAddress.getCompany())); + if (!StringUtils.isBlank(shippingAddress.getCompany())) { shippingAddressForm.find(".company").shouldHave(exactText(shippingAddress.getCompany())).shouldBe(visible); } @@ -121,9 +124,8 @@ public void validateBillingAddressOverview(Address billingAddress, String headli String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); billingAddressForm.find(".name").shouldHave(exactText(fullName)).shouldBe(visible); - // TODO - fix, so it also works for empty string/ null // validate optional company name - if (!StringUtils.isBlank(billingAddress.getCompany())); + if (!StringUtils.isBlank(billingAddress.getCompany())) { billingAddressForm.find(".company").shouldHave(exactText(billingAddress.getCompany())).shouldBe(visible); } @@ -188,7 +190,7 @@ private void validateProduct(int position, String productName, String productSty productContainer.find(".pName").shouldHave(exactText(productName)); productContainer.find(".productStyle").shouldHave(exactText(productStyle)); productContainer.find(".productSize").shouldHave(exactText(productSize)); - // TODO - fix to TA doesn'T break + // TODO - after fixing issue 191: consistent price representation (not "$ 0.00" and "$0.00") //productContainer.find(".productUnitPrice").shouldHave(value(productPrice)); productContainer.find(".productCount").shouldHave(exactValue(Integer.toString(productAmount))); } @@ -204,17 +206,15 @@ public void validateProduct(int position, Product product) @Step("get sum of all total product prices") public String getSubtotal() { - return $("#SubTotalValue").text(); + return subtotalContainer.text(); } @Step("get tax costs") public String getTax() { - return $("#SubTotalTaxValue").text(); + return taxContainer.text(); } - /// ----- validate price summary ----- /// - @Step("calculate sum of all total product prices") public String calculateSubtotal() { @@ -222,12 +222,14 @@ public String calculateSubtotal() for (SelenideElement totalProductPrice : totalProductPrices) { - subtotal = PriceHelper.calculateSubtotal(subtotal, totalProductPrice.getText()); + subtotal = PriceHelper.calculateSubtotalPlaceOrderPage(subtotal, totalProductPrice.getText()); } return PriceHelper.format(subtotal); } + /// ----- validate price summary ----- /// + @Step("validate description strings") public void validateDescriptionStrings() { @@ -247,13 +249,13 @@ public void validatePriceSummary(String subtotal, String shippingCosts) validateDescriptionStrings(); // validate subtotal - $("#SubTotalValue").shouldHave(exactText(calculateSubtotal())); + subtotalContainer.shouldHave(exactText(calculateSubtotal())); // validate shipping costs $("#shippingCosts").shouldHave(exactText(shippingCosts)); // validate tax - $("#SubTotalTaxValue").shouldHave(exactText(PriceHelper.calculateTax(shippingCosts, subtotal))); + taxContainer.shouldHave(exactText(PriceHelper.calculateTax(shippingCosts, subtotal))); // validate grand total $("#orderTotal").shouldHave(exactText(PriceHelper.calculateGrandTotal(subtotal, shippingCosts, getTax()))); @@ -269,20 +271,4 @@ public OrderConfirmationPage placeOrder() return new OrderConfirmationPage().isExpectedPage(); } - - // -------------------------------------------------------------- - - @Step("validate order contains product '{product.name}'") - public void validateContainsProduct(Product product) - { - SelenideElement productContainer = $$("div.hidden-xs").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() - .parent().parent(); - - productContainer.find(".pName").shouldHave(exactText(product.getName())); - productContainer.find(".pSize").shouldHave(exactText(product.getSize())); - productContainer.find(".pStyle").shouldHave(exactText(product.getStyle())); - productContainer.find(".pCount").shouldHave(exactText(Integer.toString(product.getAmount()))); - productContainer.find(".pPrice").shouldHave(exactText(product.getUnitPrice())); - productContainer.find(".productLineItemPrice").shouldHave(exactText(PriceHelper.format(product.getTotalPrice()))); - } } diff --git a/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java b/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java index 22ce7f13..607fcc42 100644 --- a/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java +++ b/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java @@ -1,15 +1,11 @@ package posters.pageobjects.pages.user; -import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import io.qameta.allure.Step; -import posters.tests.testdata.dataobjects.Product; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; public class OrderHistoryPage extends AbstractBrowsingPage @@ -24,16 +20,4 @@ public OrderHistoryPage isExpectedPage() headline.should(exist); return this; } - - @Step("validate product is in the order") - public void validateContainsProduct(Product product) - { - SelenideElement productContainer = $$(".productInfo").filter((matchText(product.getRowRegex()))).shouldHaveSize(1).first() - .parent(); - - productContainer.find(".productName").shouldBe(exactText(product.getName())); - productContainer.find(".productStyle").shouldBe(exactText(product.getStyle())); - productContainer.find(".productSize").shouldBe(exactText(product.getSize())); - productContainer.find(".orderCount").shouldBe(exactText(Integer.toString(product.getAmount()) + "x")); - } } diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index 9798d26b..fea55940 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -32,7 +32,7 @@ public static String format(double input) return addCurrency(decimalFormat.format(input)); } - /// ----- specific calculations ----- /// + /// ----- calculations for price summary ----- /// @Step("calculate total product price") public static String totalProductPrice(String unitPrice, String quantity) @@ -48,8 +48,8 @@ public static String substract(String minuend, String subtrahend) return format(res); } - @Step("calculate subtotal") - public static double calculateSubtotal(double oldSubtotal, String totalProductPrice) + @Step("calculate sum of all total product prices") + public static double calculateSubtotalPlaceOrderPage(double oldSubtotal, String totalProductPrice) { return (double) (Math.round((oldSubtotal + Double.valueOf(totalProductPrice)) * 100)) / 100; } @@ -68,4 +68,18 @@ public static String calculateGrandTotal(String subtotal, String shippingCosts, double grandTotal = (double) (Math.round((Double.valueOf(removeCurrency(subtotal)) + Double.valueOf(removeCurrency(shippingCosts)) + Double.valueOf(removeCurrency(tax))) * 100)) / 100; return format(grandTotal); } + + /// ----- calculations for mini cart ----- /// + + @Step("calculate sum of all total product quantities") + public static int calculateTotalCountMiniCart(int totalCount, String productCount) + { + return (totalCount + Integer.parseInt(productCount)); + } + + @Step("calculate sum of all total product prices") + public static double calculateSubtotalMiniCart(double oldSubtotal, String totalProductPrice) + { + return (double) (Math.round((oldSubtotal + Double.valueOf(removeCurrency(totalProductPrice))) * 100)) / 100; + } } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 6c80f418..0552bb0d 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -10,6 +10,7 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; +import posters.pageobjects.components.MiniCart; import posters.tests.AbstractTest; @Owner("Joe Fix") @@ -23,13 +24,12 @@ public class AddToCartTest extends AbstractTest public void testAddProductsToCart() { final String shippingCosts = Neodymium.dataValue("shippingCosts"); - int totalCount = 0; /// ----- PART 1: USE TOP NAVIGATION TO ADD PRODUCT TO CART ----- /// // go to homepage var homePage = OpenHomePageFlow.flow(); - + // store old subtotal final String oldSubtotal = homePage.miniCart.getSubtotal(); @@ -49,9 +49,9 @@ public void testAddProductsToCart() cartPage.validateCartItem(1, product); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(1, oldSubtotal, 0.00); - cartPage.miniCart.validateTotalCount(++totalCount); - cartPage.miniCart.validateMiniCart(1, product); - + MiniCart.validateStructure(); + cartPage.miniCart.validateMiniCartItem(1, product); + /// ----- PART 2: USE SEARCH BAR TO ADD PRODUCT TO CART ----- /// // store old subtotal @@ -73,9 +73,9 @@ public void testAddProductsToCart() cartPage.validateCartItem(2, product); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(1, oldSubtotal2, 0.00); - cartPage.miniCart.validateTotalCount(++totalCount); - cartPage.miniCart.validateMiniCart(1, product2); - cartPage.miniCart.validateMiniCart(2, product); + MiniCart.validateStructure(); + cartPage.miniCart.validateMiniCartItem(1, product2); + cartPage.miniCart.validateMiniCartItem(2, product); /// ----- PART 3: CHANGE QUANTITY OF PRODUCT IN CART ----- /// @@ -87,7 +87,6 @@ public void testAddProductsToCart() // update amount of product on cart page cartPage.updateProductCount(addToCartTestData.getProductUpdatePosition(), addToCartTestData.getAmountChange()); - totalCount = totalCount + addToCartTestData.getAmountChange() - 1; // store subtotal of updated product String subtotalAfterUpdate = cartPage.getProductTotalPrice(addToCartTestData.getProductUpdatePosition()); @@ -96,8 +95,8 @@ public void testAddProductsToCart() cartPage.validateCartItem(addToCartTestData.getProductUpdatePosition(), productBeforeUpdate, addToCartTestData.getAmountChange()); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(addToCartTestData.getProductUpdatePosition(), oldSubtotal3, productBeforeUpdate.getTotalPrice()); - cartPage.miniCart.validateTotalCount(totalCount); - cartPage.miniCart.validateMiniCart(1, productBeforeUpdate, addToCartTestData.getAmountChange(), subtotalAfterUpdate); + MiniCart.validateStructure(); + cartPage.miniCart.validateMiniCartItem(1, productBeforeUpdate, addToCartTestData.getAmountChange(), subtotalAfterUpdate); /// ----- PART 4: REMOVE PRODUCT FROM CART ----- /// @@ -109,14 +108,13 @@ public void testAddProductsToCart() // remove first product on cart page cartPage.removeProduct(1); - totalCount = totalCount - addToCartTestData.getAmountChange(); // validate cart page cartPage.validateCartItem(1, product); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterRemove(oldSubtotal4, subtotalBeforeRemove); - cartPage.miniCart.validateTotalCount(totalCount); - cartPage.miniCart.validateMiniCart(1, product); + MiniCart.validateStructure(); + cartPage.miniCart.validateMiniCartItem(1, product); /// ----- PART 5: ADD SAME PRODUCT TO CART AGAIN ----- /// @@ -141,7 +139,7 @@ public void testAddProductsToCart() cartPage.validateCartItem(1, productFromCartPageBefore, productFromCartPageAfter.getAmount()); cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(1, oldSubtotal5, productFromCartPageBefore.getTotalPrice()); - cartPage.miniCart.validateTotalCount(++totalCount); - cartPage.miniCart.validateMiniCart(1, productFromCartPageBefore, totalCount, subtotalAfterUpdate); + MiniCart.validateStructure(); + cartPage.miniCart.validateMiniCartItem(1, productFromCartPageBefore, MiniCart.getTotalCount(), subtotalAfterUpdate); } } diff --git a/src/test/java/posters/tests/testdata/dataobjects/Address.java b/src/test/java/posters/tests/testdata/dataobjects/Address.java index 878cd273..9e5820b6 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/Address.java +++ b/src/test/java/posters/tests/testdata/dataobjects/Address.java @@ -18,6 +18,20 @@ public class Address String country; + public Address(String firstName, String lastName, String company, String street, String city, String state, String zip, String country) + { + this.firstName = firstName; + this.lastName = lastName; + this.company = company; + this.street = street; + this.city = city; + this.state = state; + this.zip = zip; + this.country = country; + } + + /// ----- get address data ----- /// + public String getFirstName() { return firstName; diff --git a/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java b/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java index f95248fe..6d29d3ee 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java +++ b/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java @@ -11,18 +11,6 @@ public class CreditCard String expDateYear; - /** - * @param fullName - * the fullName to set - * @param cardNumber - * the cardNumber to set - * @param crypticCardNumber - * the crypticCardNumber to set - * @param expDateMonth - * the expDateMonth to set - * @param expDateYear - * the expDateYear to set - */ public CreditCard(String fullName, String cardNumber, String crypticCardNumber, String expDateMonth, String expDateYear) { this.fullName = fullName; @@ -32,50 +20,30 @@ public CreditCard(String fullName, String cardNumber, String crypticCardNumber, this.expDateYear = expDateYear; } - /** - * @return the fullName - */ + /// ----- get credit card data ----- /// + public String getFullName() { return fullName; } - /** - * @return the cardNumber - */ public String getCardNumber() { return cardNumber; } - /** - * @return the crypticCardNumber - */ public String getCrypticCardNumber() { return crypticCardNumber; } - /** - * @return the expDateMonth - */ public String getExpDateMonth() { return expDateMonth; } - /** - * @return the expDateYear - */ public String getExpDateYear() { return expDateYear; } - - @Override - public String toString() - { - return String.format("CreditCard [fullName()=%s, cardNumber()=%s, crypticCardNumber()=%s, expMonth()=%s, expYear()=%s]", - getFullName(), getCardNumber(), getCrypticCardNumber(), getExpDateMonth(), getExpDateYear()); - } } diff --git a/src/test/java/posters/tests/testdata/dataobjects/Product.java b/src/test/java/posters/tests/testdata/dataobjects/Product.java index cc5887ed..1e0eb4dc 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/Product.java +++ b/src/test/java/posters/tests/testdata/dataobjects/Product.java @@ -1,7 +1,5 @@ package posters.tests.testdata.dataobjects; -import com.xceptance.neodymium.util.Neodymium; - import posters.pageobjects.utility.PriceHelper; public class Product @@ -63,44 +61,4 @@ public double getTotalPrice() { return amount * getUnitPriceDouble(); } - - // ------------------------------------------------------------- - - @Override - public String toString() - { - return String.format("Product [name()=%s, size()=%s, style()=%s, price()=%s]", getName(), getSize(), getStyle(), getUnitPrice(), getAmount()); - } - - @Override - public boolean equals(Object obj) - { - Product other = (Product) obj; - if (name.equals(other.name) && unitPrice.equals(other.unitPrice) && style.equals(other.style) && size.equals(other.size)) - { - return true; - } - return false; - } - - public String getRowRegex() - { - return getName() - + "\\n[a-zA-Z\\s\\.\\,0-9\\!]+\\n" - + Neodymium.localizedText("General.product.style") - + "\\:\\s" + getStyle() - + "\\n" - + Neodymium.localizedText("General.product.size") - + "\\:\\s" + getSize(); - } - - public String getCartRowRegex() - { - return getName() - + "\\n" - + Neodymium.localizedText("General.product.quantity") - + ":\\s" + "\\d+\\s\\(" + getStyle() - + ",\\s" + getSize() - + "\\s\\)\\n\\$\\d+\\.\\d+"; - } } diff --git a/src/test/java/posters/tests/testdata/dataobjects/User.java b/src/test/java/posters/tests/testdata/dataobjects/User.java index a820a481..0ee63983 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/User.java +++ b/src/test/java/posters/tests/testdata/dataobjects/User.java @@ -18,6 +18,8 @@ public User(String firstName, String lastName, String email, String password) this.password = password; } + /// ----- get user data ----- /// + public String getFirstName() { return firstName; @@ -37,10 +39,4 @@ public String getPassword() { return password; } - - @Override - public String toString() - { - return String.format("User [firstName()=%s, lastName()=%s, email()=%s, password()=%s]", getFirstName(), getLastName(), getEmail(), getPassword()); - } } diff --git a/src/test/resources/posters/tests/smoke/GuestOrderTest.json b/src/test/resources/posters/tests/smoke/GuestOrderTest.json index 26bc702f..a3e6d43a 100644 --- a/src/test/resources/posters/tests/smoke/GuestOrderTest.json +++ b/src/test/resources/posters/tests/smoke/GuestOrderTest.json @@ -20,7 +20,7 @@ { "firstName": "Jimmy Blue", "lastName": "Ochsenknecht", - "company": "Ochsenknecht Records", + "company": "", "street": "9 Floor St", "city": "Los Angeles", "state": "California", From 63864ed2771336217dbeb49bae4de9c4ba50a42d Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Fri, 11 Aug 2023 16:20:20 +0200 Subject: [PATCH 28/44] cleaned validatio UserMenu --- config/localization.yaml | 4 +- .../java/posters/flows/CartCleanUpFlow.java | 3 +- .../pageobjects/components/ErrorMessage.java | 2 + .../pageobjects/components/Footer.java | 2 + .../pageobjects/components/Header.java | 4 +- .../pageobjects/components/MiniCart.java | 114 +++++++++--------- .../pageobjects/components/Pagination.java | 25 ---- .../pageobjects/components/SaleBanner.java | 2 + .../pageobjects/components/Search.java | 20 +-- .../components/SuccessMessage.java | 2 + .../pageobjects/components/TopNavigation.java | 95 +++------------ .../pageobjects/components/UserMenu.java | 99 ++++++++------- .../smoke/BrowseRandomVisualAssertTest.java | 83 ------------- .../posters/tests/smoke/GuestOrderTest.java | 1 + .../tests/smoke/RegisteredOrderTest.java | 3 +- .../smoke/BrowseRandomVisualAssertTest.json | 18 --- 16 files changed, 156 insertions(+), 321 deletions(-) delete mode 100644 src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java delete mode 100644 src/test/resources/posters/tests/smoke/BrowseRandomVisualAssertTest.json diff --git a/config/localization.yaml b/config/localization.yaml index 4ebd8476..d0ae0c2d 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -27,9 +27,11 @@ default: "3": Landscapes "4": XXL Panoramas userMenu: - greeting: "WELCOME: GUEST" + title: "WELCOME: " createAccount: CREATE ACCOUNT signIn: SIGN IN + accountOverview: MY ACCOUNT + logout: LOGOUT miniCart: title: singular: ITEM IN THE CART diff --git a/src/test/java/posters/flows/CartCleanUpFlow.java b/src/test/java/posters/flows/CartCleanUpFlow.java index a7df5b92..dd49cf27 100644 --- a/src/test/java/posters/flows/CartCleanUpFlow.java +++ b/src/test/java/posters/flows/CartCleanUpFlow.java @@ -1,6 +1,7 @@ package posters.flows; import io.qameta.allure.Step; +import posters.pageobjects.components.MiniCart; import posters.pageobjects.pages.browsing.HomePage; public class CartCleanUpFlow @@ -14,7 +15,7 @@ public static void flow() var cartPage = homePage.miniCart.openCartPage(); // remove the first product as long as one is available - while (cartPage.miniCart.getTotalCount() != 0) + while (MiniCart.getTotalCount() != 0) { cartPage.removeProduct(1); } diff --git a/src/test/java/posters/pageobjects/components/ErrorMessage.java b/src/test/java/posters/pageobjects/components/ErrorMessage.java index 40c02a1c..1883d826 100644 --- a/src/test/java/posters/pageobjects/components/ErrorMessage.java +++ b/src/test/java/posters/pageobjects/components/ErrorMessage.java @@ -20,6 +20,8 @@ public void isComponentAvailable() errorMessage.should(exist); } + /// ----- validate error message ----- /// + @Step("validate that the error message {message} is visible") public void validateErrorMessage(String message) { diff --git a/src/test/java/posters/pageobjects/components/Footer.java b/src/test/java/posters/pageobjects/components/Footer.java index 7c0fba14..0c8ec1e2 100644 --- a/src/test/java/posters/pageobjects/components/Footer.java +++ b/src/test/java/posters/pageobjects/components/Footer.java @@ -19,6 +19,8 @@ public void isComponentAvailable() footer.should(exist); } + /// ----- validate footer ----- /// + @Step("validate the footer") public void validateStructure() { diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index 4461a317..27238534 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -15,6 +15,8 @@ public void isComponentAvailable() $("#globalNavigation").should(exist); } + /// ----- validate header ----- /// + @Step("validate structure header") public void validateStructure() { @@ -22,7 +24,7 @@ public void validateStructure() Search.validateStructure(); TopNavigation.validateStructure(); - UserMenu.validateGuestUserMenu(); + UserMenu.validateStructure(); MiniCart.validateStructure(); SaleBanner.validateStructure(); } diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 105367d8..cfbc6dd0 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -21,28 +21,28 @@ public class MiniCart extends AbstractComponent private static SelenideElement headerCart = $("#headerCartOverview"); private static SelenideElement subOrderPrice = $("#miniCartMenu .subOrderPrice"); - + private static SelenideElement miniCart = $("#miniCartMenu"); - + private static SelenideElement miniCartTitle = $(".cartMiniProductCounter"); private static SelenideElement totalCountElement = $("#headerCartOverview .headerCartProductCount"); - + private SelenideElement goToCartButton = $(".goToCart"); - + private static ElementsCollection productCounts = $$(".prodCount"); - + private static ElementsCollection productPrices = $$(".prodPrice strong"); - + @Override @Step("ensure availability mini cart") public void isComponentAvailable() { $("#btnCartOverviewForm").should(exist); } - + /// ----- mini cart navigation ------ /// - + @Step("open the mini cart") public static void openMiniCart() { @@ -56,7 +56,7 @@ public static void closeMiniCart() $("#brand").hover(); miniCart.waitUntil(not(visible), 9000); } - + @Step("open the cart page") public CartPage openCartPage() { @@ -64,9 +64,9 @@ public CartPage openCartPage() goToCartButton.click(); return new CartPage().isExpectedPage(); } - + /// ----- get data mini cart ----- /// - + @Step("get the subtotal price from mini cart") public String getSubtotal() { @@ -76,139 +76,133 @@ public String getSubtotal() return subtotal; } - + @Step("get the total product count from mini cart") public static int getTotalCount() { return Integer.parseInt(totalCountElement.text()); } - + @Step("calculate sum of all total product prices") - public static String calculateSubtotal() + public static String calculateSubtotal() { double subtotal = 0; - - for (SelenideElement totalProductPrice : productPrices) + + for (SelenideElement totalProductPrice : productPrices) { subtotal = PriceHelper.calculateSubtotalMiniCart(subtotal, totalProductPrice.getText()); } return PriceHelper.format(subtotal); } - + @Step("calculate total count via product counts") - public static int calculateTotalCount() + public static int calculateTotalCount() { int totalCount = 0; - - if ($(".cartItems").exists()) + + if ($(".cartItems").exists()) { - for (SelenideElement productCount : productCounts) + for (SelenideElement productCount : productCounts) { totalCount = PriceHelper.calculateTotalCountMiniCart(totalCount, productCount.getText()); } - + return totalCount; } - + return totalCount; } - + /// ----- validate mini cart structure ----- /// - + @Step("validate the mini cart total product count") public static void validateTotalCount(int totalCount) { totalCountElement.shouldHave(exactText(Integer.toString(totalCount))); } - + @Step("validate the mini cart title") public static void validateTitle() - { - if (getTotalCount() == 1) + { + if (getTotalCount() == 1) { miniCartTitle.shouldHave(exactText(getTotalCount() + " " + Neodymium.localizedText("header.miniCart.title.singular"))).shouldBe(visible); } - else + else { miniCartTitle.shouldHave(exactText(getTotalCount() + " " + Neodymium.localizedText("header.miniCart.title.plural"))).shouldBe(visible); } } - + @Step("validate the mini cart subtotal price") public static void validateSubtotal(String subtotal) { subOrderPrice.shouldHave(exactText(subtotal)).shouldBe(visible); } - + @Step("validate mini cart menu") public static void validateStructure() { openMiniCart(); - + // validate shopping cart icon $(".icon-shopping-cart").shouldBe(visible); - + // validate total count - validateTotalCount((int)(calculateTotalCount())); - + validateTotalCount((int) (calculateTotalCount())); + // validate title // TODO - fix consistency mini cart title - //validateTitle(); - + // validateTitle(); + // validate label subtotal $(".labelText").shouldHave(exactText(Neodymium.localizedText("header.miniCart.subtotal"))).shouldBe(visible); - + // validate view cart button $("#miniCartMenu .linkButton").shouldHave(exactText(Neodymium.localizedText("header.miniCart.viewCart"))).shouldBe(visible); - + // validate subtotal - if (getTotalCount() == 0) - { + if (getTotalCount() == 0) { + // if there are no items in cart validateSubtotal("$0.00"); } - else + else { + // if there are items in cart validateSubtotal(calculateSubtotal()); } - + closeMiniCart(); } - + /// ----- validate mini cart item ----- /// - + @Step("validate data cart item in mini cart") private void validateMiniCartItem(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) - { + { openMiniCart(); - + // selector for product SelenideElement miniCartItem = $$("#miniCartMenu .cartItems").get(position - 1); - - // validate product name is same as {productName} + + // validate parameters miniCartItem.find(".prodName").shouldHave(exactText(productName)); - - // validate product style is same as {productStyle} miniCartItem.find(".prodStyle").shouldHave(exactText(productStyle)); - - // validate product size is same as {productSize} miniCartItem.find(".prodSize").shouldHave(exactText(productSize)); - - // validate product count is same as {productCount} miniCartItem.find(".prodCount").shouldHave(exactText(Integer.toString(productCount))); - - // validate product prize is same as {productPrize} miniCartItem.find(".prodPrice").shouldHave(exactText(prodTotalPrice)); closeMiniCart(); } - + @Step("validate '{product}' in the mini cart") public void validateMiniCartItem(int position, Product product) { - validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), PriceHelper.format(product.getTotalPrice())); + validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), + PriceHelper.format(product.getTotalPrice())); } - + @Step("validate '{product}' in the mini cart") public void validateMiniCartItem(int position, Product product, int productAmount, String productPrice) { diff --git a/src/test/java/posters/pageobjects/components/Pagination.java b/src/test/java/posters/pageobjects/components/Pagination.java index 6ade049d..35ed596e 100644 --- a/src/test/java/posters/pageobjects/components/Pagination.java +++ b/src/test/java/posters/pageobjects/components/Pagination.java @@ -110,29 +110,4 @@ public void validateStructure(int expectedResultCount) } else return; } - - // --------------------------------------------- - - @Step("get number of available pages") - public int getNumberOfSites() - { - return pagination.findAll("li > a").filter(matchText("\\d+")).size(); - } - - @Step("get the link to a specific page") - public SelenideElement getSite(String stringNumber) - { - return pagination.find(Selectors.withText(stringNumber)); - } - - @Step("click on any link represented by a number") - public CategoryPage clickOnRandomSite(Random random) - { - String stringChosenElementValue = Integer.toString(random.nextInt(getNumberOfSites()) + 1); - SelenideElement chosenPaginationLink = getSite(stringChosenElementValue); - chosenPaginationLink.scrollTo(); - chosenPaginationLink.click(); - - return new CategoryPage().isExpectedPage(); - } } diff --git a/src/test/java/posters/pageobjects/components/SaleBanner.java b/src/test/java/posters/pageobjects/components/SaleBanner.java index d443bd1e..66815cef 100644 --- a/src/test/java/posters/pageobjects/components/SaleBanner.java +++ b/src/test/java/posters/pageobjects/components/SaleBanner.java @@ -16,6 +16,8 @@ public void isComponentAvailable() { $(".sale").should(exist); } + + /// ----- validate sale banner ----- /// @Step("validate strings sale banner") private static void validateSaleBanner(String text) diff --git a/src/test/java/posters/pageobjects/components/Search.java b/src/test/java/posters/pageobjects/components/Search.java index a3a28e5e..90b7f032 100644 --- a/src/test/java/posters/pageobjects/components/Search.java +++ b/src/test/java/posters/pageobjects/components/Search.java @@ -21,16 +21,8 @@ public void isComponentAvailable() { searchField.should(exist); } - - @Step("validate structure search bar") - public static void validateStructure() - { - searchField.shouldBe(visible); - $("#btnSearch").shouldBe(visible); - $(".icon-search").shouldBe(visible); - } - // ----- search navigation ----- // + /// ----- search navigation ----- /// @Step("open search field") public void openSearch() @@ -65,4 +57,14 @@ public CategoryPage categoryPageResult(String searchTerm) search(searchTerm); return new CategoryPage().isExpectedPage(); } + + /// ----- validate search ----- /// + + @Step("validate structure search bar") + public static void validateStructure() + { + searchField.shouldBe(visible); + $("#btnSearch").shouldBe(visible); + $(".icon-search").shouldBe(visible); + } } diff --git a/src/test/java/posters/pageobjects/components/SuccessMessage.java b/src/test/java/posters/pageobjects/components/SuccessMessage.java index 7290fc4e..cb6a5427 100644 --- a/src/test/java/posters/pageobjects/components/SuccessMessage.java +++ b/src/test/java/posters/pageobjects/components/SuccessMessage.java @@ -19,6 +19,8 @@ public void isComponentAvailable() { successMessage.should(exist); } + + /// ----- validate success message ----- /// @Step("validate that the success message '{message}' is visible") public void validateSuccessMessage(String message) diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index f9985f81..78f7e3a8 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -27,7 +27,24 @@ public void isComponentAvailable() categoryMenu.should(exist); } - // ----- validate content top navigation ----- // + // ----- category navigation ------ // + + @Step("click on '{categoryName}' category") + public CategoryPage clickCategory(String topCategory) + { + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).scrollTo().click(); + return new CategoryPage().isExpectedPage(); + } + + @Step("click on a '{subCategoryName}' subcategory within '{categoryName}'") + public CategoryPage clickSubCategory(String topCategory, String subCategory) + { + $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).hover(); + $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).click(); + return new CategoryPage().isExpectedPage(); + } + + // ----- validate top navigation ----- // @Step("validate name of components in navigation") public static void validateNavComponent(String topCategory) @@ -78,80 +95,4 @@ public static void validateStructure() // close sub navigation $("#globalNavigation").hover(); } - - // ----- category navigation ------ // - - @Step("click on '{categoryName}' category") - public CategoryPage clickCategory(String topCategory) - { - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).scrollTo().click(); - return new CategoryPage().isExpectedPage(); - } - - @Step("click on a '{subCategoryName}' subcategory within '{categoryName}'") - public CategoryPage clickSubCategory(String topCategory, String subCategory) - { - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).hover(); - $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).click(); - return new CategoryPage().isExpectedPage(); - } - - // ---------------------------------------------------------------- - - // TODO - check if needed - @Step ("get the category name") - public static String getCategoryNameByPosition(int categoryPosition) - { - return $("#categoryMenu li:nth-of-type(" + categoryPosition + ") a").attr("title"); - } - - // TODO - check if needed - @Step("get the subcategory name") - public static String getSubCategoryNameByPosition(int categoryPosition, int subCategoryPosition) - { - return $("#categoryMenu li:nth-of-type(" + categoryPosition + ") .dropdown li:nth-of-type(" + subCategoryPosition + ") a").attr("title"); - } - - // TODO - improve - @Step("click a subcategory") - public CategoryPage clickSubCategoryByPosition(int categoryPosition, int subCategoryPosition) - { - // Open the category page - SelenideElement topCat = $$("#categoryMenu .has-dropdown").get(categoryPosition - 1); - topCat.hover(); - // Clicks the subcategory with position @{subCategoryPosition} - // belonging to the category with position @{categoryPosition} - topCat.find(".dropdown-menu a", subCategoryPosition - 1).click(); - return new CategoryPage().isExpectedPage(); - } - - // TODO - check if needed - @Step("click on a product by name '{productName}'") - public CategoryPage clickSubcategoryByName(String subCategoryName) - { - categoryMenu.find(".dropdown-menu li > a[title='" + subCategoryName + "']").parent().parent().parent().hover(); - categoryMenu.find(By.linkText(subCategoryName)).click(); - - return new CategoryPage().isExpectedPage(); - } - - // TODO - check if needed - @Step("get a random sub category name ") - public String getRandomSubcategoryName(Random random) - { - // compute random horizontal category position (for posters: random value from 1 to 4) - // ["World of nature", "Dining", "Transportation", "Panoramas"] - int categoryPositionX = random.nextInt(3) + 1; - - // compute random vertical category position (for posters: random value from 1 to 4) - // if (categoryPositionX == 4) == true then categoryPositionY has range from 1 to 4 - // otherwise from 1 to 3, because any category has 3 subcategories instead of category 4, which has 4 - int categoryPositionY; - if (categoryPositionX == 4) - categoryPositionY = random.nextInt(3) + 1; - else - categoryPositionY = random.nextInt(2) + 1; - - return getSubCategoryNameByPosition(categoryPositionX, categoryPositionY); - } } diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index fd4c4006..f75680a0 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -3,14 +3,15 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.not; +import static com.codeborne.selenide.Condition.text; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; +import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.user.AccountOverviewPage; import posters.pageobjects.pages.user.LoginPage; import posters.pageobjects.pages.user.RegisterPage; @@ -18,7 +19,7 @@ public class UserMenu extends AbstractComponent { - private final SelenideElement userMenu = $("#userMenu"); + private final static SelenideElement userMenu = $("#userMenu"); private static SelenideElement showUserMenu = $("#showUserMenu"); @@ -28,23 +29,23 @@ public void isComponentAvailable() { showUserMenu.should(exist); } - + /// ----- user menu navigation ----- /// - + @Step("open user menu") - public void openUserMenu() + public static void openUserMenu() { showUserMenu.hover(); userMenu.waitUntil(visible, 9000); } @Step("close user menu") - public void closeUserMenu() + public static void closeUserMenu() { - $("#brand").hover(); + $(".top-menu").hover(); userMenu.waitUntil(not(visible), 9000); } - + @Step("open register page from user menu") public RegisterPage openRegisterPage() { @@ -52,7 +53,7 @@ public RegisterPage openRegisterPage() userMenu.find(".goToRegistration").click(); return new RegisterPage().isExpectedPage(); } - + @Step("open login page from user menu") public LoginPage openLoginPage() { @@ -68,41 +69,17 @@ public AccountOverviewPage openAccountOverviewPage() userMenu.find(".goToAccountOverview").click(); return new AccountOverviewPage().isExpectedPage(); } - - /// ----- validate user menu ----- /// - - @Step("validate logged in user menu") - public static void validateStructure() - { - // TODO - verify for logged on user - } - - @Step("validate strings in user menu") - private static void validateGuestUserMenu(String text) + + @Step("perform logout") + public HomePage logout() { - $$("#userMenu li").findBy(exactText(Neodymium.localizedText(text))).shouldBe(visible); - } - - @Step("validate guest user menu") - public static void validateGuestUserMenu() - { - // validate user icon - $(".icon-user2").shouldBe(visible); - - // open user window - showUserMenu.hover(); - - // validate structure user window - validateGuestUserMenu("header.userMenu.greeting"); - validateGuestUserMenu("header.userMenu.createAccount"); - validateGuestUserMenu("header.userMenu.signIn"); - $("#userMenu .icon-user-add-outline").shouldBe(visible); - $("#userMenu .icon-log-in").shouldBe(visible); - - // close user window - $("#globalNavigation").hover(); + openUserMenu(); + userMenu.find(".goToLogout").click(); + return new HomePage().isExpectedPage(); } - + + /// ----- validate user menu ----- /// + @Step("validate that nobody is logged in") public void validateNotLoggedIn() { @@ -110,11 +87,11 @@ public void validateNotLoggedIn() } @Step("validate that somebody is logged in") - public boolean validateIsLoggedIn() + public static boolean validateIsLoggedIn() { - return userMenu.find(".goToAccountOverview").exists(); + return userMenu.find(".firstName").exists(); } - + @Step("validate that '{firstName}' is logged in") public void validateLoggedInName(String firstName) { @@ -122,4 +99,36 @@ public void validateLoggedInName(String firstName) userMenu.find(".firstName").shouldHave(exactText(firstName)); closeUserMenu(); } + + @Step("validate logged in user menu") + public static void validateStructure() + { + openUserMenu(); + + // validate user icon + $(".icon-user2").shouldBe(visible); + + // validate title + userMenu.find(".userMenuHeader").shouldHave(text(Neodymium.localizedText("header.userMenu.title"))).shouldBe(visible); + + // validate buttons + if (validateIsLoggedIn()) + { + // if customer is logged in + userMenu.find(".goToAccountOverview").shouldHave(exactText(Neodymium.localizedText("header.userMenu.accountOverview"))).shouldBe(visible); + userMenu.find(".goToLogout").shouldHave(exactText(Neodymium.localizedText("header.userMenu.logout"))).shouldBe(visible); + userMenu.find(".icon-info-large").shouldBe(visible); + userMenu.find(".icon-log-out").shouldBe(visible); + } + else + { + // if customer is not logged in + userMenu.find(".goToRegistration").shouldHave(exactText(Neodymium.localizedText("header.userMenu.createAccount"))).shouldBe(visible); + userMenu.find(".goToLogin").shouldHave(exactText(Neodymium.localizedText("header.userMenu.signIn"))).shouldBe(visible); + userMenu.find(".icon-user-add-outline").shouldBe(visible); + userMenu.find(".icon-log-in").shouldBe(visible); + } + + closeUserMenu(); + } } diff --git a/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java b/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java deleted file mode 100644 index 3c126b3b..00000000 --- a/src/test/java/posters/tests/smoke/BrowseRandomVisualAssertTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package posters.tests.smoke; - -import java.util.Random; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import com.xceptance.neodymium.module.statement.browser.multibrowser.Browser; -import com.xceptance.neodymium.util.DataUtils; - -import io.qameta.allure.Owner; -import io.qameta.allure.Severity; -import io.qameta.allure.SeverityLevel; -import io.qameta.allure.junit4.Tag; -import posters.flows.OpenHomePageFlow; -import posters.pageobjects.pages.browsing.CategoryPage; -import posters.pageobjects.pages.browsing.ProductDetailPage; -import posters.tests.AbstractTest; - -@Owner("Tim Brown") -@Severity(SeverityLevel.NORMAL) -@Tag("smoke") -@Browser("Firefox_headless") -@Ignore -public class BrowseRandomVisualAssertTest extends AbstractTest -{ - private static int numberOfProductDetailPages; - - private static Random random; - - @Before - public void setup() - { - try - { - random = new Random(DataUtils.asLong("seed")); - } - catch (Exception e) - { - random = new Random(); - } - - try - { - numberOfProductDetailPages = DataUtils.asInt("numberOfProductDetailPages"); - } - catch (Exception e) - { - numberOfProductDetailPages = random.nextInt(10) + 1; - } - } - - @Test - public void browseRandomCategoriesAndProducts() - { - CategoryPage categoryPage; - ProductDetailPage productPage; - - for (int i = 1; i <= numberOfProductDetailPages; i++) - { - // Go to homepage - LOGGER.info("Homepage"); - var homePage = OpenHomePageFlow.flow(); - homePage.validateAndVisualAssert(); - - // Go to category - LOGGER.info("Category page"); - String categoryName = homePage.topNav.getRandomSubcategoryName(random); - categoryPage = homePage.topNav.clickSubcategoryByName(categoryName); - categoryPage.validateAndVisualAssert(categoryName, 30); - categoryPage = categoryPage.pagination.clickOnRandomSite(random); - categoryPage.scrollToTop(); - categoryPage.validateAndVisualAssert(categoryName, 30); - - // Go to any product detail page - LOGGER.info("Product detail page"); - String productName = categoryPage.getRandomProductDetailName(random); - productPage = categoryPage.clickProductByName(productName); - productPage.validateAndVisualAssert(productName); - } - } -} \ No newline at end of file diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index dc8c669c..f14199dd 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -10,6 +10,7 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; +import posters.pageobjects.components.UserMenu; import posters.pageobjects.pages.checkout.GuestPaymentPage; import posters.pageobjects.pages.checkout.PlaceOrderPage; import posters.tests.AbstractTest; diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 1ad68937..cd211979 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -10,6 +10,7 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; +import posters.pageobjects.components.UserMenu; import posters.tests.AbstractTest; @Owner("Lisa Smith") @@ -19,7 +20,7 @@ public class RegisteredOrderTest extends AbstractTest { @DataSet(1) - @DataSet(2) + //@DataSet(2) @Test public void testOrderingAsRegisteredUser() { diff --git a/src/test/resources/posters/tests/smoke/BrowseRandomVisualAssertTest.json b/src/test/resources/posters/tests/smoke/BrowseRandomVisualAssertTest.json deleted file mode 100644 index bfc3e255..00000000 --- a/src/test/resources/posters/tests/smoke/BrowseRandomVisualAssertTest.json +++ /dev/null @@ -1,18 +0,0 @@ -[ - { - "numberOfProductDetailPages": "1", - "seed": "3524646135135" - }, - { - "numberOfProductDetailPages": "2", - "seed": "8645363546353" - }, - { - "numberOfProductDetailPages": "4", - "seed": "166346543535434" - }, - { - "numberOfProductDetailPages": "5", - "seed": "64541654646546" - } -] From 38de0c41be5fd63d29ca8089007c10a8a6fad893 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Fri, 11 Aug 2023 16:45:04 +0200 Subject: [PATCH 29/44] cleaned browsing pages --- .../pageobjects/components/MiniCart.java | 3 +- .../pageobjects/components/Pagination.java | 5 -- .../pageobjects/components/TopNavigation.java | 4 - .../pages/browsing/CategoryPage.java | 75 ++----------------- .../pageobjects/pages/browsing/HomePage.java | 28 +------ .../pages/browsing/NoHitsPage.java | 2 + .../pages/browsing/ProductDetailPage.java | 16 +--- .../pageobjects/pages/checkout/CartPage.java | 5 +- .../posters/tests/smoke/GuestOrderTest.java | 1 - .../tests/smoke/RegisteredOrderTest.java | 1 - 10 files changed, 17 insertions(+), 123 deletions(-) diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index cfbc6dd0..036eeff2 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -199,8 +199,7 @@ private void validateMiniCartItem(int position, String productName, String produ @Step("validate '{product}' in the mini cart") public void validateMiniCartItem(int position, Product product) { - validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), - PriceHelper.format(product.getTotalPrice())); + validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), PriceHelper.format(product.getTotalPrice())); } @Step("validate '{product}' in the mini cart") diff --git a/src/test/java/posters/pageobjects/components/Pagination.java b/src/test/java/posters/pageobjects/components/Pagination.java index 35ed596e..5399d7fc 100644 --- a/src/test/java/posters/pageobjects/components/Pagination.java +++ b/src/test/java/posters/pageobjects/components/Pagination.java @@ -1,20 +1,15 @@ package posters.pageobjects.components; import static com.codeborne.selenide.Condition.exactText; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; -import java.util.Random; - import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.Selectors; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.pageobjects.pages.browsing.CategoryPage; public class Pagination extends AbstractComponent { diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index 78f7e3a8..b814597f 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -6,10 +6,6 @@ import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; -import java.util.Random; - -import org.openqa.selenium.By; - import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index fab782c6..1c3a1d88 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -5,11 +5,7 @@ import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; -import java.util.Random; - -import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -53,14 +49,16 @@ public void validateCategoryHeadline(String categoryName, int expectedResultCoun { if (categoryName.contains(".")) { + // if {categoryName} contains Neodymium localization titleCategoryName.should(matchText(Neodymium.localizedText(categoryName))).shouldBe(visible); - titleCategoryName.shouldHave(matchText(Integer.toString(expectedResultCount))).shouldBe(visible); + titleCategoryName.should(matchText(Integer.toString(expectedResultCount))).shouldBe(visible); } else { + // if {categoryName} is search input $("#titleSearchText").should(matchText(Neodymium.localizedText("CategoryPage.search.resultText"))).shouldBe(visible); - $("#searchTextValue").should(exactText(categoryName)).shouldBe(visible); - $("#totalProductCount").should(exactText(Integer.toString(expectedResultCount))).shouldBe(visible); + $("#searchTextValue").shouldHave(exactText(categoryName)).shouldBe(visible); + $("#totalProductCount").shouldHave(exactText(Integer.toString(expectedResultCount))).shouldBe(visible); } } @@ -85,67 +83,4 @@ public ProductDetailPage clickProductByPosition(int position) $("#product" + (position - 1)).scrollTo().click(); return new ProductDetailPage().isExpectedPage(); } - - - // ---------------------------------------------------------- - - - // TODO - check if needed - @Step("click on a product by position in grid") - public ProductDetailPage clickProductByPosition(int row, int column) - { - // Open the product detail page - // Clicks a product by position. Because of the html code, this requires x and y coordinates. - SelenideElement rowContainer = $$("#pName").get(row - 1); - rowContainer.find(".thumbnail", column - 1).scrollTo().click(); - return new ProductDetailPage().isExpectedPage(); - } - - // TODO - check if needed - @Step("get a product name by position in grid") - public String getProductNameByPosition(int row, int column) - { - SelenideElement rowContainer = productOverview.findAll("#products #pRows").get(row - 1); - return rowContainer.find("h2.pName", column - 1).text(); - } - - // TODO - check if needed - @Step("click on a product by name '{productName}'") - public ProductDetailPage clickProductByName(String productName) - { - // Open the product detail page - // Click on the product's image and open the product overview page - // Click the product link to open the product detail page - $("#productOverview .thumbnails .thumbnail a > img.pImage[title='" + productName + "']").scrollTo().click(); - return new ProductDetailPage().isExpectedPage(); - } - - // TODO - check if needed - @Step("validate product '{productName}' is visible on category page") - public void validateProductVisible(String productName) - { - $("#productOverview .thumbnails .thumbnail a > img.pImage[title='" + productName + "']").shouldBe(visible); - } - - // TODO - check if needed - @Step("validate category page of category '{categoryName}' and assert visually") - public void validateAndVisualAssert(String categoryName, int expectedResultCount) - { - validateStructureAndVisual(); - validateCategoryHeadline(categoryName, expectedResultCount); - } - - // TODO - check if needed - public String getRandomProductDetailName(Random random) - { - ElementsCollection rows = productOverview.findAll(".thumbnails.row"); - int numberOfRows = rows.size(); - int productIndexX = random.nextInt(numberOfRows); - - SelenideElement row = rows.get(productIndexX); - int numberOfColumns = row.findAll(".thumbnail").filter(visible).size(); - int productIndexY = random.nextInt(numberOfColumns); - - return getProductNameByPosition(productIndexX + 1, productIndexY + 1); - } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index cb50df3e..48d2ed72 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -10,7 +10,6 @@ import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; -import posters.tests.testdata.dataobjects.User; public class HomePage extends AbstractBrowsingPage { @@ -33,7 +32,7 @@ public HomePage isExpectedPage() return this; } - /// ----- validate homepage ----- /// + /// ----- validate content homepage ----- /// @Step("validate poster slide") public void validatePosterSlide() @@ -103,6 +102,8 @@ public void validateStructure() $("a.btn-primary-shop").shouldHave(exactText(Neodymium.localizedText("HomePage.shopAllProducts"))).shouldBe(visible); } + /// ----- validate success messages ----- /// + @Step("validate successful login on home page") public void validateSuccessfulLogin(String firstName) { @@ -118,27 +119,4 @@ public void validateSuccessfulDeletedAccount() { successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulAccountDeletion")); } - - // -------------------------------------------------- - - @Step("validate successful order on home page") - public void validateSuccessfulOrder() - { - successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulOrder")); - // Verify that the mini cart is empty again - miniCart.validateTotalCount(0); - miniCart.validateSubtotal("$0.00"); - } - - public void validateAndVisualAssert() - { - validateStructureAndVisual(); - footer.validateStructure(); - } - - public ProductDetailPage clickOnPresentedProduct(String productName) - { - $$("#productList .thumbnail .pName").filter(exactText(productName)).shouldHaveSize(1).first().click(); - return new ProductDetailPage().isExpectedPage(); - } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java b/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java index bdd9dc00..fb79c884 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java @@ -18,6 +18,8 @@ public NoHitsPage isExpectedPage() return this; } + /// ----- validate no hits page ----- /// + @Step("validate that no products are on no hits page") public void validateNoProductsFound() { diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index 7733b8bc..ced31862 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -36,7 +36,7 @@ public ProductDetailPage isExpectedPage() public void validateSizeDropdown(String size) { - productSize.shouldBe(matchText(Neodymium.localizedText(size))).should(exist); + productSize.should(matchText(Neodymium.localizedText(size))).should(exist); } @Step("validate size dropdown") @@ -75,10 +75,10 @@ public void validateStructure() $("#prodImg").shouldBe(visible); // validate title - productName.shouldHave(matchText("[A-Z].{3,}")).shouldBe(visible); + productName.should(matchText("[A-Z].{3,}")).shouldBe(visible); // validate product price - productPrice.shouldHave(matchText("\\$\\d+\\.\\d{2}")).shouldBe(visible); + productPrice.should(matchText("\\$\\d+\\.\\d{2}")).shouldBe(visible); // validate product description $("#prodDescriptionOverview").shouldBe(visible); @@ -172,14 +172,4 @@ public Product getProduct() { return new Product(getProductName(), getProductPrice(), getChosenStyle(), getChosenSize(), 1); } - - // ---------------------------------------------------------------------------------- - - - @Step("validate the product detail page of '{productName}' and assert visually") - public void validateAndVisualAssert(String productName) - { - validateStructureAndVisual(); - validateProductName(productName); - } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 20df9e6e..09f497ca 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -17,6 +17,7 @@ import io.qameta.allure.Step; import posters.tests.testdata.dataobjects.Product; +import posters.pageobjects.components.MiniCart; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.browsing.ProductDetailPage; @@ -62,8 +63,8 @@ public void validateStructure() // validate title title.shouldHave(exactText(Neodymium.localizedText("CartPage.title"))).shouldBe(visible); - // check for empty cart page - if (miniCart.getTotalCount() == 0) + // check if cart contains items, validate + if (MiniCart.getTotalCount() == 0) { $("#errorCartMessage").shouldHave(exactText(Neodymium.localizedText("CartPage.errorMessage"))).shouldBe(visible); } diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index f14199dd..dc8c669c 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -10,7 +10,6 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; -import posters.pageobjects.components.UserMenu; import posters.pageobjects.pages.checkout.GuestPaymentPage; import posters.pageobjects.pages.checkout.PlaceOrderPage; import posters.tests.AbstractTest; diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index cd211979..7aa5513c 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -10,7 +10,6 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; -import posters.pageobjects.components.UserMenu; import posters.tests.AbstractTest; @Owner("Lisa Smith") From bc2e0b7b59615560acf9811345bd3122cd84cb9e Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 14 Aug 2023 11:02:47 +0200 Subject: [PATCH 30/44] cleaned up and extended LoginTest --- .../java/posters/flows/OpenLoginPageFlow.java | 20 ---- .../pageobjects/pages/AbstractPageObject.java | 28 ----- .../pages/checkout/AbstractCheckoutPage.java | 2 - .../pageobjects/pages/checkout/CartPage.java | 4 +- .../checkout/GuestBillingAddressPage.java | 3 +- .../pages/checkout/GuestPaymentPage.java | 3 +- .../checkout/GuestShippingAddressPage.java | 3 +- .../pages/checkout/OrderConfirmationPage.java | 2 +- .../pages/checkout/PlaceOrderPage.java | 2 +- .../ReturningCustomerBillingAddressPage.java | 3 +- .../ReturningCustomerPaymentPage.java | 3 +- .../ReturningCustomerShippingAddressPage.java | 3 +- .../pages/user/AccountOverviewPage.java | 2 +- .../pages/user/DeleteAccountPage.java | 2 +- .../pageobjects/pages/user/LoginPage.java | 25 ++-- .../pages/user/MyAddressesPage.java | 2 +- .../pages/user/PersonalDataPage.java | 2 +- .../pageobjects/pages/user/RegisterPage.java | 3 +- .../pageobjects/utility/PriceHelper.java | 1 + .../tests/smoke/RegisteredOrderTest.java | 2 +- .../java/posters/tests/unit/LoginTest.java | 87 ++++++-------- .../tests/smoke/RegisteredOrderTest.json | 112 +++++++++--------- .../posters/tests/unit/LoginTest.json | 9 +- 23 files changed, 126 insertions(+), 197 deletions(-) delete mode 100644 src/test/java/posters/flows/OpenLoginPageFlow.java diff --git a/src/test/java/posters/flows/OpenLoginPageFlow.java b/src/test/java/posters/flows/OpenLoginPageFlow.java deleted file mode 100644 index bea41038..00000000 --- a/src/test/java/posters/flows/OpenLoginPageFlow.java +++ /dev/null @@ -1,20 +0,0 @@ -package posters.flows; - -import io.qameta.allure.Step; -import posters.pageobjects.pages.user.LoginPage; - -public class OpenLoginPageFlow -{ - @Step("open login page flow") - public static LoginPage flow() - { - // initialize the session and go to home page - var homePage = OpenHomePageFlow.flow(); - - // open login page and check for expected page - var loginPage = homePage.userMenu.openLoginPage(); - loginPage.isExpectedPage(); - - return loginPage.isExpectedPage(); - } -} diff --git a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java index b06da998..801b4e9e 100644 --- a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java +++ b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java @@ -4,10 +4,7 @@ import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; -import org.apache.commons.lang3.StringUtils; - import com.xceptance.neodymium.util.Neodymium; -import com.xceptance.neodymium.visual.ai.AI; import io.qameta.allure.Step; import posters.pageobjects.components.Title; @@ -23,31 +20,6 @@ public AbstractPageObject isExpectedPage() abstract public void validateStructure(); - public void validateVisual(String testCaseName) - { - String className = this.getClass().getSimpleName(); - - if (StringUtils.isAllEmpty(testCaseName)) - { - new AI().execute(Neodymium.getDriver(), className, "validate" + className); - } - else - { - new AI().execute(Neodymium.getDriver(), testCaseName, "validate" + className); - } - } - - public void validateStructureAndVisual() - { - validateStructureAndVisual(null); - } - - public void validateStructureAndVisual(String testCaseName) - { - validateStructure(); - validateVisual(testCaseName); - } - public void scrollToTop() { $("body").scrollTo(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java index 55ec2393..6c9f2dd2 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java @@ -8,8 +8,6 @@ import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 09f497ca..6a34d7eb 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -2,9 +2,6 @@ import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exactValue; -import static com.codeborne.selenide.Condition.matchText; -import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Condition.value; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; @@ -71,6 +68,7 @@ public void validateStructure() else { // validate process wrap + // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress indicator //validateProcessWrap(); // validate product table head diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java index 33d624fe..52b4a711 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java @@ -25,7 +25,7 @@ public GuestBillingAddressPage isExpectedPage() return this; } - /// ----- validate guest billing address page ----- /// + /// ----- validate content guest billing address page ----- /// @Override @Step("validate shipping address page structure") @@ -37,6 +37,7 @@ public void validateStructure() validateBreadcrumb(); // validate process wrap + // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress indicator // validateProcessWrap(); // validate title diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java index e9a19522..d7f28f21 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java @@ -40,7 +40,7 @@ public GuestPaymentPage isExpectedPage() return this; } - /// ----- validate guest payment page ----- /// + /// ----- validate content guest payment page ----- /// @Step("validate fill-in form headlines") public void validateFillInHeadlines(String headline) @@ -128,6 +128,7 @@ public void validateStructure() validateBreadcrumb(); // validate process wrap + // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress indicator //validateProcessWrap(); // validate title diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java index 84c6d6b3..07e9a1fc 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java @@ -27,7 +27,7 @@ public GuestShippingAddressPage isExpectedPage() return this; } - /// ----- validate guest shipping address page ----- /// + /// ----- validate content guest shipping address page ----- /// @Step("validate shipping address usage for billing address radio") public void validateAddressRadio() @@ -47,6 +47,7 @@ public void validateStructure() validateBreadcrumb(); // validate process wrap + // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress indicator // validateProcessWrap(); // validate title diff --git a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java index 05b36ad3..de3addb6 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java @@ -24,7 +24,7 @@ public OrderConfirmationPage isExpectedPage() return this; } - /// ----- validate order confirmation page ----- /// + /// ----- validate content order confirmation page ----- /// public void validateStructure() { diff --git a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java index a8e5d56c..a2b25721 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java @@ -52,7 +52,7 @@ public PlaceOrderPage isExpectedPage() return this; } - /// ----- validate structure ----- /// + /// ----- validate content place order page ----- /// @Step("validate product table head") public void validateTableHead() diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java index 402585d7..b08b0fdc 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java @@ -27,7 +27,7 @@ public ReturningCustomerBillingAddressPage isExpectedPage() return this; } - /// ----- validate returning customer billing address page ----- /// + /// ----- validate content returning customer billing address page ----- /// @Override @Step("validate returning customer billing address page structure") @@ -39,6 +39,7 @@ public void validateStructure() validateBreadcrumb(); // validate process wrap + // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress indicator //validateProcessWrap(); // validate title diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java index 753daec3..bb3c28bf 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java @@ -29,7 +29,7 @@ public ReturningCustomerPaymentPage isExpectedPage() return this; } - /// ----- validate returning customer payment page ----- /// + /// ----- validate content returning customer payment page ----- /// @Override @Step("validate returning customer payment page structure") @@ -41,6 +41,7 @@ public void validateStructure() validateBreadcrumb(); // validate process wrap + // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress indicator //validateProcessWrap(); // validate title diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java index 76f3b375..240094b5 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java @@ -28,7 +28,7 @@ public ReturningCustomerShippingAddressPage isExpectedPage() return this; } - /// ----- validate returning customer shipping address page ----- /// + /// ----- validate content returning customer shipping address page ----- /// @Override @Step("validate returning customer shipping address page structure") @@ -40,6 +40,7 @@ public void validateStructure() validateBreadcrumb(); // validate process wrap + // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress indicator //validateProcessWrap(); // validate title diff --git a/src/test/java/posters/pageobjects/pages/user/AccountOverviewPage.java b/src/test/java/posters/pageobjects/pages/user/AccountOverviewPage.java index bffd740b..51038fcb 100644 --- a/src/test/java/posters/pageobjects/pages/user/AccountOverviewPage.java +++ b/src/test/java/posters/pageobjects/pages/user/AccountOverviewPage.java @@ -32,7 +32,7 @@ public AccountOverviewPage isExpectedPage() return this; } - /// ----- validate account overview page ----- /// + /// ----- validate content account overview page ----- /// @Override @Step("validate account overview page structure") diff --git a/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java b/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java index eae0b7c5..b814a0a9 100644 --- a/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java +++ b/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java @@ -31,7 +31,7 @@ public DeleteAccountPage isExpectedPage() return this; } - /// ----- validate delete account page ----- /// + /// ----- validate content delete account page ----- /// @Override @Step("validate delete account page structure") diff --git a/src/test/java/posters/pageobjects/pages/user/LoginPage.java b/src/test/java/posters/pageobjects/pages/user/LoginPage.java index fdfc0e24..8f775957 100644 --- a/src/test/java/posters/pageobjects/pages/user/LoginPage.java +++ b/src/test/java/posters/pageobjects/pages/user/LoginPage.java @@ -2,7 +2,6 @@ import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; -import static com.codeborne.selenide.Condition.exactValue; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; @@ -39,7 +38,7 @@ public LoginPage isExpectedPage() return this; } - /// ----- validate login page ----- /// + /// ----- validate content login page ----- /// @Override @Step("validate login page structure") @@ -69,6 +68,8 @@ public void validateStructure() registerLink.shouldHave(exactText(Neodymium.localizedText("LoginPage.createNewAccount"))); } + /// ----- validate success and error messages ----- /// + @Step("validate successful registration message") public void validateSuccessfulRegistration() { @@ -82,6 +83,13 @@ public void validateWrongEmail(String email) Assert.assertEquals(emailField.val(), email); } + @Step("validate invalid password for login error message") + public void validateWrongPassword(String email) + { + errorMessage.validateErrorMessage(Neodymium.localizedText("LoginPage.validation.incorrectPassword")); + Assert.assertEquals(emailField.val(), email); + } + /// ----- login page navigation ----- /// @Step("open register page from login page") @@ -115,17 +123,4 @@ public LoginPage sendFalseLoginForm(User user) sendFormWithData(user.getEmail(), user.getPassword()); return new LoginPage().isExpectedPage(); } - - // ----------------------------------------------------------- - - - /** - * @param eMail - */ - @Step("validate invalid password for login error message") - public void validateWrongPassword(String eMail) - { - errorMessage.validateErrorMessage(Neodymium.localizedText("AccountPages.validation.incorrectPasswordError")); - emailField.shouldHave(exactValue(eMail)); - } } diff --git a/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java b/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java index 0f86ce2e..5ca42c91 100644 --- a/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java +++ b/src/test/java/posters/pageobjects/pages/user/MyAddressesPage.java @@ -24,7 +24,7 @@ public MyAddressesPage isExpectedPage() return this; } - /// ----- validate my addresses page ----- /// + /// ----- validate content my addresses page ----- /// @Override @Step("validate personal data page structure") diff --git a/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java b/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java index 2b8862ba..2c4e0293 100644 --- a/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java +++ b/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java @@ -28,7 +28,7 @@ public PersonalDataPage isExpectedPage() return this; } - /// ----- validate personal data page ----- /// + /// ----- validate content personal data page ----- /// @Override @Step("validate personal data page structure") diff --git a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java index bec56a57..1c951bbd 100644 --- a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java +++ b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java @@ -3,7 +3,6 @@ import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; @@ -41,7 +40,7 @@ public RegisterPage isExpectedPage() return this; } - /// ----- validate register page ----- /// + /// ----- validate content register page ----- /// @Step("validate fill in form headlines") public void validateFillInHeadlines() diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index fea55940..1e33ff66 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -48,6 +48,7 @@ public static String substract(String minuend, String subtrahend) return format(res); } + // TODO - after fixing issue: put together with calculateSubtotalMiniCart() @Step("calculate sum of all total product prices") public static double calculateSubtotalPlaceOrderPage(double oldSubtotal, String totalProductPrice) { diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 7aa5513c..1ad68937 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -19,7 +19,7 @@ public class RegisteredOrderTest extends AbstractTest { @DataSet(1) - //@DataSet(2) + @DataSet(2) @Test public void testOrderingAsRegisteredUser() { diff --git a/src/test/java/posters/tests/unit/LoginTest.java b/src/test/java/posters/tests/unit/LoginTest.java index 84285fd6..fb5e833a 100644 --- a/src/test/java/posters/tests/unit/LoginTest.java +++ b/src/test/java/posters/tests/unit/LoginTest.java @@ -1,97 +1,84 @@ package posters.tests.unit; -import org.junit.Before; import org.junit.Test; -import com.xceptance.neodymium.module.statement.browser.multibrowser.Browser; import com.xceptance.neodymium.module.statement.testdata.DataSet; -import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; -import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; +import io.qameta.allure.Step; import io.qameta.allure.junit4.Tag; -import posters.tests.testdata.dataobjects.User; -import posters.flows.OpenLoginPageFlow; +import posters.flows.OpenHomePageFlow; +import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.user.LoginPage; import posters.tests.AbstractTest; -//@Browser("Chrome_1024x768") -@Browser("Firefox_1024x768") @Owner("Tim Brown") @Severity(SeverityLevel.NORMAL) @Tag("functionality") @Tag("registered") public class LoginTest extends AbstractTest { - private User user; + HomePage homePage; - private LoginPage loginPage; + LoginPage loginPage; - @Before - public void setup() + @Step("go to login page and validate") + public void goToLoginPage() { - user = DataUtils.get(User.class); + // go to homepage + homePage = OpenHomePageFlow.flow(); + homePage.userMenu.validateNotLoggedIn(); - loginPage = prepareTest(); + // go to login page and validate + loginPage = homePage.userMenu.openLoginPage(); + loginPage.validateStructure(); } @Test @DataSet(1) public void testSuccessfulLogin() { - var homePage = loginPage.sendLoginForm(user); - homePage.validateSuccessfulLogin(user.getFirstName()); + // go to login page and validate + goToLoginPage(); + + // send login form + homePage = loginPage.sendLoginForm(userData); + homePage.validateSuccessfulLogin(userData.getFirstName()); } @Test @DataSet(2) - @DataSet(3) - public void testLoginWithPasswordFailure() + public void testLoginWithWrongPasswort() { - //loginPage.sendFalseLoginform(user); - loginPage.validateWrongPassword(user.getEmail()); + // go to login page and validate + goToLoginPage(); + + loginPage.sendFalseLoginForm(userData); + loginPage.validateWrongPassword(userData.getEmail()); } @Test - @DataSet(4) + @DataSet(3) public void testLoginWithEmailFailure() { - //loginPage.sendFalseLoginform(user); - loginPage.validateWrongEmail(user.getEmail()); + // go to login page and validate + goToLoginPage(); + + loginPage.sendFalseLoginForm(userData); + loginPage.validateWrongEmail(userData.getEmail()); } @Test + @DataSet(4) @DataSet(5) - @DataSet(6) public void testLoginWithoutRequiredFields() { - //loginPage.sendFalseLoginform(user); - loginPage.errorMessage.validateNoErrorMessageOnPage(); - } - - @Test - @SuppressDataSets - public void testLoginWithUnregisteredUser() - { - final var user = new User("Jens", "Doe", "jens@doe.com", "topsecret"); - //loginPage.sendFalseLoginform(user); - loginPage.validateWrongEmail(user.getEmail()); - } - - private LoginPage prepareTest() - { - // Page types to use - var loginPage = new LoginPage(); - - // Go to login page - loginPage = OpenLoginPageFlow.flow(); - loginPage.validateStructure(); + // go to login page and validate + goToLoginPage(); - // Assure not logged in status - loginPage.userMenu.validateNotLoggedIn(); - - return loginPage; + loginPage.sendFalseLoginForm(userData); + loginPage.errorMessage.validateNoErrorMessageOnPage(); } -} +} \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json index 3a00802f..b2977910 100644 --- a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json +++ b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json @@ -1,85 +1,85 @@ [ - { - "user": - { - "firstName": "Jonas", + { + "user": + { + "firstName": "John", "lastName": "Doe", - "email": "jonas@doe.com", + "email": "john@doe.com", "password": "topsecret" - }, - "topCategory": "header.topNavigation.2.title", - "resultPosition": "6", - "sizeProduct": "32 x 24 in", - "styleProduct": "gloss", - "shipAddrPos": 1, - "billAddrPos": 1, - "creditCardPos": 1, - "shipAddrEqualBillAddr": true, - "shippingAddress": - { - "firstName": "Jonas", + }, + "topCategory": "header.topNavigation.2.title", + "resultPosition": "6", + "sizeProduct": "32 x 24 in", + "styleProduct": "gloss", + "shipAddrPos": 1, + "billAddrPos": 1, + "creditCardPos": 1, + "shipAddrEqualBillAddr": true, + "shippingAddress": + { + "firstName": "John", "lastName": "Doe", - "company": "Jonas Doe Inc.", - "street": "5-7 Jonas Doe street", + "company": "John Doe Inc.", + "street": "5-7 John Doe street", "city": "New York City", "state": "New York", "zip": "12345", "country": "United States" - }, - "creditCard": - { - "fullName": "Jonas Doe", + }, + "creditCard": + { + "fullName": "John Doe", "cardNumber": "4111111111111111", "crypticCardNumber": "xxxx xxxx xxxx 1111", "expDateMonth": "06", "expDateYear": "2028" - } - }, - { - "user": - { - "firstName": "Jonas", + } + }, + { + "user": + { + "firstName": "John", "lastName": "Doe", - "email": "jonas@doe.com", + "email": "john@doe.com", "password": "topsecret" - }, - "topCategory": "header.topNavigation.4.title", - "resultPosition": "2", - "sizeProduct": "16 x 12 in", - "styleProduct": "matte", - "shipAddrPos": 1, - "billAddrPos": 2, - "creditCardPos": 1, - "shipAddrEqualBillAddr": false, - "shippingAddress": - { - "firstName": "Jonas", + }, + "topCategory": "header.topNavigation.4.title", + "resultPosition": "2", + "sizeProduct": "16 x 12 in", + "styleProduct": "matte", + "shipAddrPos": 1, + "billAddrPos": 2, + "creditCardPos": 1, + "shipAddrEqualBillAddr": false, + "shippingAddress": + { + "firstName": "John", "lastName": "Doe", - "company": "Jonas Doe Inc.", - "street": "5-7 Jonas Doe street", + "company": "John Doe Inc.", + "street": "5-7 John Doe street", "city": "New York City", "state": "New York", "zip": "12345", "country": "United States" - }, - "billingAddress": - { - "firstName": "Jonas", + }, + "billingAddress": + { + "firstName": "John", "lastName": "Doe", - "company": "Jonas Doe GmbH", - "street": "Jonas Doe Straße 10", + "company": "John Doe GmbH", + "street": "John Doe Straße 10", "city": "Hannover", "state": "Niedersachsen", "zip": "30159", "country": "Germany" - }, - "creditCard": - { - "fullName": "Jonas Doe", + }, + "creditCard": + { + "fullName": "John Doe", "cardNumber": "4111111111111111", "crypticCardNumber": "xxxx xxxx xxxx 1111", "expDateMonth": "06", "expDateYear": "2028" - } - } + } + } ] diff --git a/src/test/resources/posters/tests/unit/LoginTest.json b/src/test/resources/posters/tests/unit/LoginTest.json index af0a974d..bf50e1cc 100644 --- a/src/test/resources/posters/tests/unit/LoginTest.json +++ b/src/test/resources/posters/tests/unit/LoginTest.json @@ -13,19 +13,12 @@ "password": "notsecret", "testId": "wrong password" }, - { - "firstName": "John", - "lastName": "Doe", - "email": "john@doe.com", - "password": "topsecret123", - "testId": "extended password" - }, { "firstName": "John", "lastName": "Doe", "email": "john@doe.company", "password": "topsecret", - "testId": "extended email" + "testId": "wrong email" }, { "firstName": "John", From b9e2011ebf3c57d17db0db16986037db86bd05de Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 14 Aug 2023 15:34:03 +0200 Subject: [PATCH 31/44] added JavaDoc tags for more complex functions --- config/localization.yaml | 10 +++ .../pageobjects/components/ErrorMessage.java | 2 +- .../pageobjects/components/Footer.java | 2 +- .../pageobjects/components/Header.java | 12 ++-- .../pageobjects/components/MiniCart.java | 27 ++++++-- .../pageobjects/components/Pagination.java | 49 ++++++++----- .../posters/pageobjects/components/Title.java | 9 --- .../pages/browsing/CategoryPage.java | 19 ++++-- .../pageobjects/pages/browsing/HomePage.java | 16 ++--- .../pages/browsing/ProductDetailPage.java | 60 ++++++++-------- .../pages/checkout/AbstractCheckoutPage.java | 1 + .../pageobjects/pages/checkout/CartPage.java | 68 +++++++++++-------- .../pages/checkout/PlaceOrderPage.java | 6 ++ .../pages/user/OrderHistoryPage.java | 30 +++++++- .../pages/user/PaymentSettingsPage.java | 20 +++--- .../pageobjects/utility/PriceHelper.java | 58 +++++++++++----- .../java/posters/tests/unit/LoginTest.java | 4 +- 17 files changed, 248 insertions(+), 145 deletions(-) diff --git a/config/localization.yaml b/config/localization.yaml index d0ae0c2d..c5a71f53 100644 --- a/config/localization.yaml +++ b/config/localization.yaml @@ -249,11 +249,21 @@ default: myAddresses: My Addresses paymentSettings: Payment Settings personalData: Personal Data + OrderHistoryPage: + title: Order History + tableHead: + purchasedPosters: PURCHASED POSTERS + orderDetails: ORDER DETAILS + quantity: QUANTITY MyAddressesPage: title: My Addresses headlines: shipAddr: Shipping Address billAddr: Billing Address + PaymentSettingsPage: + title: Payment Settings + button: + addNewCreditCard: Add a new credit card PersonalDataPage: title: Personal Data headlines: diff --git a/src/test/java/posters/pageobjects/components/ErrorMessage.java b/src/test/java/posters/pageobjects/components/ErrorMessage.java index 1883d826..aff72399 100644 --- a/src/test/java/posters/pageobjects/components/ErrorMessage.java +++ b/src/test/java/posters/pageobjects/components/ErrorMessage.java @@ -22,7 +22,7 @@ public void isComponentAvailable() /// ----- validate error message ----- /// - @Step("validate that the error message {message} is visible") + @Step("validate visibility of error message {message}") public void validateErrorMessage(String message) { errorMessage.find("strong").shouldHave(exactText(message)).shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/components/Footer.java b/src/test/java/posters/pageobjects/components/Footer.java index 0c8ec1e2..6638e9f6 100644 --- a/src/test/java/posters/pageobjects/components/Footer.java +++ b/src/test/java/posters/pageobjects/components/Footer.java @@ -21,7 +21,7 @@ public void isComponentAvailable() /// ----- validate footer ----- /// - @Step("validate the footer") + @Step("validate structure footer") public void validateStructure() { // validate about xceptance diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index 27238534..35e31f95 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -7,19 +7,19 @@ import io.qameta.allure.Step; public class Header extends AbstractComponent -{ +{ @Override @Step("validate availability header") public void isComponentAvailable() { $("#globalNavigation").should(exist); } - + /// ----- validate header ----- /// - - @Step("validate structure header") - public void validateStructure() - { + + @Step("validate header") + public void validateStructure() + { $("#brand").shouldBe(visible); Search.validateStructure(); diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 036eeff2..d16b6a39 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -83,6 +83,11 @@ public static int getTotalCount() return Integer.parseInt(totalCountElement.text()); } + /** + * Note: Loops through all total product prices in the mini cart and adds it to the "subtotal" variable. + * + * @return subtotal (The sum of all total product prices) + */ @Step("calculate sum of all total product prices") public static String calculateSubtotal() { @@ -96,6 +101,12 @@ public static String calculateSubtotal() return PriceHelper.format(subtotal); } + /** + * Note: If there is at least 1 item in the cart, it loops through all total product counts in the mini cart + * and adds it to the "totalCount" variable. + * + * @return totalCount (The sum of all total product counts) + */ @Step("calculate total count via product counts") public static int calculateTotalCount() { @@ -159,11 +170,9 @@ public static void validateStructure() // validate label subtotal $(".labelText").shouldHave(exactText(Neodymium.localizedText("header.miniCart.subtotal"))).shouldBe(visible); - // validate view cart button - $("#miniCartMenu .linkButton").shouldHave(exactText(Neodymium.localizedText("header.miniCart.viewCart"))).shouldBe(visible); - // validate subtotal - if (getTotalCount() == 0) { + if (getTotalCount() == 0) + { // if there are no items in cart validateSubtotal("$0.00"); } @@ -173,12 +182,15 @@ public static void validateStructure() validateSubtotal(calculateSubtotal()); } + // validate view cart button + $("#miniCartMenu .linkButton").shouldHave(exactText(Neodymium.localizedText("header.miniCart.viewCart"))).shouldBe(visible); + closeMiniCart(); } /// ----- validate mini cart item ----- /// - @Step("validate data cart item in mini cart") + @Step("validate product in the mini cart") private void validateMiniCartItem(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) { openMiniCart(); @@ -196,10 +208,11 @@ private void validateMiniCartItem(int position, String productName, String produ closeMiniCart(); } - @Step("validate '{product}' in the mini cart") + @Step("validate product in the mini cart") public void validateMiniCartItem(int position, Product product) { - validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), PriceHelper.format(product.getTotalPrice())); + validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), + PriceHelper.format(product.getTotalPrice())); } @Step("validate '{product}' in the mini cart") diff --git a/src/test/java/posters/pageobjects/components/Pagination.java b/src/test/java/posters/pageobjects/components/Pagination.java index 5399d7fc..702199da 100644 --- a/src/test/java/posters/pageobjects/components/Pagination.java +++ b/src/test/java/posters/pageobjects/components/Pagination.java @@ -14,50 +14,57 @@ public class Pagination extends AbstractComponent { private SelenideElement pagination = $("#pagination-bottom"); - + private ElementsCollection paginationComponents = $$("#pagination-bottom li"); public void isComponentAvailable() { pagination.shouldBe(visible); } - + /// ----- pagination navigation ----- /// - + @Step("click on specific page number") public void goToPage(int pageNumber) { paginationComponents.findBy(exactText(Integer.toString(pageNumber))).click(); } - + @Step("click on go to next page") public void goToNextPage() { paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToNextPage"))).click(); } - + @Step("click on go to last page") public void goToLastPage() { paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToLastPage"))).click(); } - + @Step("click on go to previous page") public void goToPrevPage() { paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToPrevPage"))).click(); } - + @Step("click on go to first page") public void goToFirstPage() { paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToFirstPage"))).click(); } - + /// ----- validate pagination ----- /// - + + /** + * Note: To get {numberOfPages} it divides {expectedResultCount} by 6 because only 6 results can be displayed + * per page. Then it loops through the page numbers and validates its existence and visibility. + * + * @param expectedResultCount + * (number of results for specific category/search) + */ @Step("validate visibility numbers in navigation") - public void validateElementNumbers(int expectedResultCount) + public void validateElementNumbers(int expectedResultCount) { int numberOfPages = expectedResultCount / 6; for (int i = 1; i < numberOfPages; i++) @@ -65,21 +72,28 @@ public void validateElementNumbers(int expectedResultCount) paginationComponents.findBy(exactText(Integer.toString(i))).shouldBe(visible); } } - + @Step("validate visibility right navigation") public void validateRightNavigation() { paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToNextPage"))).shouldBe(visible); paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToLastPage"))).shouldBe(visible); } - + @Step("validate visibility left navigation") public void validateLeftNavigation() { paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToPrevPage"))).shouldBe(visible); paginationComponents.findBy(exactText(Neodymium.localizedText("CategoryPage.pagination.goToFirstPage"))).shouldBe(visible); } - + + /** + * Note: If there is more than 1 result page it validates the pagination. It loops through the page numbers + * and validates the existence and visibility of the numbers themselves and the icon navigation (<, <<, >, >>) + * + * @param expectedResultCount + * (number of results for specific category/search) + */ @Step("validate pagination") public void validateStructure(int expectedResultCount) { @@ -87,10 +101,10 @@ public void validateStructure(int expectedResultCount) if (numberOfPages > 1) { pagination.shouldBe(visible); - + validateElementNumbers(expectedResultCount); validateRightNavigation(); - + for (int j = 2; j < numberOfPages; j++) { goToPage(j); @@ -98,11 +112,12 @@ public void validateStructure(int expectedResultCount) validateElementNumbers(expectedResultCount); validateRightNavigation(); } - + goToLastPage(); validateLeftNavigation(); validateElementNumbers(expectedResultCount); } - else return; + else + return; } } diff --git a/src/test/java/posters/pageobjects/components/Title.java b/src/test/java/posters/pageobjects/components/Title.java index 1d71415f..5032f191 100644 --- a/src/test/java/posters/pageobjects/components/Title.java +++ b/src/test/java/posters/pageobjects/components/Title.java @@ -3,8 +3,6 @@ import static com.codeborne.selenide.Selenide.title; import org.junit.Assert; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.xceptance.neodymium.util.SelenideAddons; @@ -23,12 +21,5 @@ public void validateTitle(String title) SelenideAddons.wrapAssertionError(() -> { Assert.assertEquals(title, title()); }); - - Logger logger = LoggerFactory.getLogger(getClass()); - logger.trace("This is a logging example with severity: 'trace'. Can be found in posters.pageobjects.components.Title class."); - logger.debug("This is a logging example with severity: 'debug'. Can be found in posters.pageobjects.components.Title class."); - logger.info("This is a logging example with severity: 'info'. Can be found in posters.pageobjects.components.Title class."); - logger.warn("This is a logging example with severity: 'warn'. Can be found in posters.pageobjects.components.Title class."); - logger.error("This is a logging example with severity: 'error'. Can be found in posters.pageobjects.components.Title class."); } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index 1c3a1d88..1500bcee 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -15,9 +15,9 @@ public class CategoryPage extends AbstractBrowsingPage { public Pagination pagination = new Pagination(); - + private SelenideElement productOverview = $("#productOverview"); - + private SelenideElement titleCategoryName = $("#titleCategoryName"); @Override @@ -44,17 +44,26 @@ public void validateStructure() $("#product0").shouldBe(visible); } + /** + * Note: If {categoryName} contains a ".", it's a localization string, localized by Neodymium. Else a search + * term was used. Both cases have a different headline to validate. + * + * @param categoryName + * (name of specific category of top navigation) + * @param expectedResultCount + * (number of results for specific category/search) + */ @Step("validate category name {categoryName} is on category page") public void validateCategoryHeadline(String categoryName, int expectedResultCount) { - if (categoryName.contains(".")) + if (categoryName.contains(".")) { // if {categoryName} contains Neodymium localization titleCategoryName.should(matchText(Neodymium.localizedText(categoryName))).shouldBe(visible); titleCategoryName.should(matchText(Integer.toString(expectedResultCount))).shouldBe(visible); } - else - { + else + { // if {categoryName} is search input $("#titleSearchText").should(matchText(Neodymium.localizedText("CategoryPage.search.resultText"))).shouldBe(visible); $("#searchTextValue").shouldHave(exactText(categoryName)).shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index 48d2ed72..1b20e540 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -34,6 +34,14 @@ public HomePage isExpectedPage() /// ----- validate content homepage ----- /// + @Step("validate poster slide") + public void validatePosterSlide(String position, String headline) + { + slideNavigation.findBy(exactText(position)).click(); + slideHeadline.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + slideButton.findBy(exactText(Neodymium.localizedText("HomePage.slider.button"))).shouldBe(visible); + } + @Step("validate poster slide") public void validatePosterSlide() { @@ -43,14 +51,6 @@ public void validatePosterSlide() validatePosterSlide("1", "HomePage.slider.headline.1"); } - @Step("validate slider headline") - public void validatePosterSlide(String position, String headline) - { - slideNavigation.findBy(exactText(position)).click(); - slideHeadline.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); - slideButton.findBy(exactText(Neodymium.localizedText("HomePage.slider.button"))).shouldBe(visible); - } - @Step("validate featured categories") public void validateFeaturedCategories() { diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index ced31862..aae2143d 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -33,38 +33,38 @@ public ProductDetailPage isExpectedPage() } /// ----- validate content product detail page ----- /// - - public void validateSizeDropdown(String size) + + public void validateSizeDropdown(String size) { productSize.should(matchText(Neodymium.localizedText(size))).should(exist); } - + @Step("validate size dropdown") - public void validateSizeDropdown() + public void validateSizeDropdown() { productSize.scrollTo().click(); - - if ($$("#selectSize option").size()>1) + + if ($$("#selectSize option").size() > 1) { validateSizeDropdown("ProductdetailPage.size.16x12"); validateSizeDropdown("ProductdetailPage.size.32x24"); validateSizeDropdown("ProductdetailPage.size.64x48"); } - else + else { validateSizeDropdown("ProductdetailPage.size.96x32"); } - + productSize.scrollTo().click(); } - + @Step("validate style radio") - public void validateStyleRadio() + public void validateStyleRadio() { $("#selectStyle .radio:nth-of-type(1)").shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.style.matte"))).shouldBe(visible); $("#selectStyle .radio:nth-of-type(2)").shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.style.gloss"))).shouldBe(visible); } - + @Override @Step("validate product detail page structure") public void validateStructure() @@ -73,46 +73,46 @@ public void validateStructure() // validate image $("#prodImg").shouldBe(visible); - + // validate title productName.should(matchText("[A-Z].{3,}")).shouldBe(visible); - + // validate product price productPrice.should(matchText("\\$\\d+\\.\\d{2}")).shouldBe(visible); - + // validate product description $("#prodDescriptionOverview").shouldBe(visible); $("#prodDescriptionDetail").shouldBe(visible); - + // validate size selection validateSizeDropdown(); - + // validate style selection $("#selectStyle").shouldBe(visible); validateStyleRadio(); - - // validate print information + + // validate print information $("#prodPrintInfoTitle").shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.print"))).shouldBe(visible); $("#prodPrintInfo").shouldBe(visible); - + // validate add to cart button addToCartButton.shouldHave(exactText(Neodymium.localizedText("ProductdetailPage.addToCartButton"))).shouldBe(visible); $("#btnAddToCart .icon-shopping-cart").shouldBe(visible); } - + @Step("validate product name on product detail page") public void validateProductName(String name) { productName.shouldHave(exactText(name)); } - + @Step("validate product name page of product '{productName}'") - public void validate(String productName) + public void validate(String productName) { validateStructure(); validateProductName(productName); } - + /// ----- select product size/style, add to cart ----- /// @Step("select size") @@ -126,13 +126,13 @@ public void setStyle(String style) { $(".radio #finish-" + style).selectRadio(style); } - + @Step("click add to cart button") public void clickAddToCartButton() { addToCartButton.scrollTo().click(); } - + @Step("add product with size:'{size}' and style:'{style}' to cart") public void addToCart(String size, String style) { @@ -140,21 +140,21 @@ public void addToCart(String size, String style) setStyle(style); clickAddToCartButton(); } - + /// ----- get product details ----- /// - + @Step("get product name from product detail page") public String getProductName() { return productName.text(); } - + @Step("get product price from product detail page") public String getProductPrice() { return productPrice.text(); } - + @Step("get selected product style from product detail page") public String getChosenStyle() { @@ -166,7 +166,7 @@ public String getChosenSize() { return productSize.getSelectedText(); } - + @Step("get product details from product detail page") public Product getProduct() { diff --git a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java index 6c9f2dd2..987eae1c 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java @@ -57,6 +57,7 @@ public void validateFillInHeadlines() $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.city"))); $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.state"))); $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.zip"))); + // TODO - fix after issue is fixed //$$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.country"))); } diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index 6a34d7eb..a34534f3 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -23,11 +23,11 @@ public class CartPage extends AbstractBrowsingPage { private SelenideElement title = $("#titleCart"); - + private SelenideElement cartTable = $("#cartOverviewTable"); private ElementsCollection tableHead = $$(".product-name span"); - + private SelenideElement subTotal = $("#orderSubTotalValue"); @Override @@ -40,9 +40,9 @@ public CartPage isExpectedPage() } /// ----- validate content cart page ----- /// - + @Step("validate product table head") - public void validateTableHead() + public void validateTableHead() { tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.product"))).shouldBe(visible); tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.unitPrice"))).shouldBe(visible); @@ -50,7 +50,7 @@ public void validateTableHead() tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.update"))).shouldBe(visible); tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.totalPrice"))).shouldBe(visible); } - + @Override @Step("validate cart page structure") public void validateStructure() @@ -59,18 +59,19 @@ public void validateStructure() // validate title title.shouldHave(exactText(Neodymium.localizedText("CartPage.title"))).shouldBe(visible); - + // check if cart contains items, validate - if (MiniCart.getTotalCount() == 0) + if (MiniCart.getTotalCount() == 0) { $("#errorCartMessage").shouldHave(exactText(Neodymium.localizedText("CartPage.errorMessage"))).shouldBe(visible); } else { // validate process wrap - // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress indicator - //validateProcessWrap(); - + // TODO - after fixing issue 171: consistent element selectors for all checkout pages with progress + // indicator + // validateProcessWrap(); + // validate product table head validateTableHead(); @@ -93,9 +94,9 @@ public void validateShippingCosts(String shippingCosts) { $("#orderShippingCosts").shouldHave(exactText(shippingCosts)); } - + @Step("validate tax on cart page") - public void validateTax(String shippingCosts, String subtotal) + public void validateTax(String shippingCosts, String subtotal) { String tax = PriceHelper.calculateTax(shippingCosts, subtotal); $("#orderSubTotalTaxValue").shouldHave(exactText(tax)); @@ -108,7 +109,14 @@ public void validate(String shippingCosts, String subtotal) validateShippingCosts(shippingCosts); validateTax(shippingCosts, subtotal); } - + + /** + * Note: It checks if the price change of subtotal is equal to the price change of the product. + * + * @param position (of specific product in cart) + * @param oldSubTotal (subtotal before adding new product to cart/ increasing product quantity) + * @param oldTotalProductPrice (product price before adding/ increasing product quantity) + */ @Step("validate sub total and line item total after adding on the cart page") public void validateTotalAfterAdd(int position, String oldSubTotal, double oldTotalProductPrice) { @@ -141,7 +149,7 @@ public void validateTotalAfterAdd(int position, String oldSubTotal, double oldTo // validate {price} equals {price2} Assert.assertEquals(productPrice, totalProductPriceChange); } - + @Step("validate sub total and line item total after removing on the cart page") public void validateTotalAfterRemove(String oldSubTotal, String oldTotalProductPrice) { @@ -159,14 +167,14 @@ private void validateCartItem(int position, String productName, String productSt // validate product image productContainer.find(".product-img").shouldBe(visible); - + // validate parameters productContainer.find(".productName").shouldHave(exactText(productName)); productContainer.find(".productStyle").shouldHave(exactText(productStyle)); productContainer.find(".productSize").shouldHave(exactText(productSize)); productContainer.find(".productUnitPrice").shouldHave(exactText(productPrice)); productContainer.find(".productCount").shouldHave(exactValue(Integer.toString(productAmount))); - + // validate remove and update button $("#btnRemoveProdCount" + (position - 1)).shouldBe(visible); $("#btnUpdateProdCount" + (position - 1)).shouldBe(visible); @@ -177,7 +185,7 @@ public void validateCartItem(int position, Product product) { validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), product.getUnitPrice()); } - + @Step("validate '{product}' on the cart page") public void validateCartItem(int position, Product product, int productAmount) { @@ -227,54 +235,54 @@ public Product getProduct(int position) { return new Product(getProductName(position), getProductUnitPrice(position), getProductStyle(position), getProductSize(position), Integer.parseInt(getProductCount(position))); } - + /// ----- update product data ----- /// - + @Step("update product count on the cart page") public void updateProductCount(int position, int amount) { SelenideElement productContainer = $("#product" + (position - 1)); - + // type new amount productContainer.find(".productCount").setValue(Integer.toString(amount)); - + // click update button productContainer.find(".btnUpdateProduct").scrollTo().click(); } - + @Step("remove product on the cart page") public void removeProduct(int position) - { + { // click delete button $("#btnRemoveProdCount" + (position - 1)).scrollTo().click(); - + // click delete confirmation button $("#buttonDelete").scrollTo().click(); } - + /// ----- cart page navigation ----- /// - + @Step("click on a product on the cart page") public ProductDetailPage openProductDetailPage(int position) { $("#product" + (position - 1) + " .product-img").scrollTo().click(); return new ProductDetailPage().isExpectedPage(); } - + @Step("open homepage from cart page") - public HomePage openHomePage() + public HomePage openHomePage() { $("#brand").scrollTo().click(); return new HomePage().isExpectedPage(); } - + @Step("open guest shipping address from the cart page") public GuestShippingAddressPage openGuestShippingAddressPage() { $("#btnStartCheckout").scrollTo().click(); return new GuestShippingAddressPage().isExpectedPage(); } - + @Step("open returning customer shipping address from the cart page") public ReturningCustomerShippingAddressPage openReturningCustomerShippingAddressPage() { diff --git a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java index a2b25721..3bd9c3fa 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java @@ -57,6 +57,7 @@ public PlaceOrderPage isExpectedPage() @Step("validate product table head") public void validateTableHead() { + // TODO - fix after fixing issue //tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.product"))).shouldBe(visible); tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.unitPrice"))).shouldBe(visible); tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.quantity"))).shouldBe(visible); @@ -215,6 +216,11 @@ public String getTax() return taxContainer.text(); } + /** + * Note: Loops through all total product prices on the place order page and adds it to the "subtotal" variable. + * + * @return subtotal (The sum of all total product prices) + */ @Step("calculate sum of all total product prices") public String calculateSubtotal() { diff --git a/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java b/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java index 607fcc42..03863dad 100644 --- a/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java +++ b/src/test/java/posters/pageobjects/pages/user/OrderHistoryPage.java @@ -1,23 +1,47 @@ package posters.pageobjects.pages.user; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; +import com.codeborne.selenide.ElementsCollection; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; public class OrderHistoryPage extends AbstractBrowsingPage { - private SelenideElement headline = $("#titleOrderHistory"); + private SelenideElement title = $("#titleOrderHistory"); + + private ElementsCollection tableHead = $$(".product-name span"); @Override @Step("ensure this is an order history page") public OrderHistoryPage isExpectedPage() { super.isExpectedPage(); - headline.should(exist); + title.should(exist); return this; } -} + + /// ----- validate content order history page ----- /// + + @Override + @Step("validate personal data page structure") + public void validateStructure() + { + super.validateStructure(); + + // validate title + title.shouldHave(exactText(Neodymium.localizedText("OrderHistoryPage.title"))).shouldBe(visible); + + // validate table Head + tableHead.findBy(exactText(Neodymium.localizedText("OrderHistoryPage.tableHead.purchasedPosters"))).shouldBe(visible); + tableHead.findBy(exactText(Neodymium.localizedText("OrderHistoryPage.tableHead.orderDetails"))).shouldBe(visible); + tableHead.findBy(exactText(Neodymium.localizedText("OrderHistoryPage.tableHead.quantity"))).shouldBe(visible); + } +} \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/pages/user/PaymentSettingsPage.java b/src/test/java/posters/pageobjects/pages/user/PaymentSettingsPage.java index c18eb6fd..ba1894a8 100644 --- a/src/test/java/posters/pageobjects/pages/user/PaymentSettingsPage.java +++ b/src/test/java/posters/pageobjects/pages/user/PaymentSettingsPage.java @@ -1,38 +1,40 @@ package posters.pageobjects.pages.user; import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; +import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; import com.codeborne.selenide.SelenideElement; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Step; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; public class PaymentSettingsPage extends AbstractBrowsingPage { -// private SelenideElement headline = $("#titlePersonalData"); -// -// private SelenideElement deleteButton = $("#btnDeleteAccount"); + private SelenideElement title = $("#titlePaymentOverview"); @Override @Step("ensure this is a personal data page") public PaymentSettingsPage isExpectedPage() { -// super.isExpectedPage(); -// headline.should(exist); + super.isExpectedPage(); + title.should(exist); return this; } - /// ----- validate my addresses page ----- /// + /// ----- validate content payment settings page ----- /// @Override @Step("validate personal data page structure") public void validateStructure() { super.validateStructure(); - - // TODO + + // validate title + title.shouldHave(exactText(Neodymium.localizedText("PaymentSettingsPage.title"))).shouldBe(visible); + + $("#linkAddNewPayment").shouldHave(exactText(Neodymium.localizedText("PaymentSettingsPage.button.addNewCreditCard"))).shouldBe(visible); } } \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index 1e33ff66..06eeef9c 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -13,72 +13,94 @@ public class PriceHelper private final static DecimalFormat decimalFormat = new DecimalFormat("##0.00", new DecimalFormatSymbols(Locale.US)); /// ----- format string ----- /// - + @Step("remove $ from {price}") public static String removeCurrency(String price) { return price.substring(1); } - + @Step("add $ to {price}") public static String addCurrency(String price) { return CURRENCY + price; } - + @Step("get formatted {price}") public static String format(double input) { return addCurrency(decimalFormat.format(input)); } - + /// ----- calculations for price summary ----- /// - + + /** + * @return unitPrice * quantity + */ @Step("calculate total product price") public static String totalProductPrice(String unitPrice, String quantity) { double res = (double) (Math.round((Double.valueOf(removeCurrency(unitPrice)) * Double.valueOf(quantity)) * 100)) / 100; return format(res); } - + + /** + * @return minuend - subtrahend + */ @Step("calculate difference") public static String substract(String minuend, String subtrahend) { double res = (double) (Math.round((Double.valueOf(removeCurrency(minuend)) - Double.valueOf(removeCurrency(subtrahend))) * 100)) / 100; return format(res); } - + + /** + * @return oldSubtotal + totalProductPrice + */ // TODO - after fixing issue: put together with calculateSubtotalMiniCart() - @Step("calculate sum of all total product prices") + @Step("adds total product price to sum") public static double calculateSubtotalPlaceOrderPage(double oldSubtotal, String totalProductPrice) { return (double) (Math.round((oldSubtotal + Double.valueOf(totalProductPrice)) * 100)) / 100; } - + + /** + * @return (shippingCosts + subtotal) * 0.06 + */ @Step("calculate tax") - public static String calculateTax(String shippingCosts, String subtotal) + public static String calculateTax(String shippingCosts, String subtotal) { double totalPrice = (double) (Math.round((Double.valueOf(removeCurrency(shippingCosts)) + Double.valueOf(removeCurrency(subtotal))) * 100)) / 100; double tax = (double) (Math.round((Double.valueOf(totalPrice) * 0.06) * 100)) / 100; return format(tax); } - + + /** + * @return subtotal + shippingCosts + tax + */ @Step("calculate grand total price") - public static String calculateGrandTotal(String subtotal, String shippingCosts, String tax) + public static String calculateGrandTotal(String subtotal, String shippingCosts, String tax) { - double grandTotal = (double) (Math.round((Double.valueOf(removeCurrency(subtotal)) + Double.valueOf(removeCurrency(shippingCosts)) + Double.valueOf(removeCurrency(tax))) * 100)) / 100; + double grandTotal = (double) (Math.round((Double.valueOf(removeCurrency(subtotal)) + Double.valueOf(removeCurrency(shippingCosts)) + + Double.valueOf(removeCurrency(tax))) * 100)) / 100; return format(grandTotal); } - + /// ----- calculations for mini cart ----- /// - - @Step("calculate sum of all total product quantities") + + /** + * @return totalCount + productCount + */ + @Step("add productCount to totalCount") public static int calculateTotalCountMiniCart(int totalCount, String productCount) { return (totalCount + Integer.parseInt(productCount)); } - - @Step("calculate sum of all total product prices") + + /** + * @return oldSubtotal + totalProductPrice + */ + @Step("adds total product price to sum") public static double calculateSubtotalMiniCart(double oldSubtotal, String totalProductPrice) { return (double) (Math.round((oldSubtotal + Double.valueOf(removeCurrency(totalProductPrice))) * 100)) / 100; diff --git a/src/test/java/posters/tests/unit/LoginTest.java b/src/test/java/posters/tests/unit/LoginTest.java index fb5e833a..e479e72e 100644 --- a/src/test/java/posters/tests/unit/LoginTest.java +++ b/src/test/java/posters/tests/unit/LoginTest.java @@ -10,6 +10,7 @@ import io.qameta.allure.Step; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; +import posters.pageobjects.components.UserMenu; import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.user.LoginPage; import posters.tests.AbstractTest; @@ -29,7 +30,7 @@ public void goToLoginPage() { // go to homepage homePage = OpenHomePageFlow.flow(); - homePage.userMenu.validateNotLoggedIn(); + UserMenu.validateStructure(); // go to login page and validate loginPage = homePage.userMenu.openLoginPage(); @@ -45,6 +46,7 @@ public void testSuccessfulLogin() // send login form homePage = loginPage.sendLoginForm(userData); + UserMenu.validateStructure(); homePage.validateSuccessfulLogin(userData.getFirstName()); } From a1d258cc3000e590f2b44959ef80e73ee401de1b Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 14 Aug 2023 16:00:59 +0200 Subject: [PATCH 32/44] last fixes --- .../tests/smoke/RegisteredOrderTest.json | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json index b2977910..7c8e905a 100644 --- a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json +++ b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json @@ -2,9 +2,9 @@ { "user": { - "firstName": "John", + "firstName": "Jonas", "lastName": "Doe", - "email": "john@doe.com", + "email": "jonas@doe.com", "password": "topsecret" }, "topCategory": "header.topNavigation.2.title", @@ -17,10 +17,10 @@ "shipAddrEqualBillAddr": true, "shippingAddress": { - "firstName": "John", + "firstName": "Jonas", "lastName": "Doe", - "company": "John Doe Inc.", - "street": "5-7 John Doe street", + "company": "Jonas Doe Inc.", + "street": "5-7 Jonas Doe street", "city": "New York City", "state": "New York", "zip": "12345", @@ -28,7 +28,7 @@ }, "creditCard": { - "fullName": "John Doe", + "fullName": "Jonas Doe", "cardNumber": "4111111111111111", "crypticCardNumber": "xxxx xxxx xxxx 1111", "expDateMonth": "06", @@ -38,9 +38,9 @@ { "user": { - "firstName": "John", + "firstName": "Jonas", "lastName": "Doe", - "email": "john@doe.com", + "email": "jonas@doe.com", "password": "topsecret" }, "topCategory": "header.topNavigation.4.title", @@ -53,10 +53,10 @@ "shipAddrEqualBillAddr": false, "shippingAddress": { - "firstName": "John", + "firstName": "Jonas", "lastName": "Doe", - "company": "John Doe Inc.", - "street": "5-7 John Doe street", + "company": "Jonas Doe Inc.", + "street": "5-7 Jonas Doe street", "city": "New York City", "state": "New York", "zip": "12345", @@ -64,10 +64,10 @@ }, "billingAddress": { - "firstName": "John", + "firstName": "Jonas", "lastName": "Doe", - "company": "John Doe GmbH", - "street": "John Doe Straße 10", + "company": "Jonas Doe GmbH", + "street": "Jonas Doe Straße 10", "city": "Hannover", "state": "Niedersachsen", "zip": "30159", @@ -75,7 +75,7 @@ }, "creditCard": { - "fullName": "John Doe", + "fullName": "Jonas Doe", "cardNumber": "4111111111111111", "crypticCardNumber": "xxxx xxxx xxxx 1111", "expDateMonth": "06", From 9d4d7d9bb148a3d2686a9f56660c5df5aa5dad6f Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 21 Aug 2023 08:23:43 +0200 Subject: [PATCH 33/44] changed static implementation --- .../java/posters/flows/CartCleanUpFlow.java | 5 +- .../java/posters/flows/DeleteUserFlow.java | 4 +- .../pageobjects/components/Header.java | 20 +++++-- .../pageobjects/components/MiniCart.java | 32 +++++------ .../pageobjects/components/SaleBanner.java | 4 +- .../pageobjects/components/Search.java | 4 +- .../posters/pageobjects/components/Title.java | 1 - .../pageobjects/components/TopNavigation.java | 8 +-- .../pageobjects/components/UserMenu.java | 12 ++-- .../pages/browsing/AbstractBrowsingPage.java | 20 ++----- .../pageobjects/pages/browsing/HomePage.java | 2 +- .../pageobjects/pages/checkout/CartPage.java | 3 +- .../posters/tests/smoke/AddToCartTest.java | 55 +++++++++---------- .../java/posters/tests/smoke/BrowseTest.java | 8 +-- .../posters/tests/smoke/GuestOrderTest.java | 4 +- .../java/posters/tests/smoke/HeaderTest.java | 4 +- .../posters/tests/smoke/PaginationTest.java | 2 +- .../posters/tests/smoke/RegisterTest.java | 2 +- .../tests/smoke/RegisteredOrderTest.java | 6 +- .../java/posters/tests/smoke/SearchTest.java | 4 +- .../java/posters/tests/unit/LoginTest.java | 7 +-- 21 files changed, 100 insertions(+), 107 deletions(-) diff --git a/src/test/java/posters/flows/CartCleanUpFlow.java b/src/test/java/posters/flows/CartCleanUpFlow.java index dd49cf27..5341bfb7 100644 --- a/src/test/java/posters/flows/CartCleanUpFlow.java +++ b/src/test/java/posters/flows/CartCleanUpFlow.java @@ -1,7 +1,6 @@ package posters.flows; import io.qameta.allure.Step; -import posters.pageobjects.components.MiniCart; import posters.pageobjects.pages.browsing.HomePage; public class CartCleanUpFlow @@ -12,10 +11,10 @@ public static void flow() HomePage homePage = new HomePage(); // go to cart page - var cartPage = homePage.miniCart.openCartPage(); + var cartPage = homePage.header.miniCart.openCartPage(); // remove the first product as long as one is available - while (MiniCart.getTotalCount() != 0) + while (cartPage.header.miniCart.getTotalCount() != 0) { cartPage.removeProduct(1); } diff --git a/src/test/java/posters/flows/DeleteUserFlow.java b/src/test/java/posters/flows/DeleteUserFlow.java index 9c58e6c0..cb09498e 100644 --- a/src/test/java/posters/flows/DeleteUserFlow.java +++ b/src/test/java/posters/flows/DeleteUserFlow.java @@ -13,7 +13,7 @@ public static LoginPage flow(User user) HomePage homePage = new HomePage(); // go to account page and validate - var accountOverviewPage = homePage.userMenu.openAccountOverviewPage(); + var accountOverviewPage = homePage.header.userMenu.openAccountOverviewPage(); accountOverviewPage.validateStructure(); // go to personal data page and validate @@ -30,7 +30,7 @@ public static LoginPage flow(User user) homePage.validateSuccessfulDeletedAccount(); // verify that the account is not available anymore - var loginPage = homePage.userMenu.openLoginPage(); + var loginPage = homePage.header.userMenu.openLoginPage(); loginPage.sendFalseLoginForm(user); loginPage.validateWrongEmail(user.getEmail()); diff --git a/src/test/java/posters/pageobjects/components/Header.java b/src/test/java/posters/pageobjects/components/Header.java index 35e31f95..862cb0f5 100644 --- a/src/test/java/posters/pageobjects/components/Header.java +++ b/src/test/java/posters/pageobjects/components/Header.java @@ -8,6 +8,16 @@ public class Header extends AbstractComponent { + public Search search = new Search(); + + public TopNavigation topNav = new TopNavigation(); + + public UserMenu userMenu = new UserMenu(); + + public MiniCart miniCart = new MiniCart(); + + public SaleBanner saleBanner = new SaleBanner(); + @Override @Step("validate availability header") public void isComponentAvailable() @@ -22,10 +32,10 @@ public void validateStructure() { $("#brand").shouldBe(visible); - Search.validateStructure(); - TopNavigation.validateStructure(); - UserMenu.validateStructure(); - MiniCart.validateStructure(); - SaleBanner.validateStructure(); + search.validateStructure(); + topNav.validateStructure(); + userMenu.validateStructure(); + miniCart.validateStructure(); + saleBanner.validateStructure(); } } diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index d16b6a39..627d22e2 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -18,21 +18,21 @@ public class MiniCart extends AbstractComponent { - private static SelenideElement headerCart = $("#headerCartOverview"); + private SelenideElement headerCart = $("#headerCartOverview"); - private static SelenideElement subOrderPrice = $("#miniCartMenu .subOrderPrice"); + private SelenideElement subOrderPrice = $("#miniCartMenu .subOrderPrice"); - private static SelenideElement miniCart = $("#miniCartMenu"); + private SelenideElement miniCart = $("#miniCartMenu"); - private static SelenideElement miniCartTitle = $(".cartMiniProductCounter"); + private SelenideElement miniCartTitle = $(".cartMiniProductCounter"); - private static SelenideElement totalCountElement = $("#headerCartOverview .headerCartProductCount"); + private SelenideElement totalCountElement = $("#headerCartOverview .headerCartProductCount"); private SelenideElement goToCartButton = $(".goToCart"); - private static ElementsCollection productCounts = $$(".prodCount"); + private ElementsCollection productCounts = $$(".prodCount"); - private static ElementsCollection productPrices = $$(".prodPrice strong"); + private ElementsCollection productPrices = $$(".prodPrice strong"); @Override @Step("ensure availability mini cart") @@ -44,14 +44,14 @@ public void isComponentAvailable() /// ----- mini cart navigation ------ /// @Step("open the mini cart") - public static void openMiniCart() + public void openMiniCart() { headerCart.hover(); miniCart.waitUntil(visible, 9000); } @Step("close the mini cart") - public static void closeMiniCart() + public void closeMiniCart() { $("#brand").hover(); miniCart.waitUntil(not(visible), 9000); @@ -78,7 +78,7 @@ public String getSubtotal() } @Step("get the total product count from mini cart") - public static int getTotalCount() + public int getTotalCount() { return Integer.parseInt(totalCountElement.text()); } @@ -89,7 +89,7 @@ public static int getTotalCount() * @return subtotal (The sum of all total product prices) */ @Step("calculate sum of all total product prices") - public static String calculateSubtotal() + public String calculateSubtotal() { double subtotal = 0; @@ -108,7 +108,7 @@ public static String calculateSubtotal() * @return totalCount (The sum of all total product counts) */ @Step("calculate total count via product counts") - public static int calculateTotalCount() + public int calculateTotalCount() { int totalCount = 0; @@ -128,13 +128,13 @@ public static int calculateTotalCount() /// ----- validate mini cart structure ----- /// @Step("validate the mini cart total product count") - public static void validateTotalCount(int totalCount) + public void validateTotalCount(int totalCount) { totalCountElement.shouldHave(exactText(Integer.toString(totalCount))); } @Step("validate the mini cart title") - public static void validateTitle() + public void validateTitle() { if (getTotalCount() == 1) { @@ -147,13 +147,13 @@ public static void validateTitle() } @Step("validate the mini cart subtotal price") - public static void validateSubtotal(String subtotal) + public void validateSubtotal(String subtotal) { subOrderPrice.shouldHave(exactText(subtotal)).shouldBe(visible); } @Step("validate mini cart menu") - public static void validateStructure() + public void validateStructure() { openMiniCart(); diff --git a/src/test/java/posters/pageobjects/components/SaleBanner.java b/src/test/java/posters/pageobjects/components/SaleBanner.java index 66815cef..c6c2620f 100644 --- a/src/test/java/posters/pageobjects/components/SaleBanner.java +++ b/src/test/java/posters/pageobjects/components/SaleBanner.java @@ -20,13 +20,13 @@ public void isComponentAvailable() /// ----- validate sale banner ----- /// @Step("validate strings sale banner") - private static void validateSaleBanner(String text) + private void validateSaleBanner(String text) { $$(".owl-stage").findBy(exactText(Neodymium.localizedText(text))).waitUntil(visible, 9000); } @Step("validate sale banner") - public static void validateStructure() + public void validateStructure() { validateSaleBanner("header.sale.second"); validateSaleBanner("header.sale.first"); diff --git a/src/test/java/posters/pageobjects/components/Search.java b/src/test/java/posters/pageobjects/components/Search.java index 90b7f032..00334944 100644 --- a/src/test/java/posters/pageobjects/components/Search.java +++ b/src/test/java/posters/pageobjects/components/Search.java @@ -13,7 +13,7 @@ public class Search extends AbstractComponent { - private static SelenideElement searchField = $("#s"); + private SelenideElement searchField = $("#s"); @Override @Step("validate availability search bar") @@ -61,7 +61,7 @@ public CategoryPage categoryPageResult(String searchTerm) /// ----- validate search ----- /// @Step("validate structure search bar") - public static void validateStructure() + public void validateStructure() { searchField.shouldBe(visible); $("#btnSearch").shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/components/Title.java b/src/test/java/posters/pageobjects/components/Title.java index 5032f191..bd39e7ef 100644 --- a/src/test/java/posters/pageobjects/components/Title.java +++ b/src/test/java/posters/pageobjects/components/Title.java @@ -10,7 +10,6 @@ public class Title extends AbstractComponent { - public void isComponentAvailable() { } diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index b814597f..39e8bc5c 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -14,7 +14,7 @@ public class TopNavigation extends AbstractComponent { - SelenideElement categoryMenu = $("#categoryMenu"); + private SelenideElement categoryMenu = $("#categoryMenu"); @Override @Step("ensure availability top navigation") @@ -43,19 +43,19 @@ public CategoryPage clickSubCategory(String topCategory, String subCategory) // ----- validate top navigation ----- // @Step("validate name of components in navigation") - public static void validateNavComponent(String topCategory) + public void validateNavComponent(String topCategory) { $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).shouldBe(visible); } @Step("validate name of components in sub navigation") - public static void validateSubNavComponent(String subCategory) + public void validateSubNavComponent(String subCategory) { $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).shouldBe(visible); } @Step("validate structure top navigation") - public static void validateStructure() + public void validateStructure() { // validate navigation bar validateNavComponent("header.topNavigation.1.title"); diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index f75680a0..55ec48b5 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -19,9 +19,9 @@ public class UserMenu extends AbstractComponent { - private final static SelenideElement userMenu = $("#userMenu"); + private SelenideElement userMenu = $("#userMenu"); - private static SelenideElement showUserMenu = $("#showUserMenu"); + private SelenideElement showUserMenu = $("#showUserMenu"); @Override @Step("ensure availability user menu") @@ -33,14 +33,14 @@ public void isComponentAvailable() /// ----- user menu navigation ----- /// @Step("open user menu") - public static void openUserMenu() + public void openUserMenu() { showUserMenu.hover(); userMenu.waitUntil(visible, 9000); } @Step("close user menu") - public static void closeUserMenu() + public void closeUserMenu() { $(".top-menu").hover(); userMenu.waitUntil(not(visible), 9000); @@ -87,7 +87,7 @@ public void validateNotLoggedIn() } @Step("validate that somebody is logged in") - public static boolean validateIsLoggedIn() + public boolean validateIsLoggedIn() { return userMenu.find(".firstName").exists(); } @@ -101,7 +101,7 @@ public void validateLoggedInName(String firstName) } @Step("validate logged in user menu") - public static void validateStructure() + public void validateStructure() { openUserMenu(); diff --git a/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java b/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java index 1a4ddfe0..71db6dcd 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/AbstractBrowsingPage.java @@ -3,11 +3,7 @@ import posters.pageobjects.components.ErrorMessage; import posters.pageobjects.components.Footer; import posters.pageobjects.components.Header; -import posters.pageobjects.components.MiniCart; -import posters.pageobjects.components.Search; import posters.pageobjects.components.SuccessMessage; -import posters.pageobjects.components.TopNavigation; -import posters.pageobjects.components.UserMenu; import posters.pageobjects.pages.AbstractPageObject; public abstract class AbstractBrowsingPage extends AbstractPageObject @@ -16,14 +12,6 @@ public abstract class AbstractBrowsingPage extends AbstractPageObject public Footer footer = new Footer(); - public MiniCart miniCart = new MiniCart(); - - public Search search = new Search(); - - public TopNavigation topNav = new TopNavigation(); - - public UserMenu userMenu = new UserMenu(); - public SuccessMessage successMessage = new SuccessMessage(); public ErrorMessage errorMessage = new ErrorMessage(); @@ -35,10 +23,10 @@ public void validateStructure() header.isComponentAvailable(); footer.isComponentAvailable(); - miniCart.isComponentAvailable(); - search.isComponentAvailable(); - topNav.isComponentAvailable(); - userMenu.isComponentAvailable(); + header.miniCart.isComponentAvailable(); + header.search.isComponentAvailable(); + header.topNav.isComponentAvailable(); + header.userMenu.isComponentAvailable(); successMessage.isComponentAvailable(); errorMessage.isComponentAvailable(); } diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index 1b20e540..23d29d47 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -111,7 +111,7 @@ public void validateSuccessfulLogin(String firstName) successMessage.validateSuccessMessage(Neodymium.localizedText("HomePage.validation.successfulLogin")); // validate {firstName} in user menu - userMenu.validateLoggedInName(firstName); + header.userMenu.validateLoggedInName(firstName); } @Step("validate successful account deletion on home page") diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index a34534f3..d30d0cff 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -14,7 +14,6 @@ import io.qameta.allure.Step; import posters.tests.testdata.dataobjects.Product; -import posters.pageobjects.components.MiniCart; import posters.pageobjects.pages.browsing.AbstractBrowsingPage; import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.browsing.ProductDetailPage; @@ -61,7 +60,7 @@ public void validateStructure() title.shouldHave(exactText(Neodymium.localizedText("CartPage.title"))).shouldBe(visible); // check if cart contains items, validate - if (MiniCart.getTotalCount() == 0) + if (header.miniCart.getTotalCount() == 0) { $("#errorCartMessage").shouldHave(exactText(Neodymium.localizedText("CartPage.errorMessage"))).shouldBe(visible); } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 0552bb0d..e04fb718 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -10,7 +10,6 @@ import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; -import posters.pageobjects.components.MiniCart; import posters.tests.AbstractTest; @Owner("Joe Fix") @@ -31,11 +30,11 @@ public void testAddProductsToCart() var homePage = OpenHomePageFlow.flow(); // store old subtotal - final String oldSubtotal = homePage.miniCart.getSubtotal(); + final String oldSubtotal = homePage.header.miniCart.getSubtotal(); // go to sub category page - var categoryPage = homePage.topNav.clickCategory(addToCartTestData.getTopCategory()); - var subCategoryPage = categoryPage.topNav.clickSubCategory(addToCartTestData.getTopCategory(), addToCartTestData.getSubCategory()); + var categoryPage = homePage.header.topNav.clickCategory(addToCartTestData.getTopCategory()); + var subCategoryPage = categoryPage.header.topNav.clickSubCategory(addToCartTestData.getTopCategory(), addToCartTestData.getSubCategory()); // go to product detail page, add and store displayed product var productDetailPage = subCategoryPage.clickProductByPosition(addToCartTestData.getSubCategoryResultPosition()); @@ -43,22 +42,22 @@ public void testAddProductsToCart() final var product = productDetailPage.getProduct(); // go to cart page - var cartPage = productDetailPage.miniCart.openCartPage(); + var cartPage = productDetailPage.header.miniCart.openCartPage(); // validate cart page cartPage.validateCartItem(1, product); - cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); + cartPage.validate(shippingCosts, cartPage.header.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(1, oldSubtotal, 0.00); - MiniCart.validateStructure(); - cartPage.miniCart.validateMiniCartItem(1, product); + cartPage.header.miniCart.validateStructure(); + cartPage.header.miniCart.validateMiniCartItem(1, product); /// ----- PART 2: USE SEARCH BAR TO ADD PRODUCT TO CART ----- /// // store old subtotal - final String oldSubtotal2 = cartPage.miniCart.getSubtotal(); + final String oldSubtotal2 = cartPage.header.miniCart.getSubtotal(); // go to category page via search - categoryPage = cartPage.search.categoryPageResult(addToCartTestData.getSearchTerm()); + categoryPage = cartPage.header.search.categoryPageResult(addToCartTestData.getSearchTerm()); // go to product detail page, add and store displayed product productDetailPage = categoryPage.clickProductByPosition(addToCartTestData.getSearchResultPosition()); @@ -66,21 +65,21 @@ public void testAddProductsToCart() final var product2 = productDetailPage.getProduct(); // go to cart page - cartPage = productDetailPage.miniCart.openCartPage(); + cartPage = productDetailPage.header.miniCart.openCartPage(); // validate cart page cartPage.validateCartItem(1, product2); cartPage.validateCartItem(2, product); - cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); + cartPage.validate(shippingCosts, cartPage.header.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(1, oldSubtotal2, 0.00); - MiniCart.validateStructure(); - cartPage.miniCart.validateMiniCartItem(1, product2); - cartPage.miniCart.validateMiniCartItem(2, product); + cartPage.header.miniCart.validateStructure(); + cartPage.header.miniCart.validateMiniCartItem(1, product2); + cartPage.header.miniCart.validateMiniCartItem(2, product); /// ----- PART 3: CHANGE QUANTITY OF PRODUCT IN CART ----- /// // store old subtotal - final String oldSubtotal3 = cartPage.miniCart.getSubtotal(); + final String oldSubtotal3 = cartPage.header.miniCart.getSubtotal(); // store product before update final var productBeforeUpdate = cartPage.getProduct(addToCartTestData.getProductUpdatePosition()); @@ -93,15 +92,15 @@ public void testAddProductsToCart() // validate cart page cartPage.validateCartItem(addToCartTestData.getProductUpdatePosition(), productBeforeUpdate, addToCartTestData.getAmountChange()); - cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); + cartPage.validate(shippingCosts, cartPage.header.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(addToCartTestData.getProductUpdatePosition(), oldSubtotal3, productBeforeUpdate.getTotalPrice()); - MiniCart.validateStructure(); - cartPage.miniCart.validateMiniCartItem(1, productBeforeUpdate, addToCartTestData.getAmountChange(), subtotalAfterUpdate); + cartPage.header.miniCart.validateStructure(); + cartPage.header.miniCart.validateMiniCartItem(1, productBeforeUpdate, addToCartTestData.getAmountChange(), subtotalAfterUpdate); /// ----- PART 4: REMOVE PRODUCT FROM CART ----- /// // store old subtotal - final String oldSubtotal4 = cartPage.miniCart.getSubtotal(); + final String oldSubtotal4 = cartPage.header.miniCart.getSubtotal(); // store subtotal product before remove final String subtotalBeforeRemove = cartPage.getProductTotalPrice(1); @@ -111,15 +110,15 @@ public void testAddProductsToCart() // validate cart page cartPage.validateCartItem(1, product); - cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); + cartPage.validate(shippingCosts, cartPage.header.miniCart.getSubtotal()); cartPage.validateTotalAfterRemove(oldSubtotal4, subtotalBeforeRemove); - MiniCart.validateStructure(); - cartPage.miniCart.validateMiniCartItem(1, product); + cartPage.header.miniCart.validateStructure(); + cartPage.header.miniCart.validateMiniCartItem(1, product); /// ----- PART 5: ADD SAME PRODUCT TO CART AGAIN ----- /// // store old subtotal - final String oldSubtotal5 = cartPage.miniCart.getSubtotal(); + final String oldSubtotal5 = cartPage.header.miniCart.getSubtotal(); // store product on cart page final var productFromCartPageBefore = cartPage.getProduct(1); @@ -129,7 +128,7 @@ public void testAddProductsToCart() productDetailPage.addToCart(productFromCartPageBefore.getSize(), productFromCartPageBefore.getStyle()); // go to cart - cartPage = productDetailPage.miniCart.openCartPage(); + cartPage = productDetailPage.header.miniCart.openCartPage(); // store subtotal of updated product subtotalAfterUpdate = cartPage.getProductTotalPrice(1); @@ -137,9 +136,9 @@ public void testAddProductsToCart() // validate cart page cartPage.validateCartItem(1, productFromCartPageBefore, productFromCartPageAfter.getAmount()); - cartPage.validate(shippingCosts, cartPage.miniCart.getSubtotal()); + cartPage.validate(shippingCosts, cartPage.header.miniCart.getSubtotal()); cartPage.validateTotalAfterAdd(1, oldSubtotal5, productFromCartPageBefore.getTotalPrice()); - MiniCart.validateStructure(); - cartPage.miniCart.validateMiniCartItem(1, productFromCartPageBefore, MiniCart.getTotalCount(), subtotalAfterUpdate); + cartPage.header.miniCart.validateStructure(); + cartPage.header.miniCart.validateMiniCartItem(1, productFromCartPageBefore, cartPage.header.miniCart.getTotalCount(), subtotalAfterUpdate); } } diff --git a/src/test/java/posters/tests/smoke/BrowseTest.java b/src/test/java/posters/tests/smoke/BrowseTest.java index 0c0e1d4c..fab04798 100644 --- a/src/test/java/posters/tests/smoke/BrowseTest.java +++ b/src/test/java/posters/tests/smoke/BrowseTest.java @@ -25,7 +25,7 @@ public void testBrowsing() homePage.validateStructure(); // go to category page and validate - var categoryPage = homePage.topNav.clickCategory(browseTestData.getTopCategory1()); + var categoryPage = homePage.header.topNav.clickCategory(browseTestData.getTopCategory1()); categoryPage.validate(browseTestData.getTopCategory1(), browseTestData.getExpectedResultCount1()); // go to product page and validate @@ -34,7 +34,7 @@ public void testBrowsing() productDetailPage.validate(productName); // go to category page and validate - categoryPage = productDetailPage.topNav.clickCategory(browseTestData.getTopCategory2()); + categoryPage = productDetailPage.header.topNav.clickCategory(browseTestData.getTopCategory2()); categoryPage.validate(browseTestData.getTopCategory2(), browseTestData.getExpectedResultCount2()); // go to product page and validate @@ -43,7 +43,7 @@ public void testBrowsing() productDetailPage.validate(productName2); // go to category page and validate - categoryPage = productDetailPage.topNav.clickCategory(browseTestData.getTopCategory3()); + categoryPage = productDetailPage.header.topNav.clickCategory(browseTestData.getTopCategory3()); categoryPage.validate(browseTestData.getTopCategory3(), browseTestData.getExpectedResultCount3()); // go to product page and validate @@ -52,7 +52,7 @@ public void testBrowsing() productDetailPage.validate(productName3); // go to category page and validate - categoryPage = productDetailPage.topNav.clickCategory(browseTestData.getTopCategory4()); + categoryPage = productDetailPage.header.topNav.clickCategory(browseTestData.getTopCategory4()); categoryPage.validate(browseTestData.getTopCategory4(), browseTestData.getExpectedResultCount4()); // go to product page and validate diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index dc8c669c..39e28fa1 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -31,7 +31,7 @@ public void testOrderingAsGuest() var homePage = OpenHomePageFlow.flow(); // go to category page - var categoryPage = homePage.topNav.clickCategory(guestOrderTestData.getTopCategory()); + var categoryPage = homePage.header.topNav.clickCategory(guestOrderTestData.getTopCategory()); // go to product detail page, add and store displayed product var productDetailPage = categoryPage.clickProductByPosition(guestOrderTestData.getResultPosition()); @@ -39,7 +39,7 @@ public void testOrderingAsGuest() final var product = productDetailPage.getProduct(); // go to cart page - var cartPage = productDetailPage.miniCart.openCartPage(); + var cartPage = productDetailPage.header.miniCart.openCartPage(); // go to shipping address page and validate var shippingAddressPage = cartPage.openGuestShippingAddressPage(); diff --git a/src/test/java/posters/tests/smoke/HeaderTest.java b/src/test/java/posters/tests/smoke/HeaderTest.java index 7d1f0dfb..1da67e39 100644 --- a/src/test/java/posters/tests/smoke/HeaderTest.java +++ b/src/test/java/posters/tests/smoke/HeaderTest.java @@ -27,7 +27,7 @@ public void testHeader() homePage.header.validateStructure(); // go to category page - var categoryPage = homePage.topNav.clickCategory(headerTestData.getTopCategory()); + var categoryPage = homePage.header.topNav.clickCategory(headerTestData.getTopCategory()); categoryPage.header.validateStructure(); //go to product detail page, add product to cart @@ -35,7 +35,7 @@ public void testHeader() productDetailPage.header.validateStructure(); // go to cart page - var cartPage = productDetailPage.miniCart.openCartPage(); + var cartPage = productDetailPage.header.miniCart.openCartPage(); cartPage.header.validateStructure(); } } \ No newline at end of file diff --git a/src/test/java/posters/tests/smoke/PaginationTest.java b/src/test/java/posters/tests/smoke/PaginationTest.java index 46bfbad2..a3d338be 100644 --- a/src/test/java/posters/tests/smoke/PaginationTest.java +++ b/src/test/java/posters/tests/smoke/PaginationTest.java @@ -26,7 +26,7 @@ public void testPagination() var homePage = OpenHomePageFlow.flow(); // go to category page - var categoryPage = homePage.topNav.clickCategory(paginationTestData.getTopCategory()); + var categoryPage = homePage.header.topNav.clickCategory(paginationTestData.getTopCategory()); categoryPage.pagination.validateStructure(paginationTestData.getExpectedResultCount()); } } \ No newline at end of file diff --git a/src/test/java/posters/tests/smoke/RegisterTest.java b/src/test/java/posters/tests/smoke/RegisterTest.java index 0793f889..8884fa17 100644 --- a/src/test/java/posters/tests/smoke/RegisterTest.java +++ b/src/test/java/posters/tests/smoke/RegisterTest.java @@ -29,7 +29,7 @@ public void testRegistering() var homePage = OpenHomePageFlow.flow(); // go to register page and validate - var registerPage = homePage.userMenu.openRegisterPage(); + var registerPage = homePage.header.userMenu.openRegisterPage(); registerPage.validateStructure(); // go to login page and validate diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 1ad68937..6d1dd3ea 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -29,14 +29,14 @@ public void testOrderingAsRegisteredUser() var homePage = OpenHomePageFlow.flow(); // go to login page - var loginPage = homePage.userMenu.openLoginPage(); + var loginPage = homePage.header.userMenu.openLoginPage(); // send login form homePage = loginPage.sendLoginForm(registeredOrderTestData.getUser()); homePage.validateSuccessfulLogin(registeredOrderTestData.getUser().getFirstName()); // go to category page - var categoryPage = homePage.topNav.clickCategory(registeredOrderTestData.getTopCategory()); + var categoryPage = homePage.header.topNav.clickCategory(registeredOrderTestData.getTopCategory()); // go to product detail page, add and store displayed product var productDetailPage = categoryPage.clickProductByPosition(registeredOrderTestData.getResultPosition()); @@ -44,7 +44,7 @@ public void testOrderingAsRegisteredUser() final var product = productDetailPage.getProduct(); // go to cart page - var cartPage = productDetailPage.miniCart.openCartPage(); + var cartPage = productDetailPage.header.miniCart.openCartPage(); // go to shipping address page var shippingAddressPage = cartPage.openReturningCustomerShippingAddressPage(); diff --git a/src/test/java/posters/tests/smoke/SearchTest.java b/src/test/java/posters/tests/smoke/SearchTest.java index b9ecf1cd..b1f763b6 100644 --- a/src/test/java/posters/tests/smoke/SearchTest.java +++ b/src/test/java/posters/tests/smoke/SearchTest.java @@ -26,7 +26,7 @@ public void testSearching() var homePage = OpenHomePageFlow.flow(); // go to category page - var categoryPage = homePage.search.categoryPageResult(searchTestData.getSearchTerm()); + var categoryPage = homePage.header.search.categoryPageResult(searchTestData.getSearchTerm()); categoryPage.validate(searchTestData.getSearchTerm(), searchTestData.getExpectedResultCount()); //go to product detail page @@ -43,7 +43,7 @@ public void testSearchingWithoutResult() var homePage = OpenHomePageFlow.flow(); // go to no hits page - var noHitsPage = homePage.search.noHitsPageResult(searchTestData.getSearchTerm()); + var noHitsPage = homePage.header.search.noHitsPageResult(searchTestData.getSearchTerm()); noHitsPage.validateStructure(); } } diff --git a/src/test/java/posters/tests/unit/LoginTest.java b/src/test/java/posters/tests/unit/LoginTest.java index e479e72e..3cb16ad5 100644 --- a/src/test/java/posters/tests/unit/LoginTest.java +++ b/src/test/java/posters/tests/unit/LoginTest.java @@ -10,7 +10,6 @@ import io.qameta.allure.Step; import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; -import posters.pageobjects.components.UserMenu; import posters.pageobjects.pages.browsing.HomePage; import posters.pageobjects.pages.user.LoginPage; import posters.tests.AbstractTest; @@ -30,10 +29,10 @@ public void goToLoginPage() { // go to homepage homePage = OpenHomePageFlow.flow(); - UserMenu.validateStructure(); + homePage.header.userMenu.validateStructure(); // go to login page and validate - loginPage = homePage.userMenu.openLoginPage(); + loginPage = homePage.header.userMenu.openLoginPage(); loginPage.validateStructure(); } @@ -46,7 +45,7 @@ public void testSuccessfulLogin() // send login form homePage = loginPage.sendLoginForm(userData); - UserMenu.validateStructure(); + homePage.header.userMenu.validateStructure(); homePage.validateSuccessfulLogin(userData.getFirstName()); } From 0f51495a5205b18f35da9489ea9ce1e79635f44d Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 21 Aug 2023 10:42:42 +0200 Subject: [PATCH 34/44] changed global testdata usage --- config/neodymium.properties | 2 +- .../java/posters/flows/OpenLoginPageFlow.java | 20 ++++++ src/test/java/posters/tests/AbstractTest.java | 63 ------------------ .../{smoke => component}/HeaderTest.java | 9 ++- .../{smoke => component}/PaginationTest.java | 7 +- .../posters/tests/smoke/AddToCartTest.java | 4 ++ .../java/posters/tests/smoke/BrowseTest.java | 5 ++ .../posters/tests/smoke/GuestOrderTest.java | 6 +- .../posters/tests/smoke/RegisterTest.java | 23 +++++-- .../tests/smoke/RegisteredOrderTest.java | 17 +++-- .../java/posters/tests/smoke/SearchTest.java | 11 ++++ .../java/posters/tests/unit/LoginTest.java | 65 +++++++++---------- .../{smoke => component}/HeaderTest.json | 0 .../{smoke => component}/PaginationTest.json | 0 .../posters/tests/smoke/RegisterTest.json | 16 ++--- .../tests/smoke/RegisteredOrderTest.json | 4 +- .../posters/tests/unit/LoginTest.json | 6 +- 17 files changed, 134 insertions(+), 124 deletions(-) create mode 100644 src/test/java/posters/flows/OpenLoginPageFlow.java rename src/test/java/posters/tests/{smoke => component}/HeaderTest.java (81%) rename src/test/java/posters/tests/{smoke => component}/PaginationTest.java (76%) rename src/test/resources/posters/tests/{smoke => component}/HeaderTest.json (100%) rename src/test/resources/posters/tests/{smoke => component}/PaginationTest.json (100%) diff --git a/config/neodymium.properties b/config/neodymium.properties index 9891205d..8dab9215 100644 --- a/config/neodymium.properties +++ b/config/neodymium.properties @@ -1,7 +1,7 @@ neodymium.url = ${neodymium.url.protocol}://${neodymium.url.host}${neodymium.url.path} neodymium.url.protocol = http neodymium.url.host = localhost -neodymium.url.path = ${neodymium.url.port}/ +neodymium.url.path = ${neodymium.url.port}/posters neodymium.url.port = :8080 neodymium.locale = en_US diff --git a/src/test/java/posters/flows/OpenLoginPageFlow.java b/src/test/java/posters/flows/OpenLoginPageFlow.java new file mode 100644 index 00000000..b24350dc --- /dev/null +++ b/src/test/java/posters/flows/OpenLoginPageFlow.java @@ -0,0 +1,20 @@ +package posters.flows; + +import io.qameta.allure.Step; +import posters.pageobjects.pages.user.LoginPage; + +public class OpenLoginPageFlow +{ + @Step("open login page flow") + public static LoginPage flow() + { + // initialize the session and go to home page + var homePage = OpenHomePageFlow.flow(); + + // open login page and check for expected page + var loginPage = homePage.header.userMenu.openLoginPage(); + loginPage.isExpectedPage(); + + return loginPage.isExpectedPage(); + } +} \ No newline at end of file diff --git a/src/test/java/posters/tests/AbstractTest.java b/src/test/java/posters/tests/AbstractTest.java index 170cf99b..740a5731 100644 --- a/src/test/java/posters/tests/AbstractTest.java +++ b/src/test/java/posters/tests/AbstractTest.java @@ -1,78 +1,15 @@ package posters.tests; -import org.junit.Before; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.xceptance.neodymium.NeodymiumRunner; import com.xceptance.neodymium.module.statement.browser.multibrowser.Browser; -import com.xceptance.neodymium.util.DataUtils; - -import posters.tests.testdata.processes.AddToCartTestData; -import posters.tests.testdata.processes.BrowseTestData; -import posters.tests.testdata.processes.GuestOrderTestData; -import posters.tests.testdata.processes.RegisteredOrderTestData; -import posters.tests.testdata.dataobjects.Address; -import posters.tests.testdata.dataobjects.CreditCard; -import posters.tests.testdata.dataobjects.Product; -import posters.tests.testdata.dataobjects.User; -import posters.tests.testdata.pageobjects.components.HeaderTestData; -import posters.tests.testdata.pageobjects.components.PaginationTestData; -import posters.tests.testdata.pageobjects.components.SearchTestData; @RunWith(NeodymiumRunner.class) @Browser("Chrome_1024x768") public abstract class AbstractTest { - /// ----- dataobjects ----- /// - - protected Address addressData; - - protected CreditCard creditCardData; - - protected Product productData; - - protected User userData; - - /// ----- components ----- /// - - protected HeaderTestData headerTestData; - - protected PaginationTestData paginationTestData; - - protected SearchTestData searchTestData; - - /// ----- processes ----- /// - - protected AddToCartTestData addToCartTestData; - - protected BrowseTestData browseTestData; - - protected GuestOrderTestData guestOrderTestData; - - protected RegisteredOrderTestData registeredOrderTestData; - - @Before - public void setup() - { - // dataobjects - addressData = DataUtils.get(Address.class); - creditCardData = DataUtils.get(CreditCard.class); - productData = DataUtils.get(Product.class); - userData = DataUtils.get(User.class); - - // components - headerTestData = DataUtils.get(HeaderTestData.class); - paginationTestData = DataUtils.get(PaginationTestData.class); - searchTestData = DataUtils.get(SearchTestData.class); - - // processes - addToCartTestData = DataUtils.get(AddToCartTestData.class); - browseTestData = DataUtils.get(BrowseTestData.class); - guestOrderTestData = DataUtils.get(GuestOrderTestData.class); - registeredOrderTestData = DataUtils.get(RegisteredOrderTestData.class); - } - protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTest.class); } diff --git a/src/test/java/posters/tests/smoke/HeaderTest.java b/src/test/java/posters/tests/component/HeaderTest.java similarity index 81% rename from src/test/java/posters/tests/smoke/HeaderTest.java rename to src/test/java/posters/tests/component/HeaderTest.java index 1da67e39..f38a4742 100644 --- a/src/test/java/posters/tests/smoke/HeaderTest.java +++ b/src/test/java/posters/tests/component/HeaderTest.java @@ -1,9 +1,10 @@ -package posters.tests.smoke; +package posters.tests.component; import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; +import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; import io.qameta.allure.Severity; @@ -11,17 +12,21 @@ import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; +import posters.tests.testdata.pageobjects.components.HeaderTestData; @Owner("Tim Brown") @Severity(SeverityLevel.MINOR) @Tag("smoke") @SuppressDataSets public class HeaderTest extends AbstractTest -{ +{ @Test @DataSet(1) public void testHeader() { + // use test data + final HeaderTestData headerTestData = DataUtils.get(HeaderTestData.class); + // go to homepage var homePage = OpenHomePageFlow.flow(); homePage.header.validateStructure(); diff --git a/src/test/java/posters/tests/smoke/PaginationTest.java b/src/test/java/posters/tests/component/PaginationTest.java similarity index 76% rename from src/test/java/posters/tests/smoke/PaginationTest.java rename to src/test/java/posters/tests/component/PaginationTest.java index a3d338be..39530021 100644 --- a/src/test/java/posters/tests/smoke/PaginationTest.java +++ b/src/test/java/posters/tests/component/PaginationTest.java @@ -1,9 +1,10 @@ -package posters.tests.smoke; +package posters.tests.component; import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; +import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; import io.qameta.allure.Severity; @@ -11,6 +12,7 @@ import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; +import posters.tests.testdata.pageobjects.components.PaginationTestData; @Owner("Tim Brown") @Severity(SeverityLevel.MINOR) @@ -22,6 +24,9 @@ public class PaginationTest extends AbstractTest @DataSet(1) public void testPagination() { + // use test data + final PaginationTestData paginationTestData = DataUtils.get(PaginationTestData.class); + // go to homepage var homePage = OpenHomePageFlow.flow(); diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index e04fb718..9f0ceaa4 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; +import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; @@ -11,6 +12,7 @@ import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; +import posters.tests.testdata.processes.AddToCartTestData; @Owner("Joe Fix") @Severity(SeverityLevel.CRITICAL) @@ -22,7 +24,9 @@ public class AddToCartTest extends AbstractTest @DataSet(2) public void testAddProductsToCart() { + // use test data final String shippingCosts = Neodymium.dataValue("shippingCosts"); + final AddToCartTestData addToCartTestData = DataUtils.get(AddToCartTestData.class); /// ----- PART 1: USE TOP NAVIGATION TO ADD PRODUCT TO CART ----- /// diff --git a/src/test/java/posters/tests/smoke/BrowseTest.java b/src/test/java/posters/tests/smoke/BrowseTest.java index fab04798..b5958076 100644 --- a/src/test/java/posters/tests/smoke/BrowseTest.java +++ b/src/test/java/posters/tests/smoke/BrowseTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; +import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; import io.qameta.allure.Severity; @@ -10,6 +11,7 @@ import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; +import posters.tests.testdata.processes.BrowseTestData; @Owner("Tim Brown") @Severity(SeverityLevel.NORMAL) @@ -20,6 +22,9 @@ public class BrowseTest extends AbstractTest @DataSet(1) public void testBrowsing() { + // use test data + final BrowseTestData browseTestData = DataUtils.get(BrowseTestData.class); + // go to homepage var homePage = OpenHomePageFlow.flow(); homePage.validateStructure(); diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index 39e28fa1..269bd112 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; +import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; @@ -13,6 +14,7 @@ import posters.pageobjects.pages.checkout.GuestPaymentPage; import posters.pageobjects.pages.checkout.PlaceOrderPage; import posters.tests.AbstractTest; +import posters.tests.testdata.processes.GuestOrderTestData; @Owner("Joe Fix") @Severity(SeverityLevel.BLOCKER) @@ -25,8 +27,10 @@ public class GuestOrderTest extends AbstractTest @DataSet(2) public void testOrderingAsGuest() { + // use test data final String shippingCosts = Neodymium.dataValue("shippingCosts"); - + final GuestOrderTestData guestOrderTestData = DataUtils.get(GuestOrderTestData.class); + // go to homepage var homePage = OpenHomePageFlow.flow(); diff --git a/src/test/java/posters/tests/smoke/RegisterTest.java b/src/test/java/posters/tests/smoke/RegisterTest.java index 8884fa17..c2574261 100644 --- a/src/test/java/posters/tests/smoke/RegisterTest.java +++ b/src/test/java/posters/tests/smoke/RegisterTest.java @@ -1,10 +1,12 @@ package posters.tests.smoke; import org.junit.After; +import org.junit.Before; import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; +import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; import io.qameta.allure.Severity; @@ -13,6 +15,7 @@ import posters.flows.DeleteUserFlow; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; +import posters.tests.testdata.dataobjects.User; @Owner("Lisa Smith") @Severity(SeverityLevel.CRITICAL) @@ -21,10 +24,18 @@ @SuppressDataSets public class RegisterTest extends AbstractTest { + private User user; + + @Before + public void setup() + { + user = DataUtils.get(User.class); + } + @Test - @DataSet(1) + @DataSet(9) public void testRegistering() - { + { // go to homepage var homePage = OpenHomePageFlow.flow(); @@ -33,18 +44,18 @@ public void testRegistering() registerPage.validateStructure(); // go to login page and validate - var loginPage = registerPage.sendRegisterForm(userData); + var loginPage = registerPage.sendRegisterForm(user); loginPage.validateStructure(); loginPage.validateSuccessfulRegistration(); // send login form - homePage = loginPage.sendLoginForm(userData); - homePage.validateSuccessfulLogin(userData.getFirstName()); + homePage = loginPage.sendLoginForm(user); + homePage.validateSuccessfulLogin(user.getFirstName()); } @After public void after() { - DeleteUserFlow.flow(userData); + DeleteUserFlow.flow(user); } } diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 6d1dd3ea..89fb9833 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -1,29 +1,35 @@ package posters.tests.smoke; +import org.junit.After; import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; +import com.xceptance.neodymium.util.DataUtils; import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; +import posters.flows.CartCleanUpFlow; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; +import posters.tests.testdata.processes.RegisteredOrderTestData; @Owner("Lisa Smith") @Severity(SeverityLevel.BLOCKER) @Tag("smoke") @Tag("registered") public class RegisteredOrderTest extends AbstractTest -{ +{ @DataSet(1) @DataSet(2) @Test public void testOrderingAsRegisteredUser() { + // use test data final String shippingCosts = Neodymium.dataValue("shippingCosts"); + final RegisteredOrderTestData registeredOrderTestData = DataUtils.get(RegisteredOrderTestData.class); // go to homepage var homePage = OpenHomePageFlow.flow(); @@ -90,8 +96,11 @@ public void testOrderingAsRegisteredUser() // go to order confirmation page var orderConfirmationPage = placeOrderPage.placeOrder(); orderConfirmationPage.validateStructure(); - - // go to homepage - homePage = orderConfirmationPage.openHomePage(); + } + + @After + public void after() + { + CartCleanUpFlow.flow(); } } diff --git a/src/test/java/posters/tests/smoke/SearchTest.java b/src/test/java/posters/tests/smoke/SearchTest.java index b1f763b6..473e3b94 100644 --- a/src/test/java/posters/tests/smoke/SearchTest.java +++ b/src/test/java/posters/tests/smoke/SearchTest.java @@ -1,9 +1,11 @@ package posters.tests.smoke; +import org.junit.Before; import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; +import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; import io.qameta.allure.Severity; @@ -11,6 +13,7 @@ import io.qameta.allure.junit4.Tag; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; +import posters.tests.testdata.pageobjects.components.SearchTestData; @Owner("Tim Brown") @Severity(SeverityLevel.MINOR) @@ -18,6 +21,14 @@ @SuppressDataSets public class SearchTest extends AbstractTest { + private SearchTestData searchTestData; + + @Before + public void setup() + { + searchTestData = DataUtils.get(SearchTestData.class); + } + @Test @DataSet(1) public void testSearching() diff --git a/src/test/java/posters/tests/unit/LoginTest.java b/src/test/java/posters/tests/unit/LoginTest.java index 3cb16ad5..1dbdafc0 100644 --- a/src/test/java/posters/tests/unit/LoginTest.java +++ b/src/test/java/posters/tests/unit/LoginTest.java @@ -1,74 +1,76 @@ package posters.tests.unit; +import org.junit.Before; import org.junit.Test; +import com.xceptance.neodymium.module.statement.browser.multibrowser.Browser; import com.xceptance.neodymium.module.statement.testdata.DataSet; +import com.xceptance.neodymium.util.DataUtils; import io.qameta.allure.Owner; import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; -import io.qameta.allure.Step; import io.qameta.allure.junit4.Tag; -import posters.flows.OpenHomePageFlow; -import posters.pageobjects.pages.browsing.HomePage; +import posters.flows.OpenLoginPageFlow; import posters.pageobjects.pages.user.LoginPage; import posters.tests.AbstractTest; +import posters.tests.testdata.dataobjects.User; +@Browser("Chrome_1024x768") +//@Browser("Firefox_1024x768") @Owner("Tim Brown") @Severity(SeverityLevel.NORMAL) @Tag("functionality") @Tag("registered") public class LoginTest extends AbstractTest -{ - HomePage homePage; +{ + private User user; - LoginPage loginPage; + private LoginPage loginPage; - @Step("go to login page and validate") - public void goToLoginPage() + @Before + public void setup() { - // go to homepage - homePage = OpenHomePageFlow.flow(); - homePage.header.userMenu.validateStructure(); + user = DataUtils.get(User.class); - // go to login page and validate - loginPage = homePage.header.userMenu.openLoginPage(); + loginPage = prepareTest(); + } + + private LoginPage prepareTest() + { + // go to login page + loginPage = OpenLoginPageFlow.flow(); loginPage.validateStructure(); + + // validate that nobody is logged in + loginPage.header.userMenu.validateNotLoggedIn(); + + return new LoginPage().isExpectedPage(); } @Test @DataSet(1) public void testSuccessfulLogin() { - // go to login page and validate - goToLoginPage(); - - // send login form - homePage = loginPage.sendLoginForm(userData); + var homePage = loginPage.sendLoginForm(user); homePage.header.userMenu.validateStructure(); - homePage.validateSuccessfulLogin(userData.getFirstName()); + homePage.validateSuccessfulLogin(user.getFirstName()); } @Test @DataSet(2) public void testLoginWithWrongPasswort() { - // go to login page and validate - goToLoginPage(); - - loginPage.sendFalseLoginForm(userData); - loginPage.validateWrongPassword(userData.getEmail()); + loginPage.sendFalseLoginForm(user); + loginPage.validateWrongPassword(user.getEmail()); } @Test @DataSet(3) public void testLoginWithEmailFailure() { - // go to login page and validate - goToLoginPage(); - - loginPage.sendFalseLoginForm(userData); - loginPage.validateWrongEmail(userData.getEmail()); + loginPage.sendFalseLoginForm(user); + loginPage.validateWrongEmail(user.getEmail()); } @Test @@ -76,10 +78,7 @@ public void testLoginWithEmailFailure() @DataSet(5) public void testLoginWithoutRequiredFields() { - // go to login page and validate - goToLoginPage(); - - loginPage.sendFalseLoginForm(userData); + loginPage.sendFalseLoginForm(user); loginPage.errorMessage.validateNoErrorMessageOnPage(); } } \ No newline at end of file diff --git a/src/test/resources/posters/tests/smoke/HeaderTest.json b/src/test/resources/posters/tests/component/HeaderTest.json similarity index 100% rename from src/test/resources/posters/tests/smoke/HeaderTest.json rename to src/test/resources/posters/tests/component/HeaderTest.json diff --git a/src/test/resources/posters/tests/smoke/PaginationTest.json b/src/test/resources/posters/tests/component/PaginationTest.json similarity index 100% rename from src/test/resources/posters/tests/smoke/PaginationTest.json rename to src/test/resources/posters/tests/component/PaginationTest.json diff --git a/src/test/resources/posters/tests/smoke/RegisterTest.json b/src/test/resources/posters/tests/smoke/RegisterTest.json index bcc52ad0..1e78a684 100644 --- a/src/test/resources/posters/tests/smoke/RegisterTest.json +++ b/src/test/resources/posters/tests/smoke/RegisterTest.json @@ -2,56 +2,56 @@ { "firstName": "Jane", "lastName": "Doe", - "email": "jane@doe.com", + "email": "jane@varmail.net", "password": "topsecret", "testId": "Jane's test" }, { "firstName": "Simon", "lastName": "Doe", - "email": "simon@doe.com", + "email": "simon@varmail.net", "password": "topsecret", "testId": "Simons's test" }, { "firstName": "James", "lastName": "Doe", - "email": "james@doe.com", + "email": "james@varmail.net", "password": "topsecret", "testId": "James' test" }, { "firstName": "Josh", "lastName": "Doe", - "email": "josh@doe.com", + "email": "josh@varmail.net", "password": "topsecret", "testId": "Josh's test" }, { "firstName": "Jim", "lastName": "Doe", - "email": "jim@doe.com", + "email": "jim@varmail.net", "password": "topsecret", "testId": "Jim's test" }, { "firstName": "Jude", "lastName": "Doe", - "email": "jude@doe.com", + "email": "jude@varmail.net", "password": "topsecret", "testId": "Jude's test" }, { "firstName": "Joel", "lastName": "Doe", - "email": "joel@doe.com", + "email": "joel@varmail.net", "password": "topsecret", "testId": "Joel's test" }, { "firstName": "Jeremiah", "lastName": "Doe", - "email": "jeremiah@doe.com", + "email": "jeremiah@varmail.net", "password": "topsecret", "testId": "Jeremiah's test" } diff --git a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json index 7c8e905a..e77a8872 100644 --- a/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json +++ b/src/test/resources/posters/tests/smoke/RegisteredOrderTest.json @@ -4,7 +4,7 @@ { "firstName": "Jonas", "lastName": "Doe", - "email": "jonas@doe.com", + "email": "jonas@varmail.net", "password": "topsecret" }, "topCategory": "header.topNavigation.2.title", @@ -40,7 +40,7 @@ { "firstName": "Jonas", "lastName": "Doe", - "email": "jonas@doe.com", + "email": "jonas@varmail.net", "password": "topsecret" }, "topCategory": "header.topNavigation.4.title", diff --git a/src/test/resources/posters/tests/unit/LoginTest.json b/src/test/resources/posters/tests/unit/LoginTest.json index bf50e1cc..cfcc73a4 100644 --- a/src/test/resources/posters/tests/unit/LoginTest.json +++ b/src/test/resources/posters/tests/unit/LoginTest.json @@ -2,14 +2,14 @@ { "firstName": "John", "lastName": "Doe", - "email": "john@doe.com", + "email": "john@varmail.net", "password": "topsecret", "testId": "happy path" }, { "firstName": "John", "lastName": "Doe", - "email": "john@doe.com", + "email": "john@varmail.net", "password": "notsecret", "testId": "wrong password" }, @@ -30,7 +30,7 @@ { "firstName": "John", "lastName": "Doe", - "email": "john@doe.com", + "email": "john@varmail.net", "password": "", "testId": "missing password" } From e31bb545ca49d3d6960a2c282ee521efed4a6568 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 21 Aug 2023 16:23:47 +0200 Subject: [PATCH 35/44] minor changes --- .../java/posters/pageobjects/pages/browsing/HomePage.java | 7 +++++-- src/test/java/posters/tests/smoke/RegisterTest.java | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index 23d29d47..22162bb1 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -13,7 +13,7 @@ public class HomePage extends AbstractBrowsingPage { - private ElementsCollection slideNavigation = $$(".flex-control-nav li"); + private ElementsCollection slideNavigation = $$(".flex-control-nav a"); private ElementsCollection slideHeadline = $$("#titleSlide h1"); @@ -36,8 +36,11 @@ public HomePage isExpectedPage() @Step("validate poster slide") public void validatePosterSlide(String position, String headline) - { + { + slideNavigation.findBy(exactText(position)).click(); slideNavigation.findBy(exactText(position)).click(); + slideNavigation.findBy(exactText(position)).click(); + slideHeadline.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); slideButton.findBy(exactText(Neodymium.localizedText("HomePage.slider.button"))).shouldBe(visible); } diff --git a/src/test/java/posters/tests/smoke/RegisterTest.java b/src/test/java/posters/tests/smoke/RegisterTest.java index c2574261..d39987bd 100644 --- a/src/test/java/posters/tests/smoke/RegisterTest.java +++ b/src/test/java/posters/tests/smoke/RegisterTest.java @@ -33,7 +33,7 @@ public void setup() } @Test - @DataSet(9) + @DataSet(2) public void testRegistering() { // go to homepage From 16251ea592892db41ab82b95764359359ff53f39 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Mon, 21 Aug 2023 16:35:36 +0200 Subject: [PATCH 36/44] updated neo properties --- config/neodymium.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/neodymium.properties b/config/neodymium.properties index 8dab9215..9891205d 100644 --- a/config/neodymium.properties +++ b/config/neodymium.properties @@ -1,7 +1,7 @@ neodymium.url = ${neodymium.url.protocol}://${neodymium.url.host}${neodymium.url.path} neodymium.url.protocol = http neodymium.url.host = localhost -neodymium.url.path = ${neodymium.url.port}/posters +neodymium.url.path = ${neodymium.url.port}/ neodymium.url.port = :8080 neodymium.locale = en_US From aeb6769a7f17b16080329e7a0ad196f29083a803 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Tue, 22 Aug 2023 10:47:14 +0200 Subject: [PATCH 37/44] relocated methods --- .../pageobjects/pages/AbstractPageObject.java | 35 ---------- .../pages/checkout/AbstractCheckoutPage.java | 54 --------------- .../checkout/GuestBillingAddressPage.java | 68 +++++++++++++++++++ .../pages/checkout/GuestPaymentPage.java | 36 ++++++++++ .../checkout/GuestShippingAddressPage.java | 67 ++++++++++++++++++ .../pages/checkout/OrderConfirmationPage.java | 21 ++++++ .../pages/checkout/PlaceOrderPage.java | 30 ++++++++ .../ReturningCustomerBillingAddressPage.java | 10 +++ .../ReturningCustomerPaymentPage.java | 10 +++ .../ReturningCustomerShippingAddressPage.java | 10 +++ .../pages/user/DeleteAccountPage.java | 6 ++ .../pageobjects/pages/user/LoginPage.java | 6 ++ .../pageobjects/pages/user/RegisterPage.java | 6 ++ 13 files changed, 270 insertions(+), 89 deletions(-) diff --git a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java index 801b4e9e..dcf5b60f 100644 --- a/src/test/java/posters/pageobjects/pages/AbstractPageObject.java +++ b/src/test/java/posters/pageobjects/pages/AbstractPageObject.java @@ -1,12 +1,7 @@ package posters.pageobjects.pages; -import static com.codeborne.selenide.Condition.exactText; -import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; -import com.xceptance.neodymium.util.Neodymium; - -import io.qameta.allure.Step; import posters.pageobjects.components.Title; public abstract class AbstractPageObject @@ -24,34 +19,4 @@ public void scrollToTop() { $("body").scrollTo(); } - - /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage, PlaceOrderPage, OrderConfirmationPage ----- /// - - @Step("validate process wrap") - public void validateProcessWrap() - { - // validate process numbers - $("#crt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.number"))).shouldBe(visible); - $("#ship span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.number"))).shouldBe(visible); - $("#bill span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.number"))).shouldBe(visible); - $("#payment span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.number"))).shouldBe(visible); - $("#chkout span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.number"))).shouldBe(visible); - $("#orderCmplt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.number"))).shouldBe(visible); - - // validate process names - $("#crt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.name"))).shouldBe(visible); - $("#ship h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.name"))).shouldBe(visible); - $("#bill h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.name"))).shouldBe(visible); - $("#payment h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.name"))).shouldBe(visible); - $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); - $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); - } - - /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage, LoginPage ----- /// - - @Step("validate required string") - public void validateRequiredString() - { - $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); - } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java index 987eae1c..5b890d7e 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/AbstractCheckoutPage.java @@ -1,16 +1,5 @@ package posters.pageobjects.pages.checkout; -import static com.codeborne.selenide.Condition.attribute; -import static com.codeborne.selenide.Condition.exactText; -import static com.codeborne.selenide.Condition.exist; -import static com.codeborne.selenide.Condition.matchText; -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; - -import com.xceptance.neodymium.util.Neodymium; - -import io.qameta.allure.Step; import posters.pageobjects.components.CheckoutHeader; import posters.pageobjects.components.Footer; import posters.pageobjects.components.UserMenu; @@ -33,47 +22,4 @@ public void validateStructure() footer.isComponentAvailable(); userMenu.isComponentAvailable(); } - - /// ----- ShippingAddressPage, BillingAddressPage, PaymentPage, PlaceOrderPage ----- /// - - @Step("validate breadcrumb") - public void validateBreadcrumb() - { - $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); - $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); - $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); - $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); - $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); - } - - /// ----- ShippingAddressPage, BillingAddressPage ----- /// - - @Step("validate fill-in form headlines") - public void validateFillInHeadlines() - { - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.fullName"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.company"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.address"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.city"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.state"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.zip"))); - // TODO - fix after issue is fixed - //$$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.country"))); - } - - @Step("validate fill-in form placeholder") - public void validateFillInPlaceholder() - { - $("#fullName").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.yourName")))).shouldBe(visible); - $("#company").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.companyName")))).shouldBe(visible); - $("#addressLine").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.address")))).shouldBe(visible); - $("#zip").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.zip")))).shouldBe(visible); - } - - @Step("validate country dropdown") - public void validateCountryDropdown() - { - $("#country").shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.usa"))).should(exist); - $("#country").shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.germany"))).should(exist); - } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java index 52b4a711..5ea8765f 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java @@ -1,9 +1,12 @@ package posters.pageobjects.pages.checkout; +import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -27,6 +30,71 @@ public GuestBillingAddressPage isExpectedPage() /// ----- validate content guest billing address page ----- /// + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + + @Step("validate process wrap") + public void validateProcessWrap() + { + // validate process numbers + $("#crt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.number"))).shouldBe(visible); + $("#ship span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.number"))).shouldBe(visible); + $("#bill span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.number"))).shouldBe(visible); + $("#payment span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.number"))).shouldBe(visible); + $("#chkout span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.number"))).shouldBe(visible); + $("#orderCmplt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.number"))).shouldBe(visible); + + // validate process names + $("#crt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.name"))).shouldBe(visible); + $("#ship h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.name"))).shouldBe(visible); + $("#bill h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.name"))).shouldBe(visible); + $("#payment h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.name"))).shouldBe(visible); + $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); + $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); + } + + @Step("validate fill-in form headlines") + public void validateFillInHeadlines() + { + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.fullName"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.company"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.address"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.city"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.state"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.zip"))); + // TODO - fix after issue is fixed + //$$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.country"))); + } + + @Step("validate fill-in form placeholder") + public void validateFillInPlaceholder() + { + $("#fullName").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.yourName")))).shouldBe(visible); + $("#company").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.companyName")))).shouldBe(visible); + $("#addressLine").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.address")))).shouldBe(visible); + $("#zip").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.zip")))).shouldBe(visible); + } + + @Step("validate country dropdown") + public void validateCountryDropdown() + { + $("#country").shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.usa"))).should(exist); + $("#country").shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.germany"))).should(exist); + } + + @Step("validate required string") + public void validateRequiredString() + { + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + } + @Override @Step("validate shipping address page structure") public void validateStructure() diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java index d7f28f21..265502da 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java @@ -42,6 +42,36 @@ public GuestPaymentPage isExpectedPage() /// ----- validate content guest payment page ----- /// + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + + @Step("validate process wrap") + public void validateProcessWrap() + { + // validate process numbers + $("#crt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.number"))).shouldBe(visible); + $("#ship span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.number"))).shouldBe(visible); + $("#bill span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.number"))).shouldBe(visible); + $("#payment span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.number"))).shouldBe(visible); + $("#chkout span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.number"))).shouldBe(visible); + $("#orderCmplt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.number"))).shouldBe(visible); + + // validate process names + $("#crt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.name"))).shouldBe(visible); + $("#ship h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.name"))).shouldBe(visible); + $("#bill h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.name"))).shouldBe(visible); + $("#payment h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.name"))).shouldBe(visible); + $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); + $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); + } + @Step("validate fill-in form headlines") public void validateFillInHeadlines(String headline) { @@ -118,6 +148,12 @@ public void validateYearDropdown() validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2033"); } + @Step("validate required string") + public void validateRequiredString() + { + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + } + @Override @Step("validate payment page structure") public void validateStructure() diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java index 07e9a1fc..31946c41 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java @@ -1,10 +1,12 @@ package posters.pageobjects.pages.checkout; +import static com.codeborne.selenide.Condition.attribute; import static com.codeborne.selenide.Condition.exactText; import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Condition.matchText; import static com.codeborne.selenide.Condition.visible; import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; import com.codeborne.selenide.SelenideElement; import com.xceptance.neodymium.util.Neodymium; @@ -29,6 +31,65 @@ public GuestShippingAddressPage isExpectedPage() /// ----- validate content guest shipping address page ----- /// + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + + @Step("validate process wrap") + public void validateProcessWrap() + { + // validate process numbers + $("#crt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.number"))).shouldBe(visible); + $("#ship span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.number"))).shouldBe(visible); + $("#bill span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.number"))).shouldBe(visible); + $("#payment span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.number"))).shouldBe(visible); + $("#chkout span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.number"))).shouldBe(visible); + $("#orderCmplt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.number"))).shouldBe(visible); + + // validate process names + $("#crt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.name"))).shouldBe(visible); + $("#ship h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.name"))).shouldBe(visible); + $("#bill h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.name"))).shouldBe(visible); + $("#payment h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.name"))).shouldBe(visible); + $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); + $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); + } + + @Step("validate fill-in form headlines") + public void validateFillInHeadlines() + { + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.fullName"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.company"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.address"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.city"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.state"))); + $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.zip"))); + // TODO - fix after issue is fixed + //$$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.country"))); + } + + @Step("validate fill-in form placeholder") + public void validateFillInPlaceholder() + { + $("#fullName").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.yourName")))).shouldBe(visible); + $("#company").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.companyName")))).shouldBe(visible); + $("#addressLine").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.address")))).shouldBe(visible); + $("#zip").shouldHave(attribute("placeholder", (Neodymium.localizedText("AddressPages.fillIn.placeholder.zip")))).shouldBe(visible); + } + + @Step("validate country dropdown") + public void validateCountryDropdown() + { + $("#country").shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.usa"))).should(exist); + $("#country").shouldBe(matchText(Neodymium.localizedText("AddressPages.fillIn.dropdown.germany"))).should(exist); + } + @Step("validate shipping address usage for billing address radio") public void validateAddressRadio() { @@ -36,6 +97,12 @@ public void validateAddressRadio() $(".radio :nth-of-type(1)").shouldHave(matchText(Neodymium.localizedText("AddressPages.fillIn.radio.yes"))).shouldBe(visible); $(".radio :nth-of-type(2)").shouldHave(matchText(Neodymium.localizedText("AddressPages.fillIn.radio.no"))).shouldBe(visible); } + + @Step("validate required string") + public void validateRequiredString() + { + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + } @Override @Step("validate shipping address page structure") diff --git a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java index de3addb6..02e4685e 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java @@ -26,6 +26,27 @@ public OrderConfirmationPage isExpectedPage() /// ----- validate content order confirmation page ----- /// + @Step("validate process wrap") + public void validateProcessWrap() + { + // validate process numbers + $("#crt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.number"))).shouldBe(visible); + $("#ship span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.number"))).shouldBe(visible); + $("#bill span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.number"))).shouldBe(visible); + $("#payment span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.number"))).shouldBe(visible); + $("#chkout span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.number"))).shouldBe(visible); + $("#orderCmplt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.number"))).shouldBe(visible); + + // validate process names + $("#crt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.name"))).shouldBe(visible); + $("#ship h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.name"))).shouldBe(visible); + $("#bill h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.name"))).shouldBe(visible); + $("#payment h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.name"))).shouldBe(visible); + $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); + $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); + } + + @Step("validate order confirmation page structure") public void validateStructure() { super.validateStructure(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java index 3bd9c3fa..bc5b5baa 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java @@ -54,6 +54,16 @@ public PlaceOrderPage isExpectedPage() /// ----- validate content place order page ----- /// + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + @Step("validate product table head") public void validateTableHead() { @@ -64,6 +74,26 @@ public void validateTableHead() tableHead.findBy(exactText(Neodymium.localizedText("General.productTable.totalPrice"))).shouldBe(visible); } + @Step("validate process wrap") + public void validateProcessWrap() + { + // validate process numbers + $("#crt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.number"))).shouldBe(visible); + $("#ship span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.number"))).shouldBe(visible); + $("#bill span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.number"))).shouldBe(visible); + $("#payment span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.number"))).shouldBe(visible); + $("#chkout span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.number"))).shouldBe(visible); + $("#orderCmplt span").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.number"))).shouldBe(visible); + + // validate process names + $("#crt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.1.name"))).shouldBe(visible); + $("#ship h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.2.name"))).shouldBe(visible); + $("#bill h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.3.name"))).shouldBe(visible); + $("#payment h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.4.name"))).shouldBe(visible); + $("#chkout h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.5.name"))).shouldBe(visible); + $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); + } + @Override @Step("validate place order page structure") public void validateStructure() diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java index b08b0fdc..0805213d 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java @@ -29,6 +29,16 @@ public ReturningCustomerBillingAddressPage isExpectedPage() /// ----- validate content returning customer billing address page ----- /// + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + @Override @Step("validate returning customer billing address page structure") public void validateStructure() diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java index bb3c28bf..d9a927f3 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java @@ -31,6 +31,16 @@ public ReturningCustomerPaymentPage isExpectedPage() /// ----- validate content returning customer payment page ----- /// + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + @Override @Step("validate returning customer payment page structure") public void validateStructure() diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java index 240094b5..6a1a5756 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java @@ -30,6 +30,16 @@ public ReturningCustomerShippingAddressPage isExpectedPage() /// ----- validate content returning customer shipping address page ----- /// + @Step("validate breadcrumb") + public void validateBreadcrumb() + { + $("#btnToCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.cart"))).shouldBe(visible); + $("#btnShippAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.shippingAddress"))).shouldBe(visible); + $("#btnBillAddr").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.billingAddress"))).shouldBe(visible); + $("#btnCreditCard").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.payment"))).shouldBe(visible); + $("#btnPlaceOrder").shouldHave(exactText(Neodymium.localizedText("AddressPages.breadcrumb.placeOrder"))).shouldBe(visible); + } + @Override @Step("validate returning customer shipping address page structure") public void validateStructure() diff --git a/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java b/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java index b814a0a9..5feb0284 100644 --- a/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java +++ b/src/test/java/posters/pageobjects/pages/user/DeleteAccountPage.java @@ -33,6 +33,12 @@ public DeleteAccountPage isExpectedPage() /// ----- validate content delete account page ----- /// + @Step("validate required string") + public void validateRequiredString() + { + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + } + @Override @Step("validate delete account page structure") public void validateStructure() diff --git a/src/test/java/posters/pageobjects/pages/user/LoginPage.java b/src/test/java/posters/pageobjects/pages/user/LoginPage.java index 8f775957..896fd6d9 100644 --- a/src/test/java/posters/pageobjects/pages/user/LoginPage.java +++ b/src/test/java/posters/pageobjects/pages/user/LoginPage.java @@ -40,6 +40,12 @@ public LoginPage isExpectedPage() /// ----- validate content login page ----- /// + @Step("validate required string") + public void validateRequiredString() + { + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + } + @Override @Step("validate login page structure") public void validateStructure() diff --git a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java index 1c951bbd..3f2ddaf8 100644 --- a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java +++ b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java @@ -62,6 +62,12 @@ public void validateFillInPlaceholder() passwordRepeatField.shouldHave(attribute("placeholder", (Neodymium.localizedText("RegisterPage.placeholder.passwordRepeat")))).shouldBe(visible); } + @Step("validate required string") + public void validateRequiredString() + { + $(".reqField").shouldHave(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.requiredFields"))).shouldBe(visible); + } + @Override @Step("validate register page structure") public void validateStructure() From 882dc827f769c88208baddc2e32c8bf99a9d7d05 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Tue, 22 Aug 2023 12:37:20 +0200 Subject: [PATCH 38/44] fixed poster slide validation --- .../java/posters/pageobjects/pages/browsing/HomePage.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index 22162bb1..a7748874 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -36,11 +36,8 @@ public HomePage isExpectedPage() @Step("validate poster slide") public void validatePosterSlide(String position, String headline) - { - slideNavigation.findBy(exactText(position)).click(); - slideNavigation.findBy(exactText(position)).click(); - slideNavigation.findBy(exactText(position)).click(); - + { + slideNavigation.findBy(exactText(position)).shouldBe(visible).scrollIntoView(true).click(); slideHeadline.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); slideButton.findBy(exactText(Neodymium.localizedText("HomePage.slider.button"))).shouldBe(visible); } From 4e982516491e2e9a6276d3d6a6118b43f50a1a79 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Tue, 22 Aug 2023 16:01:08 +0200 Subject: [PATCH 39/44] fixed parameter issues in step annotations --- .../java/posters/flows/CartCleanUpFlow.java | 2 +- .../java/posters/flows/DeleteUserFlow.java | 2 +- .../java/posters/flows/OpenLoginPageFlow.java | 2 +- .../components/CheckoutHeader.java | 4 + .../pageobjects/components/ErrorMessage.java | 2 +- .../pageobjects/components/Footer.java | 4 +- .../pageobjects/components/MiniCart.java | 11 ++- .../pageobjects/components/Pagination.java | 7 +- .../pageobjects/components/SaleBanner.java | 1 - .../pageobjects/components/Search.java | 10 +-- .../components/SuccessMessage.java | 2 +- .../pageobjects/components/TopNavigation.java | 8 +- .../pageobjects/components/UserMenu.java | 2 +- .../pages/browsing/CategoryPage.java | 6 +- .../pageobjects/pages/browsing/HomePage.java | 3 +- .../pages/browsing/ProductDetailPage.java | 14 ++-- .../pageobjects/pages/checkout/CartPage.java | 28 ++++--- .../checkout/GuestBillingAddressPage.java | 43 ++++++----- .../pages/checkout/GuestPaymentPage.java | 25 +++--- .../checkout/GuestShippingAddressPage.java | 77 ++++++++++--------- .../pages/checkout/PlaceOrderPage.java | 10 +-- .../ReturningCustomerBillingAddressPage.java | 4 +- .../ReturningCustomerPaymentPage.java | 4 +- .../ReturningCustomerShippingAddressPage.java | 4 +- .../pageobjects/pages/user/LoginPage.java | 4 +- .../pages/user/PersonalDataPage.java | 2 +- .../pageobjects/pages/user/RegisterPage.java | 19 +++-- .../pageobjects/utility/PriceHelper.java | 6 +- 28 files changed, 156 insertions(+), 150 deletions(-) diff --git a/src/test/java/posters/flows/CartCleanUpFlow.java b/src/test/java/posters/flows/CartCleanUpFlow.java index 5341bfb7..77f64774 100644 --- a/src/test/java/posters/flows/CartCleanUpFlow.java +++ b/src/test/java/posters/flows/CartCleanUpFlow.java @@ -5,7 +5,7 @@ public class CartCleanUpFlow { - @Step("cart clean up flow") + @Step("clean up cart flow") public static void flow() { HomePage homePage = new HomePage(); diff --git a/src/test/java/posters/flows/DeleteUserFlow.java b/src/test/java/posters/flows/DeleteUserFlow.java index cb09498e..6bed06ea 100644 --- a/src/test/java/posters/flows/DeleteUserFlow.java +++ b/src/test/java/posters/flows/DeleteUserFlow.java @@ -7,7 +7,7 @@ public class DeleteUserFlow { - @Step("delete user flow") + @Step("delete '{user}' flow") public static LoginPage flow(User user) { HomePage homePage = new HomePage(); diff --git a/src/test/java/posters/flows/OpenLoginPageFlow.java b/src/test/java/posters/flows/OpenLoginPageFlow.java index b24350dc..42091fac 100644 --- a/src/test/java/posters/flows/OpenLoginPageFlow.java +++ b/src/test/java/posters/flows/OpenLoginPageFlow.java @@ -17,4 +17,4 @@ public static LoginPage flow() return loginPage.isExpectedPage(); } -} \ No newline at end of file +} diff --git a/src/test/java/posters/pageobjects/components/CheckoutHeader.java b/src/test/java/posters/pageobjects/components/CheckoutHeader.java index 6ca6a749..32693654 100644 --- a/src/test/java/posters/pageobjects/components/CheckoutHeader.java +++ b/src/test/java/posters/pageobjects/components/CheckoutHeader.java @@ -3,8 +3,12 @@ import static com.codeborne.selenide.Condition.exist; import static com.codeborne.selenide.Selenide.$; +import io.qameta.allure.Step; + public class CheckoutHeader extends AbstractComponent { + @Override + @Step("ensure availability checkout header") public void isComponentAvailable() { $("#headerCheckout").should(exist); diff --git a/src/test/java/posters/pageobjects/components/ErrorMessage.java b/src/test/java/posters/pageobjects/components/ErrorMessage.java index aff72399..9b999490 100644 --- a/src/test/java/posters/pageobjects/components/ErrorMessage.java +++ b/src/test/java/posters/pageobjects/components/ErrorMessage.java @@ -22,7 +22,7 @@ public void isComponentAvailable() /// ----- validate error message ----- /// - @Step("validate visibility of error message {message}") + @Step("validate visibility of error message '{message}'") public void validateErrorMessage(String message) { errorMessage.find("strong").shouldHave(exactText(message)).shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/components/Footer.java b/src/test/java/posters/pageobjects/components/Footer.java index 6638e9f6..4b13bd04 100644 --- a/src/test/java/posters/pageobjects/components/Footer.java +++ b/src/test/java/posters/pageobjects/components/Footer.java @@ -14,6 +14,8 @@ public class Footer extends AbstractComponent { private SelenideElement footer = $("#footer"); + @Override + @Step("ensure availability footer") public void isComponentAvailable() { footer.should(exist); @@ -21,7 +23,7 @@ public void isComponentAvailable() /// ----- validate footer ----- /// - @Step("validate structure footer") + @Step("validate footer") public void validateStructure() { // validate about xceptance diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 627d22e2..2602b7c2 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -127,7 +127,7 @@ public int calculateTotalCount() /// ----- validate mini cart structure ----- /// - @Step("validate the mini cart total product count") + @Step("validate the mini cart total product count equals '{totalCount}'") public void validateTotalCount(int totalCount) { totalCountElement.shouldHave(exactText(Integer.toString(totalCount))); @@ -146,13 +146,13 @@ public void validateTitle() } } - @Step("validate the mini cart subtotal price") + @Step("validate the mini cart subtotal price equals '{subtotal}'") public void validateSubtotal(String subtotal) { subOrderPrice.shouldHave(exactText(subtotal)).shouldBe(visible); } - @Step("validate mini cart menu") + @Step("validate mini cart") public void validateStructure() { openMiniCart(); @@ -190,7 +190,6 @@ public void validateStructure() /// ----- validate mini cart item ----- /// - @Step("validate product in the mini cart") private void validateMiniCartItem(int position, String productName, String productStyle, String productSize, int productCount, String prodTotalPrice) { openMiniCart(); @@ -208,14 +207,14 @@ private void validateMiniCartItem(int position, String productName, String produ closeMiniCart(); } - @Step("validate product in the mini cart") + @Step("validate '{product}' on position {position} in the mini cart") public void validateMiniCartItem(int position, Product product) { validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), PriceHelper.format(product.getTotalPrice())); } - @Step("validate '{product}' in the mini cart") + @Step("validate '{product}' on position '{position}' in the mini cart after changing it's quantity") public void validateMiniCartItem(int position, Product product, int productAmount, String productPrice) { validateMiniCartItem(position, product.getName(), product.getStyle(), product.getSize(), productAmount, productPrice); diff --git a/src/test/java/posters/pageobjects/components/Pagination.java b/src/test/java/posters/pageobjects/components/Pagination.java index 702199da..d55dad0e 100644 --- a/src/test/java/posters/pageobjects/components/Pagination.java +++ b/src/test/java/posters/pageobjects/components/Pagination.java @@ -24,7 +24,7 @@ public void isComponentAvailable() /// ----- pagination navigation ----- /// - @Step("click on specific page number") + @Step("click on page number '{pageNumber}'") public void goToPage(int pageNumber) { paginationComponents.findBy(exactText(Integer.toString(pageNumber))).click(); @@ -63,7 +63,7 @@ public void goToFirstPage() * @param expectedResultCount * (number of results for specific category/search) */ - @Step("validate visibility numbers in navigation") + @Step("validate visibility numbers in pagination") public void validateElementNumbers(int expectedResultCount) { int numberOfPages = expectedResultCount / 6; @@ -117,7 +117,6 @@ public void validateStructure(int expectedResultCount) validateLeftNavigation(); validateElementNumbers(expectedResultCount); } - else - return; + else return; } } diff --git a/src/test/java/posters/pageobjects/components/SaleBanner.java b/src/test/java/posters/pageobjects/components/SaleBanner.java index c6c2620f..4504df8e 100644 --- a/src/test/java/posters/pageobjects/components/SaleBanner.java +++ b/src/test/java/posters/pageobjects/components/SaleBanner.java @@ -19,7 +19,6 @@ public void isComponentAvailable() /// ----- validate sale banner ----- /// - @Step("validate strings sale banner") private void validateSaleBanner(String text) { $$(".owl-stage").findBy(exactText(Neodymium.localizedText(text))).waitUntil(visible, 9000); diff --git a/src/test/java/posters/pageobjects/components/Search.java b/src/test/java/posters/pageobjects/components/Search.java index 00334944..0abe631d 100644 --- a/src/test/java/posters/pageobjects/components/Search.java +++ b/src/test/java/posters/pageobjects/components/Search.java @@ -30,28 +30,28 @@ public void openSearch() searchField.scrollTo().click(); } - @Step("search for {searchTerm}") + @Step("search for '{searchTerm}'") public void search(String searchTerm) { openSearch(); searchField.val(searchTerm).pressEnter(); } - @Step("validate that {searchTerm} is still visible after") + @Step("validate that '{searchTerm}' is still visible after search") public void validateSearchTerm(String searchTerm) { openSearch(); searchField.shouldHave(exactValue(searchTerm)); } - @Step("search for {searchTerm} without result") + @Step("search for '{searchTerm}' without result") public NoHitsPage noHitsPageResult(String searchTerm) { search(searchTerm); return new NoHitsPage().isExpectedPage(); } - @Step("search for {searchTerm} with result") + @Step("search for '{searchTerm}' with result") public CategoryPage categoryPageResult(String searchTerm) { search(searchTerm); @@ -60,7 +60,7 @@ public CategoryPage categoryPageResult(String searchTerm) /// ----- validate search ----- /// - @Step("validate structure search bar") + @Step("validate search bar") public void validateStructure() { searchField.shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/components/SuccessMessage.java b/src/test/java/posters/pageobjects/components/SuccessMessage.java index cb6a5427..68603ea0 100644 --- a/src/test/java/posters/pageobjects/components/SuccessMessage.java +++ b/src/test/java/posters/pageobjects/components/SuccessMessage.java @@ -22,7 +22,7 @@ public void isComponentAvailable() /// ----- validate success message ----- /// - @Step("validate that the success message '{message}' is visible") + @Step("validate visibility of success message '{message}'") public void validateSuccessMessage(String message) { successMessage.find("strong").shouldHave(exactText(message)).shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index 39e8bc5c..23183848 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -25,14 +25,14 @@ public void isComponentAvailable() // ----- category navigation ------ // - @Step("click on '{categoryName}' category") + @Step("click on the top category '{topCategory}'") public CategoryPage clickCategory(String topCategory) { $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).scrollTo().click(); return new CategoryPage().isExpectedPage(); } - @Step("click on a '{subCategoryName}' subcategory within '{categoryName}'") + @Step("click on the '{subCategory}' sub category within the top category '{topCategory}'") public CategoryPage clickSubCategory(String topCategory, String subCategory) { $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).hover(); @@ -42,13 +42,13 @@ public CategoryPage clickSubCategory(String topCategory, String subCategory) // ----- validate top navigation ----- // - @Step("validate name of components in navigation") + @Step("validate top category name '{topCategory}'") public void validateNavComponent(String topCategory) { $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).shouldBe(visible); } - @Step("validate name of components in sub navigation") + @Step("validate sub category name '{subCategory}'") public void validateSubNavComponent(String subCategory) { $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/components/UserMenu.java b/src/test/java/posters/pageobjects/components/UserMenu.java index 55ec48b5..b1bbdd40 100644 --- a/src/test/java/posters/pageobjects/components/UserMenu.java +++ b/src/test/java/posters/pageobjects/components/UserMenu.java @@ -92,7 +92,7 @@ public boolean validateIsLoggedIn() return userMenu.find(".firstName").exists(); } - @Step("validate that '{firstName}' is logged in") + @Step("validate that '{firstName}' is displayed in user menu") public void validateLoggedInName(String firstName) { openUserMenu(); diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index 1500bcee..ec4de728 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -53,7 +53,7 @@ public void validateStructure() * @param expectedResultCount * (number of results for specific category/search) */ - @Step("validate category name {categoryName} is on category page") + @Step("validate category name '{categoryName}' and amount results '{expectedResultCount}' is on category page") public void validateCategoryHeadline(String categoryName, int expectedResultCount) { if (categoryName.contains(".")) @@ -80,13 +80,13 @@ public void validate(String categoryName, int expectedResultCount) /// ----- product by position ----- /// - @Step("get a product name by position") + @Step("get a product name by position '{position}'") public String getProductNameByPosition(int position) { return $("#product" + (position - 1) + " h2").text(); } - @Step("click on a product by position") + @Step("click on a product by position '{position}'") public ProductDetailPage clickProductByPosition(int position) { $("#product" + (position - 1)).scrollTo().click(); diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index a7748874..b5d52ad7 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -38,6 +38,7 @@ public HomePage isExpectedPage() public void validatePosterSlide(String position, String headline) { slideNavigation.findBy(exactText(position)).shouldBe(visible).scrollIntoView(true).click(); + //slideHeadline.findBy(exactText(Neodymium.localizedText(headline))).waitUntil(visible, 9000); slideHeadline.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); slideButton.findBy(exactText(Neodymium.localizedText("HomePage.slider.button"))).shouldBe(visible); } @@ -104,7 +105,7 @@ public void validateStructure() /// ----- validate success messages ----- /// - @Step("validate successful login on home page") + @Step("validate successful login of user '{firstName}' on home page") public void validateSuccessfulLogin(String firstName) { // validate success message diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index aae2143d..cc8fb2d3 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -100,13 +100,13 @@ public void validateStructure() $("#btnAddToCart .icon-shopping-cart").shouldBe(visible); } - @Step("validate product name on product detail page") - public void validateProductName(String name) + @Step("validate product name '{prodName}' on product detail page") + public void validateProductName(String prodName) { - productName.shouldHave(exactText(name)); + productName.shouldHave(exactText(prodName)); } - @Step("validate product name page of product '{productName}'") + @Step("validate product detail page") public void validate(String productName) { validateStructure(); @@ -115,13 +115,13 @@ public void validate(String productName) /// ----- select product size/style, add to cart ----- /// - @Step("select size") + @Step("select size '{size}'") public void setSize(String size) { productSize.selectOptionContainingText(size); } - @Step("select style") + @Step("select style '{style}'") public void setStyle(String style) { $(".radio #finish-" + style).selectRadio(style); @@ -133,7 +133,7 @@ public void clickAddToCartButton() addToCartButton.scrollTo().click(); } - @Step("add product with size:'{size}' and style:'{style}' to cart") + @Step("add product with size '{size}' and style '{style}' to cart") public void addToCart(String size, String style) { setSize(size); diff --git a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java index d30d0cff..b84adfbe 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/CartPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/CartPage.java @@ -88,7 +88,7 @@ public void validateStructure() } } - @Step("validate shipping costs on cart page") + @Step("validate shipping costs '{shippingCosts}' on cart page") public void validateShippingCosts(String shippingCosts) { $("#orderShippingCosts").shouldHave(exactText(shippingCosts)); @@ -101,7 +101,7 @@ public void validateTax(String shippingCosts, String subtotal) $("#orderSubTotalTaxValue").shouldHave(exactText(tax)); } - @Step("validate cart page with shipping costs: '{shippingCosts}'") + @Step("validate cart page") public void validate(String shippingCosts, String subtotal) { validateStructure(); @@ -145,7 +145,6 @@ public void validateTotalAfterAdd(int position, String oldSubTotal, double oldTo // price difference for specific product after changing product amount String totalProductPriceChange = PriceHelper.substract(newTotalProductPrice, PriceHelper.format(oldTotalProductPrice)); - // validate {price} equals {price2} Assert.assertEquals(productPrice, totalProductPriceChange); } @@ -158,7 +157,6 @@ public void validateTotalAfterRemove(String oldSubTotal, String oldTotalProductP /// ----- validate product in cart ----- /// - @Step("validate '{product}' on the cart page") private void validateCartItem(int position, String productName, String productStyle, String productSize, int productAmount, String productPrice) { // selector for product @@ -185,7 +183,7 @@ public void validateCartItem(int position, Product product) validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), product.getAmount(), product.getUnitPrice()); } - @Step("validate '{product}' on the cart page") + @Step("validate '{product}' on the cart page after changing it's quantity") public void validateCartItem(int position, Product product, int productAmount) { validateCartItem(position, product.getName(), product.getStyle(), product.getSize(), productAmount, product.getUnitPrice()); @@ -193,43 +191,43 @@ public void validateCartItem(int position, Product product, int productAmount) /// ----- get product data ----- /// - @Step("get product name from line item on the cart page") + @Step("get product name from line item on position '{position}' on the cart page") public String getProductName(int position) { return $("#product" + (position - 1) + " .productName").text(); } - @Step("get product style from line item on the cart page") + @Step("get product style from line item on position '{position}' on the cart page") public String getProductStyle(int position) { return $("#product" + (position - 1) + " .productStyle").text(); } - @Step("get product size from line item on the cart page") + @Step("get product size from line item on position '{position}' on the cart page") public String getProductSize(int position) { return $("#product" + (position - 1) + " .productSize").text(); } - @Step("get product count from line item on the cart page") + @Step("get product count from line item on position '{position}' on the cart page") public String getProductCount(int position) { return $("#product" + (position - 1) + " .productCount").val(); } - @Step("get product unit price from line item on the cart page") + @Step("get product unit price from line item on position '{position}' on the cart page") public String getProductUnitPrice(int position) { return $("#product" + (position - 1) + " .productUnitPrice").text(); } - @Step("get product total price from line item on the cart page") + @Step("get product total price from line item on position '{position}' on the cart page") public String getProductTotalPrice(int position) { return $("#product" + (position - 1) + " .productTotalUnitPrice").text(); } - @Step("get product from line item on the cart page") + @Step("get product from line item on position '{position}' on the cart page") public Product getProduct(int position) { return new Product(getProductName(position), getProductUnitPrice(position), getProductStyle(position), getProductSize(position), Integer.parseInt(getProductCount(position))); @@ -237,7 +235,7 @@ public Product getProduct(int position) /// ----- update product data ----- /// - @Step("update product count on the cart page") + @Step("update product count of product on position '{position}' on the cart page to '{amount}'") public void updateProductCount(int position, int amount) { SelenideElement productContainer = $("#product" + (position - 1)); @@ -249,7 +247,7 @@ public void updateProductCount(int position, int amount) productContainer.find(".btnUpdateProduct").scrollTo().click(); } - @Step("remove product on the cart page") + @Step("remove product on position '{position}' on the cart page") public void removeProduct(int position) { // click delete button @@ -261,7 +259,7 @@ public void removeProduct(int position) /// ----- cart page navigation ----- /// - @Step("click on a product on the cart page") + @Step("click on a product on position '{position}' on the cart page") public ProductDetailPage openProductDetailPage(int position) { $("#product" + (position - 1) + " .product-img").scrollTo().click(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java index 5ea8765f..510c0e8d 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java @@ -24,6 +24,7 @@ public class GuestBillingAddressPage extends AbstractCheckoutPage @Step("ensure this is a billing address page") public GuestBillingAddressPage isExpectedPage() { + super.isExpectedPage(); title.should(exist); return this; } @@ -60,17 +61,22 @@ public void validateProcessWrap() $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); } + private void validateFillInHeadlines(String headline) + { + $$(".form-group").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + } + @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.fullName"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.company"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.address"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.city"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.state"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.zip"))); + validateFillInHeadlines("AddressPages.fillIn.headlines.fullName"); + validateFillInHeadlines("AddressPages.fillIn.headlines.company"); + validateFillInHeadlines("AddressPages.fillIn.headlines.address"); + validateFillInHeadlines("AddressPages.fillIn.headlines.city"); + validateFillInHeadlines("AddressPages.fillIn.headlines.state"); + validateFillInHeadlines("AddressPages.fillIn.headlines.zip"); // TODO - fix after issue is fixed - //$$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.country"))); + //validateFillInHeadlines("AddressPages.fillIn.headlines.country"); } @Step("validate fill-in form placeholder") @@ -129,18 +135,7 @@ public void validateStructure() /// ----- send billing address form ----- /// - @Step("fill and send new billing address form") - public GuestPaymentPage goToGuestPaymentPage(Address billingAddress) - { - String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); - - return goToGuestPaymentPage(fullName, billingAddress.getCompany(), billingAddress.getStreet(), - billingAddress.getCity(), billingAddress.getState(), billingAddress.getZip(), - billingAddress.getCountry()); - } - - @Step("fill and send new billing address form") - public GuestPaymentPage goToGuestPaymentPage(String name, String company, String address, String city, + private GuestPaymentPage goToGuestPaymentPage(String name, String company, String address, String city, String state, String zip, String country) { // fill in form with parameters @@ -157,4 +152,14 @@ public GuestPaymentPage goToGuestPaymentPage(String name, String company, String return new GuestPaymentPage().isExpectedPage(); } + + @Step("fill and send new billing address form with '{billingAddress}'") + public GuestPaymentPage goToGuestPaymentPage(Address billingAddress) + { + String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); + + return goToGuestPaymentPage(fullName, billingAddress.getCompany(), billingAddress.getStreet(), + billingAddress.getCity(), billingAddress.getState(), billingAddress.getZip(), + billingAddress.getCountry()); + } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java index 265502da..f927eb2a 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java @@ -30,7 +30,6 @@ public class GuestPaymentPage extends AbstractCheckoutPage private SelenideElement addPaymentButton = $("#btnAddPayment"); - @Override @Step("ensure this is a payment page") public GuestPaymentPage isExpectedPage() @@ -72,8 +71,7 @@ public void validateProcessWrap() $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); } - @Step("validate fill-in form headlines") - public void validateFillInHeadlines(String headline) + private void validateFillInHeadlines(String headline) { $$(".form-group label").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); } @@ -95,8 +93,7 @@ public void validateFillInPlaceholder() $("#expirationDateYear [selected]").shouldHave(exactText(Integer.toString(LocalDate.now().getYear()))).shouldBe(visible); } - @Step("validate month dropdown") - public void validateMonthDropdown(String month) + private void validateMonthDropdown(String month) { $$("#expirationDateMonth").findBy(matchText(Neodymium.localizedText(month))).shouldBe(visible); } @@ -122,8 +119,7 @@ public void validateMonthDropdown() validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.december"); } - @Step("validate year dropdown") - public void validateYearDropdown(String year) + private void validateYearDropdown(String year) { $$("#expirationDateYear").findBy(matchText(Neodymium.localizedText(year))).shouldBe(visible); } @@ -191,14 +187,7 @@ public void validateStructure() /// ----- send payment form ----- /// - @Step("fill and send payment form") - public PlaceOrderPage goToPlaceOrderPage(CreditCard creditcard) - { - return goToPlaceOrderPage(creditcard.getCardNumber(), creditcard.getFullName(), creditcard.getExpDateMonth(), creditcard.getExpDateYear()); - } - - @Step("fill and send payment form") - public PlaceOrderPage goToPlaceOrderPage(String number, String name, String month, String year) + private PlaceOrderPage goToPlaceOrderPage(String number, String name, String month, String year) { // fill in form with parameters creditCardNumber.val(number); @@ -211,4 +200,10 @@ public PlaceOrderPage goToPlaceOrderPage(String number, String name, String mont return new PlaceOrderPage().isExpectedPage(); } + + @Step("fill and send payment form with '{creditCard}'") + public PlaceOrderPage goToPlaceOrderPage(CreditCard creditCard) + { + return goToPlaceOrderPage(creditCard.getCardNumber(), creditCard.getFullName(), creditCard.getExpDateMonth(), creditCard.getExpDateYear()); + } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java index 31946c41..102ee426 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java @@ -61,17 +61,22 @@ public void validateProcessWrap() $("#orderCmplt h3").shouldHave(exactText(Neodymium.localizedText("AddressPages.processWrap.6.name"))).shouldBe(visible); } + private void validateFillInHeadlines(String headline) + { + $$(".form-group").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + } + @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.fullName"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.company"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.address"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.city"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.state"))); - $$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.zip"))); + validateFillInHeadlines("AddressPages.fillIn.headlines.fullName"); + validateFillInHeadlines("AddressPages.fillIn.headlines.company"); + validateFillInHeadlines("AddressPages.fillIn.headlines.address"); + validateFillInHeadlines("AddressPages.fillIn.headlines.city"); + validateFillInHeadlines("AddressPages.fillIn.headlines.state"); + validateFillInHeadlines("AddressPages.fillIn.headlines.zip"); // TODO - fix after issue is fixed - //$$(".form-group").findBy(exactText(Neodymium.localizedText("AddressPages.fillIn.headlines.country"))); + //validateFillInHeadlines("AddressPages.fillIn.headlines.country"); } @Step("validate fill-in form placeholder") @@ -141,7 +146,27 @@ public void validateStructure() /// ----- send shipping address form ----- /// - @Step("fill and send shipping address form and go to guest billing address page") + private GuestBillingAddressPage goToGuestBillingAddressPage(String name, String company, String address, String city, + String state, String zip, String country) + { + // fill in form with parameters + $("#fullName").val(name); + $("#company").val(company); + $("#addressLine").val(address); + $("#city").val(city); + $("#state").val(state); + $("#zip").val(zip); + $("#country").selectOption(country); + + $("#billEqualShipp-No").scrollTo().click(); + + // go to guest billing address page + addShippingButton.scrollTo().click(); + + return new GuestBillingAddressPage().isExpectedPage(); + } + + @Step("fill and send shipping address form with '{shippingAddress}' and go to guest billing address page") public GuestBillingAddressPage goToGuestBillingAddressPage(Address shippingAddress) { String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); @@ -151,9 +176,8 @@ public GuestBillingAddressPage goToGuestBillingAddressPage(Address shippingAddre shippingAddress.getCountry()); } - @Step("fill and send shipping address form and go to guest billing address page") - public GuestBillingAddressPage goToGuestBillingAddressPage(String name, String company, String address, String city, - String state, String zip, String country) + private GuestPaymentPage goToGuestPaymentPage(String name, String company, String address, String city, + String state, String zip, String country) { // fill in form with parameters $("#fullName").val(name); @@ -164,15 +188,15 @@ public GuestBillingAddressPage goToGuestBillingAddressPage(String name, String c $("#zip").val(zip); $("#country").selectOption(country); - $("#billEqualShipp-No").scrollTo().click(); + $("#billEqualShipp-Yes").scrollTo().click(); - // go to guest billing address page + // go to guest payment page addShippingButton.scrollTo().click(); - return new GuestBillingAddressPage().isExpectedPage(); + return new GuestPaymentPage().isExpectedPage(); } - - @Step("fill and send shipping address form and go to guest payment page") + + @Step("fill and send shipping address form with '{shippingAddress}' and go to guest payment page") public GuestPaymentPage goToGuestPaymentPage(Address shippingAddress) { String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); @@ -181,25 +205,4 @@ public GuestPaymentPage goToGuestPaymentPage(Address shippingAddress) shippingAddress.getCity(), shippingAddress.getState(), shippingAddress.getZip(), shippingAddress.getCountry()); } - - @Step("fill and send shipping address form and go to guest payment page") - public GuestPaymentPage goToGuestPaymentPage(String name, String company, String address, String city, - String state, String zip, String country) - { - // fill in form with parameters - $("#fullName").val(name); - $("#company").val(company); - $("#addressLine").val(address); - $("#city").val(city); - $("#state").val(state); - $("#zip").val(zip); - $("#country").selectOption(country); - - $("#billEqualShipp-Yes").scrollTo().click(); - - // go to guest payment page - addShippingButton.scrollTo().click(); - - return new GuestPaymentPage().isExpectedPage(); - } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java index bc5b5baa..08644776 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java @@ -117,8 +117,7 @@ public void validateStructure() /// ----- validate order overview ----- /// - @Step("validate shipping address overview") - public void validateShippingAddressOverview(Address shippingAddress, String headline) + private void validateShippingAddressOverview(Address shippingAddress, String headline) { // validate headline headlines.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); @@ -145,8 +144,7 @@ public void validateShippingAddressOverview(Address shippingAddress, String head shippingAddressForm.find(".country").shouldHave(exactText(shippingAddress.getCountry())).shouldBe(visible); } - @Step("validate billing address overview") - public void validateBillingAddressOverview(Address billingAddress, String headline) + private void validateBillingAddressOverview(Address billingAddress, String headline) { // validate headline headlines.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); @@ -173,8 +171,7 @@ public void validateBillingAddressOverview(Address billingAddress, String headli billingAddressForm.find(".country").shouldHave(exactText(billingAddress.getCountry())).shouldBe(visible); } - @Step("validate payment overview") - public void validatePaymentOverview(CreditCard creditCard, String headline) + private void validatePaymentOverview(CreditCard creditCard, String headline) { // validate headline headlines.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); @@ -208,7 +205,6 @@ public void validateOrderOverview(Address shippingAddress, Address billingAddres /// ----- validate products ----- /// - @Step("validate '{product}' on the place order page") private void validateProduct(int position, String productName, String productStyle, String productSize, int productAmount, String productPrice) { // selector for product diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java index 0805213d..45cb9b8a 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerBillingAddressPage.java @@ -64,7 +64,7 @@ public void validateStructure() useBillingAddressButton.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerBillingAddressPage.button.useBillAddr"))).shouldBe(visible); } - @Step("validate specific position in address container") + @Step("validate billing address '{billingAddress}' on position '{position}' in address container") public void validateAddressContainer(int position, Address billingAddress) { final int index = position - 1; @@ -82,7 +82,7 @@ public void validateAddressContainer(int position, Address billingAddress) /// ----- select billing address ----- /// - @Step("select a billing address") + @Step("select a billing address on position '{position}'") public ReturningCustomerPaymentPage selectBillingAddress(int position) { final int index = position - 1; diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java index d9a927f3..d042d0a1 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerPaymentPage.java @@ -64,7 +64,7 @@ public void validateStructure() useCreditCardButton.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerPaymentPage.button.useCreditCard"))).shouldBe(visible); } - @Step("validate specific position in credit card container") + @Step("validate credit card '{creditCard}' on position '{position}' in credit card container") public void validateCreditCardContainer(int position, CreditCard creditCard) { final int index = position - 1; @@ -79,7 +79,7 @@ public void validateCreditCardContainer(int position, CreditCard creditCard) /// ----- select credit card ----- /// - @Step("select a credit card for payment") + @Step("select a credit card on position '{position}'") public PlaceOrderPage selectCreditCard(int position) { final int index = position - 1; diff --git a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java index 6a1a5756..42fdaeda 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/ReturningCustomerShippingAddressPage.java @@ -65,7 +65,7 @@ public void validateStructure() useShippingAddressButton.shouldHave(exactText(Neodymium.localizedText("ReturningCustomerShippingAddressPage.button.useShipAddr"))).shouldBe(visible); } - @Step("validate specific position in address container") + @Step("validate shipping address '{shippingAddress}' on position '{position}' in address container") public void validateAddressContainer(int position, Address shippingAddress) { final int index = position - 1; @@ -83,7 +83,7 @@ public void validateAddressContainer(int position, Address shippingAddress) /// ----- select shipping address ----- /// - @Step("select a shipping address") + @Step("select a shipping address on position '{position}'") public ReturningCustomerBillingAddressPage selectShippingAddress(int position) { final int index = position - 1; diff --git a/src/test/java/posters/pageobjects/pages/user/LoginPage.java b/src/test/java/posters/pageobjects/pages/user/LoginPage.java index 896fd6d9..c0f58de9 100644 --- a/src/test/java/posters/pageobjects/pages/user/LoginPage.java +++ b/src/test/java/posters/pageobjects/pages/user/LoginPage.java @@ -116,14 +116,14 @@ public void sendFormWithData(String email, String password) signInButton.scrollTo().click(); } - @Step("send login form with valid user data") + @Step("fill and send login form with valid user '{user}'") public HomePage sendLoginForm(User user) { sendFormWithData(user.getEmail(), user.getPassword()); return new HomePage().isExpectedPage(); } - @Step("send login form with invalid user data") + @Step("fill and send login form with invalid user '{user}'") public LoginPage sendFalseLoginForm(User user) { sendFormWithData(user.getEmail(), user.getPassword()); diff --git a/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java b/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java index 2c4e0293..517062f1 100644 --- a/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java +++ b/src/test/java/posters/pageobjects/pages/user/PersonalDataPage.java @@ -45,7 +45,7 @@ public void validateStructure() deleteButton.shouldHave(exactText(Neodymium.localizedText("PersonalDataPage.buttons.deleteAccount"))).shouldBe(visible); } - @Step("validate personal data") + @Step("validate personal data of '{user}") public void validatePersonalData(User user) { // validate name diff --git a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java index 3f2ddaf8..021f397a 100644 --- a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java +++ b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java @@ -42,14 +42,19 @@ public RegisterPage isExpectedPage() /// ----- validate content register page ----- /// - @Step("validate fill in form headlines") + private void validateFillInHeadlines(String headline) + { + $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + } + + @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.firstName"))).shouldBe(visible); - $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.lastName"))).shouldBe(visible); - $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.email"))).shouldBe(visible); - $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.password"))).shouldBe(visible); - $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText("RegisterPage.headlines.passwordRepeat"))).shouldBe(visible); + validateFillInHeadlines("RegisterPage.headlines.firstName"); + validateFillInHeadlines("RegisterPage.headlines.lastName"); + validateFillInHeadlines("RegisterPage.headlines.email"); + validateFillInHeadlines("RegisterPage.headlines.password"); + validateFillInHeadlines("RegisterPage.headlines.passwordRepeat"); } @Step("validate fill in form placeholder") @@ -92,7 +97,7 @@ public void validateStructure() /// ----- register page navigation ----- /// - @Step("fill and send register form") + @Step("fill and send register form with '{user}'") public LoginPage sendRegisterForm(User user) { // fill out the registration form diff --git a/src/test/java/posters/pageobjects/utility/PriceHelper.java b/src/test/java/posters/pageobjects/utility/PriceHelper.java index 06eeef9c..05257f05 100644 --- a/src/test/java/posters/pageobjects/utility/PriceHelper.java +++ b/src/test/java/posters/pageobjects/utility/PriceHelper.java @@ -14,19 +14,19 @@ public class PriceHelper /// ----- format string ----- /// - @Step("remove $ from {price}") + @Step("remove $ from '{price}'") public static String removeCurrency(String price) { return price.substring(1); } - @Step("add $ to {price}") + @Step("add $ to '{price}'") public static String addCurrency(String price) { return CURRENCY + price; } - @Step("get formatted {price}") + @Step("get formatted price") public static String format(double input) { return addCurrency(decimalFormat.format(input)); From 5d66b51ab3f9fd67ce03cf84079c30dee3f4e734 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Tue, 22 Aug 2023 16:24:03 +0200 Subject: [PATCH 40/44] relocated neo localization invocation (AddToCartTest) --- .../java/posters/pageobjects/components/TopNavigation.java | 6 +++--- src/test/java/posters/tests/smoke/AddToCartTest.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index 23183848..95e2a2b6 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -28,15 +28,15 @@ public void isComponentAvailable() @Step("click on the top category '{topCategory}'") public CategoryPage clickCategory(String topCategory) { - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).scrollTo().click(); + $$(".has-dropdown").findBy(exactText(topCategory)).scrollTo().click(); return new CategoryPage().isExpectedPage(); } @Step("click on the '{subCategory}' sub category within the top category '{topCategory}'") public CategoryPage clickSubCategory(String topCategory, String subCategory) { - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).hover(); - $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).click(); + $$(".has-dropdown").findBy(exactText(topCategory)).hover(); + $$(".navi ul.dropdown-menu li").findBy(exactText(subCategory)).click(); return new CategoryPage().isExpectedPage(); } diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 9f0ceaa4..3b1fe57d 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -37,8 +37,8 @@ public void testAddProductsToCart() final String oldSubtotal = homePage.header.miniCart.getSubtotal(); // go to sub category page - var categoryPage = homePage.header.topNav.clickCategory(addToCartTestData.getTopCategory()); - var subCategoryPage = categoryPage.header.topNav.clickSubCategory(addToCartTestData.getTopCategory(), addToCartTestData.getSubCategory()); + var categoryPage = homePage.header.topNav.clickCategory(Neodymium.localizedText(addToCartTestData.getTopCategory())); + var subCategoryPage = categoryPage.header.topNav.clickSubCategory(Neodymium.localizedText(addToCartTestData.getTopCategory()), Neodymium.localizedText(addToCartTestData.getSubCategory())); // go to product detail page, add and store displayed product var productDetailPage = subCategoryPage.clickProductByPosition(addToCartTestData.getSubCategoryResultPosition()); From 36e3872875771d57994fc6694f807873a6c10a8b Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Tue, 22 Aug 2023 16:38:56 +0200 Subject: [PATCH 41/44] relocated neo localization invocation (BrowseTest) --- .../pages/browsing/CategoryPage.java | 14 +++++++------- .../pageobjects/pages/browsing/HomePage.java | 6 ++++-- .../java/posters/tests/smoke/BrowseTest.java | 17 +++++++++-------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index ec4de728..07a967a8 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -56,19 +56,19 @@ public void validateStructure() @Step("validate category name '{categoryName}' and amount results '{expectedResultCount}' is on category page") public void validateCategoryHeadline(String categoryName, int expectedResultCount) { - if (categoryName.contains(".")) - { - // if {categoryName} contains Neodymium localization - titleCategoryName.should(matchText(Neodymium.localizedText(categoryName))).shouldBe(visible); - titleCategoryName.should(matchText(Integer.toString(expectedResultCount))).shouldBe(visible); - } - else + if ($("#titleSearchText").exists()) { // if {categoryName} is search input $("#titleSearchText").should(matchText(Neodymium.localizedText("CategoryPage.search.resultText"))).shouldBe(visible); $("#searchTextValue").shouldHave(exactText(categoryName)).shouldBe(visible); $("#totalProductCount").shouldHave(exactText(Integer.toString(expectedResultCount))).shouldBe(visible); } + else + { + // if {categoryName} contains Neodymium localization + titleCategoryName.should(matchText(categoryName)).shouldBe(visible); + titleCategoryName.should(matchText(Integer.toString(expectedResultCount))).shouldBe(visible); + } } @Step("validate category page of category '{categoryName}'") diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index b5d52ad7..7e7904d5 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -37,8 +37,10 @@ public HomePage isExpectedPage() @Step("validate poster slide") public void validatePosterSlide(String position, String headline) { - slideNavigation.findBy(exactText(position)).shouldBe(visible).scrollIntoView(true).click(); - //slideHeadline.findBy(exactText(Neodymium.localizedText(headline))).waitUntil(visible, 9000); + slideNavigation.findBy(exactText(position)).click(); + slideNavigation.findBy(exactText(position)).click(); + slideNavigation.findBy(exactText(position)).click(); + slideHeadline.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); slideButton.findBy(exactText(Neodymium.localizedText("HomePage.slider.button"))).shouldBe(visible); } diff --git a/src/test/java/posters/tests/smoke/BrowseTest.java b/src/test/java/posters/tests/smoke/BrowseTest.java index b5958076..e6837265 100644 --- a/src/test/java/posters/tests/smoke/BrowseTest.java +++ b/src/test/java/posters/tests/smoke/BrowseTest.java @@ -4,6 +4,7 @@ import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.util.DataUtils; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; import io.qameta.allure.Severity; @@ -30,8 +31,8 @@ public void testBrowsing() homePage.validateStructure(); // go to category page and validate - var categoryPage = homePage.header.topNav.clickCategory(browseTestData.getTopCategory1()); - categoryPage.validate(browseTestData.getTopCategory1(), browseTestData.getExpectedResultCount1()); + var categoryPage = homePage.header.topNav.clickCategory(Neodymium.localizedText(browseTestData.getTopCategory1())); + categoryPage.validate(Neodymium.localizedText(browseTestData.getTopCategory1()), browseTestData.getExpectedResultCount1()); // go to product page and validate final String productName = categoryPage.getProductNameByPosition(browseTestData.getResultPosition1()); @@ -39,8 +40,8 @@ public void testBrowsing() productDetailPage.validate(productName); // go to category page and validate - categoryPage = productDetailPage.header.topNav.clickCategory(browseTestData.getTopCategory2()); - categoryPage.validate(browseTestData.getTopCategory2(), browseTestData.getExpectedResultCount2()); + categoryPage = productDetailPage.header.topNav.clickCategory(Neodymium.localizedText(browseTestData.getTopCategory2())); + categoryPage.validate(Neodymium.localizedText(browseTestData.getTopCategory2()), browseTestData.getExpectedResultCount2()); // go to product page and validate final String productName2 = categoryPage.getProductNameByPosition(browseTestData.getResultPosition2()); @@ -48,8 +49,8 @@ public void testBrowsing() productDetailPage.validate(productName2); // go to category page and validate - categoryPage = productDetailPage.header.topNav.clickCategory(browseTestData.getTopCategory3()); - categoryPage.validate(browseTestData.getTopCategory3(), browseTestData.getExpectedResultCount3()); + categoryPage = productDetailPage.header.topNav.clickCategory(Neodymium.localizedText(browseTestData.getTopCategory3())); + categoryPage.validate(Neodymium.localizedText(browseTestData.getTopCategory3()), browseTestData.getExpectedResultCount3()); // go to product page and validate final String productName3 = categoryPage.getProductNameByPosition(browseTestData.getResultPosition3()); @@ -57,8 +58,8 @@ public void testBrowsing() productDetailPage.validate(productName3); // go to category page and validate - categoryPage = productDetailPage.header.topNav.clickCategory(browseTestData.getTopCategory4()); - categoryPage.validate(browseTestData.getTopCategory4(), browseTestData.getExpectedResultCount4()); + categoryPage = productDetailPage.header.topNav.clickCategory(Neodymium.localizedText(browseTestData.getTopCategory4())); + categoryPage.validate(Neodymium.localizedText(browseTestData.getTopCategory4()), browseTestData.getExpectedResultCount4()); // go to product page and validate final String productName4 = categoryPage.getProductNameByPosition(browseTestData.getResultPosition4()); From 851acc706d89b6ed346be80af0bd73a9e78972d8 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Tue, 22 Aug 2023 16:42:39 +0200 Subject: [PATCH 42/44] relocated neo localization invocation (tests for components) --- src/test/java/posters/tests/component/HeaderTest.java | 3 ++- src/test/java/posters/tests/component/PaginationTest.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/posters/tests/component/HeaderTest.java b/src/test/java/posters/tests/component/HeaderTest.java index f38a4742..c7416707 100644 --- a/src/test/java/posters/tests/component/HeaderTest.java +++ b/src/test/java/posters/tests/component/HeaderTest.java @@ -5,6 +5,7 @@ import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; import com.xceptance.neodymium.util.DataUtils; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; import io.qameta.allure.Severity; @@ -32,7 +33,7 @@ public void testHeader() homePage.header.validateStructure(); // go to category page - var categoryPage = homePage.header.topNav.clickCategory(headerTestData.getTopCategory()); + var categoryPage = homePage.header.topNav.clickCategory(Neodymium.localizedText(headerTestData.getTopCategory())); categoryPage.header.validateStructure(); //go to product detail page, add product to cart diff --git a/src/test/java/posters/tests/component/PaginationTest.java b/src/test/java/posters/tests/component/PaginationTest.java index 39530021..766e4fad 100644 --- a/src/test/java/posters/tests/component/PaginationTest.java +++ b/src/test/java/posters/tests/component/PaginationTest.java @@ -5,6 +5,7 @@ import com.xceptance.neodymium.module.statement.testdata.DataSet; import com.xceptance.neodymium.module.statement.testdata.SuppressDataSets; import com.xceptance.neodymium.util.DataUtils; +import com.xceptance.neodymium.util.Neodymium; import io.qameta.allure.Owner; import io.qameta.allure.Severity; @@ -31,7 +32,7 @@ public void testPagination() var homePage = OpenHomePageFlow.flow(); // go to category page - var categoryPage = homePage.header.topNav.clickCategory(paginationTestData.getTopCategory()); + var categoryPage = homePage.header.topNav.clickCategory(Neodymium.localizedText(paginationTestData.getTopCategory())); categoryPage.pagination.validateStructure(paginationTestData.getExpectedResultCount()); } } \ No newline at end of file From 7d632c8020701fed914f43761e9ea10a3d1eb9aa Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Wed, 23 Aug 2023 08:58:56 +0200 Subject: [PATCH 43/44] relocated neo localization invocation (remaining tests) --- src/test/java/posters/flows/CartCleanUpFlow.java | 3 +++ src/test/java/posters/flows/DeleteUserFlow.java | 6 +++--- .../pageobjects/pages/browsing/CategoryPage.java | 9 +++++++++ .../pageobjects/pages/browsing/NoHitsPage.java | 9 +++++++++ .../pageobjects/pages/browsing/ProductDetailPage.java | 9 +++++++++ .../pages/checkout/OrderConfirmationPage.java | 2 +- .../posters/pageobjects/pages/user/LoginPage.java | 7 +++++++ src/test/java/posters/tests/component/HeaderTest.java | 3 +++ .../java/posters/tests/component/PaginationTest.java | 3 +++ src/test/java/posters/tests/smoke/AddToCartTest.java | 11 +++++++++++ src/test/java/posters/tests/smoke/BrowseTest.java | 3 +++ src/test/java/posters/tests/smoke/GuestOrderTest.java | 2 +- .../java/posters/tests/smoke/RegisteredOrderTest.java | 11 ++++++----- src/test/java/posters/tests/smoke/SearchTest.java | 6 ++++++ 14 files changed, 74 insertions(+), 10 deletions(-) diff --git a/src/test/java/posters/flows/CartCleanUpFlow.java b/src/test/java/posters/flows/CartCleanUpFlow.java index 77f64774..b6633990 100644 --- a/src/test/java/posters/flows/CartCleanUpFlow.java +++ b/src/test/java/posters/flows/CartCleanUpFlow.java @@ -18,5 +18,8 @@ public static void flow() { cartPage.removeProduct(1); } + + // go to homepage + homePage = cartPage.openHomePage(); } } diff --git a/src/test/java/posters/flows/DeleteUserFlow.java b/src/test/java/posters/flows/DeleteUserFlow.java index 6bed06ea..80cafcfc 100644 --- a/src/test/java/posters/flows/DeleteUserFlow.java +++ b/src/test/java/posters/flows/DeleteUserFlow.java @@ -3,12 +3,11 @@ import io.qameta.allure.Step; import posters.tests.testdata.dataobjects.User; import posters.pageobjects.pages.browsing.HomePage; -import posters.pageobjects.pages.user.LoginPage; public class DeleteUserFlow { @Step("delete '{user}' flow") - public static LoginPage flow(User user) + public static void flow(User user) { HomePage homePage = new HomePage(); @@ -34,6 +33,7 @@ public static LoginPage flow(User user) loginPage.sendFalseLoginForm(user); loginPage.validateWrongEmail(user.getEmail()); - return loginPage.isExpectedPage(); + // go to homePage + homePage = loginPage.openHomePage(); } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java index 07a967a8..2d11283a 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/CategoryPage.java @@ -92,4 +92,13 @@ public ProductDetailPage clickProductByPosition(int position) $("#product" + (position - 1)).scrollTo().click(); return new ProductDetailPage().isExpectedPage(); } + + /// ----- category page navigation ----- /// + + @Step("open homepage from category page") + public HomePage openHomePage() + { + $("#brand").scrollTo().click(); + return new HomePage().isExpectedPage(); + } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java b/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java index fb79c884..9e35efd4 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/NoHitsPage.java @@ -33,4 +33,13 @@ public void validateStructure() super.validateStructure(); validateNoProductsFound(); } + + /// ----- no hits page navigation ----- /// + + @Step("open homepage from no hits page") + public HomePage openHomePage() + { + $("#brand").scrollTo().click(); + return new HomePage().isExpectedPage(); + } } diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index cc8fb2d3..03672800 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -172,4 +172,13 @@ public Product getProduct() { return new Product(getProductName(), getProductPrice(), getChosenStyle(), getChosenSize(), 1); } + + /// ----- product detail page navigation ----- /// + + @Step("open homepage from product detail page") + public HomePage openHomePage() + { + $("#brand").scrollTo().click(); + return new HomePage().isExpectedPage(); + } } diff --git a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java index 02e4685e..0d81eb10 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/OrderConfirmationPage.java @@ -70,7 +70,7 @@ public void validateStructure() /// ----- order confirmation page navigation ----- /// - @Step("go to homepage") + @Step("open homepage from order confirmation page") public HomePage openHomePage() { homePageButton.scrollTo().click(); diff --git a/src/test/java/posters/pageobjects/pages/user/LoginPage.java b/src/test/java/posters/pageobjects/pages/user/LoginPage.java index c0f58de9..4f126108 100644 --- a/src/test/java/posters/pageobjects/pages/user/LoginPage.java +++ b/src/test/java/posters/pageobjects/pages/user/LoginPage.java @@ -105,6 +105,13 @@ public RegisterPage openRegister() return new RegisterPage().isExpectedPage(); } + @Step("open homepage from login page") + public HomePage openHomePage() + { + $("#brand").scrollTo().click(); + return new HomePage().isExpectedPage(); + } + @Step("send login form") public void sendFormWithData(String email, String password) { diff --git a/src/test/java/posters/tests/component/HeaderTest.java b/src/test/java/posters/tests/component/HeaderTest.java index c7416707..70140b67 100644 --- a/src/test/java/posters/tests/component/HeaderTest.java +++ b/src/test/java/posters/tests/component/HeaderTest.java @@ -43,5 +43,8 @@ public void testHeader() // go to cart page var cartPage = productDetailPage.header.miniCart.openCartPage(); cartPage.header.validateStructure(); + + // go to homepage + homePage = cartPage.openHomePage(); } } \ No newline at end of file diff --git a/src/test/java/posters/tests/component/PaginationTest.java b/src/test/java/posters/tests/component/PaginationTest.java index 766e4fad..d4726760 100644 --- a/src/test/java/posters/tests/component/PaginationTest.java +++ b/src/test/java/posters/tests/component/PaginationTest.java @@ -34,5 +34,8 @@ public void testPagination() // go to category page var categoryPage = homePage.header.topNav.clickCategory(Neodymium.localizedText(paginationTestData.getTopCategory())); categoryPage.pagination.validateStructure(paginationTestData.getExpectedResultCount()); + + // go to homepage + homePage = categoryPage.openHomePage(); } } \ No newline at end of file diff --git a/src/test/java/posters/tests/smoke/AddToCartTest.java b/src/test/java/posters/tests/smoke/AddToCartTest.java index 3b1fe57d..657bd5ee 100644 --- a/src/test/java/posters/tests/smoke/AddToCartTest.java +++ b/src/test/java/posters/tests/smoke/AddToCartTest.java @@ -1,5 +1,6 @@ package posters.tests.smoke; +import org.junit.After; import org.junit.Test; import com.xceptance.neodymium.module.statement.testdata.DataSet; @@ -10,6 +11,7 @@ import io.qameta.allure.Severity; import io.qameta.allure.SeverityLevel; import io.qameta.allure.junit4.Tag; +import posters.flows.CartCleanUpFlow; import posters.flows.OpenHomePageFlow; import posters.tests.AbstractTest; import posters.tests.testdata.processes.AddToCartTestData; @@ -144,5 +146,14 @@ public void testAddProductsToCart() cartPage.validateTotalAfterAdd(1, oldSubtotal5, productFromCartPageBefore.getTotalPrice()); cartPage.header.miniCart.validateStructure(); cartPage.header.miniCart.validateMiniCartItem(1, productFromCartPageBefore, cartPage.header.miniCart.getTotalCount(), subtotalAfterUpdate); + + // go to homepage + homePage = cartPage.openHomePage(); + } + + @After + public void after() + { + CartCleanUpFlow.flow(); } } diff --git a/src/test/java/posters/tests/smoke/BrowseTest.java b/src/test/java/posters/tests/smoke/BrowseTest.java index e6837265..29cee3aa 100644 --- a/src/test/java/posters/tests/smoke/BrowseTest.java +++ b/src/test/java/posters/tests/smoke/BrowseTest.java @@ -65,5 +65,8 @@ public void testBrowsing() final String productName4 = categoryPage.getProductNameByPosition(browseTestData.getResultPosition4()); productDetailPage = categoryPage.clickProductByPosition(browseTestData.getResultPosition4()); productDetailPage.validate(productName4); + + // go to homepage + homePage = productDetailPage.openHomePage(); } } \ No newline at end of file diff --git a/src/test/java/posters/tests/smoke/GuestOrderTest.java b/src/test/java/posters/tests/smoke/GuestOrderTest.java index 269bd112..5cce7868 100644 --- a/src/test/java/posters/tests/smoke/GuestOrderTest.java +++ b/src/test/java/posters/tests/smoke/GuestOrderTest.java @@ -35,7 +35,7 @@ public void testOrderingAsGuest() var homePage = OpenHomePageFlow.flow(); // go to category page - var categoryPage = homePage.header.topNav.clickCategory(guestOrderTestData.getTopCategory()); + var categoryPage = homePage.header.topNav.clickCategory(Neodymium.localizedText(guestOrderTestData.getTopCategory())); // go to product detail page, add and store displayed product var productDetailPage = categoryPage.clickProductByPosition(guestOrderTestData.getResultPosition()); diff --git a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java index 89fb9833..0343154e 100644 --- a/src/test/java/posters/tests/smoke/RegisteredOrderTest.java +++ b/src/test/java/posters/tests/smoke/RegisteredOrderTest.java @@ -42,7 +42,7 @@ public void testOrderingAsRegisteredUser() homePage.validateSuccessfulLogin(registeredOrderTestData.getUser().getFirstName()); // go to category page - var categoryPage = homePage.header.topNav.clickCategory(registeredOrderTestData.getTopCategory()); + var categoryPage = homePage.header.topNav.clickCategory(Neodymium.localizedText(registeredOrderTestData.getTopCategory())); // go to product detail page, add and store displayed product var productDetailPage = categoryPage.clickProductByPosition(registeredOrderTestData.getResultPosition()); @@ -80,13 +80,11 @@ public void testOrderingAsRegisteredUser() if (!registeredOrderTestData.getShipAddrEqualBillAddr()) { - placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getBillingAddress(), - registeredOrderTestData.getCreditCard()); + placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getBillingAddress(), registeredOrderTestData.getCreditCard()); } else { - placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getShippingAddress(), - registeredOrderTestData.getCreditCard()); + placeOrderPage.validateOrderOverview(registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getShippingAddress(), registeredOrderTestData.getCreditCard()); } placeOrderPage.validateStructure(); @@ -96,6 +94,9 @@ public void testOrderingAsRegisteredUser() // go to order confirmation page var orderConfirmationPage = placeOrderPage.placeOrder(); orderConfirmationPage.validateStructure(); + + // go to homepage + homePage = orderConfirmationPage.openHomePage(); } @After diff --git a/src/test/java/posters/tests/smoke/SearchTest.java b/src/test/java/posters/tests/smoke/SearchTest.java index 473e3b94..466769e5 100644 --- a/src/test/java/posters/tests/smoke/SearchTest.java +++ b/src/test/java/posters/tests/smoke/SearchTest.java @@ -44,6 +44,9 @@ public void testSearching() final String productName = categoryPage.getProductNameByPosition(searchTestData.getResultPosition()); var productDetailPage = categoryPage.clickProductByPosition(searchTestData.getResultPosition()); productDetailPage.validate(productName); + + // go to homepage + homePage = productDetailPage.openHomePage(); } @Test @@ -56,5 +59,8 @@ public void testSearchingWithoutResult() // go to no hits page var noHitsPage = homePage.header.search.noHitsPageResult(searchTestData.getSearchTerm()); noHitsPage.validateStructure(); + + // go to homepage + homePage = noHitsPage.openHomePage(); } } From 2ecfca28e1fa4dfde1657bd5d867a89717866b95 Mon Sep 17 00:00:00 2001 From: Jonas Hoyer Date: Wed, 23 Aug 2023 10:47:30 +0200 Subject: [PATCH 44/44] relocated neo localization invocations once again --- config/browser.properties | 2 +- .../pageobjects/components/MiniCart.java | 2 +- .../pageobjects/components/SaleBanner.java | 6 +- .../pageobjects/components/TopNavigation.java | 38 ++++++------ .../pageobjects/pages/browsing/HomePage.java | 4 +- .../pages/browsing/ProductDetailPage.java | 12 ++-- .../checkout/GuestBillingAddressPage.java | 16 ++--- .../pages/checkout/GuestPaymentPage.java | 58 +++++++++---------- .../checkout/GuestShippingAddressPage.java | 16 ++--- .../pages/checkout/PlaceOrderPage.java | 12 ++-- .../pageobjects/pages/user/RegisterPage.java | 12 ++-- .../tests/testdata/dataobjects/Address.java | 7 +++ .../testdata/dataobjects/CreditCard.java | 7 +++ .../tests/testdata/dataobjects/Product.java | 6 ++ .../tests/testdata/dataobjects/User.java | 6 ++ 15 files changed, 116 insertions(+), 88 deletions(-) diff --git a/config/browser.properties b/config/browser.properties index 7fd1f91e..5b185154 100644 --- a/config/browser.properties +++ b/config/browser.properties @@ -89,7 +89,7 @@ browserprofile.Chrome_1024x768.name = Chrome 1024x768 browserprofile.Chrome_1024x768.browser = chrome browserprofile.Chrome_1024x768.browserResolution = 1024x768 -browserprofile.Chrome_1024x768.arguments = -ignore-certificate-errors +browserprofile.Chrome_1024x768.arguments = -ignore-certificate-errors; --remote-allow-origins=* # Small Firefox browserprofile.Firefox_1024x768.name = Firefox 1024x768 diff --git a/src/test/java/posters/pageobjects/components/MiniCart.java b/src/test/java/posters/pageobjects/components/MiniCart.java index 2602b7c2..7c36cced 100644 --- a/src/test/java/posters/pageobjects/components/MiniCart.java +++ b/src/test/java/posters/pageobjects/components/MiniCart.java @@ -161,7 +161,7 @@ public void validateStructure() $(".icon-shopping-cart").shouldBe(visible); // validate total count - validateTotalCount((int) (calculateTotalCount())); + validateTotalCount(calculateTotalCount()); // validate title // TODO - fix consistency mini cart title diff --git a/src/test/java/posters/pageobjects/components/SaleBanner.java b/src/test/java/posters/pageobjects/components/SaleBanner.java index 4504df8e..bf72ce2d 100644 --- a/src/test/java/posters/pageobjects/components/SaleBanner.java +++ b/src/test/java/posters/pageobjects/components/SaleBanner.java @@ -21,13 +21,13 @@ public void isComponentAvailable() private void validateSaleBanner(String text) { - $$(".owl-stage").findBy(exactText(Neodymium.localizedText(text))).waitUntil(visible, 9000); + $$(".owl-stage").findBy(exactText(text)).waitUntil(visible, 9000); } @Step("validate sale banner") public void validateStructure() { - validateSaleBanner("header.sale.second"); - validateSaleBanner("header.sale.first"); + validateSaleBanner(Neodymium.localizedText("header.sale.second")); + validateSaleBanner(Neodymium.localizedText("header.sale.first")); } } \ No newline at end of file diff --git a/src/test/java/posters/pageobjects/components/TopNavigation.java b/src/test/java/posters/pageobjects/components/TopNavigation.java index 95e2a2b6..b481ea08 100644 --- a/src/test/java/posters/pageobjects/components/TopNavigation.java +++ b/src/test/java/posters/pageobjects/components/TopNavigation.java @@ -45,48 +45,48 @@ public CategoryPage clickSubCategory(String topCategory, String subCategory) @Step("validate top category name '{topCategory}'") public void validateNavComponent(String topCategory) { - $$(".has-dropdown").findBy(exactText(Neodymium.localizedText(topCategory))).shouldBe(visible); + $$(".has-dropdown").findBy(exactText(topCategory)).shouldBe(visible); } @Step("validate sub category name '{subCategory}'") public void validateSubNavComponent(String subCategory) { - $$(".navi ul.dropdown-menu li").findBy(exactText(Neodymium.localizedText(subCategory))).shouldBe(visible); + $$(".navi ul.dropdown-menu li").findBy(exactText(subCategory)).shouldBe(visible); } @Step("validate structure top navigation") public void validateStructure() { // validate navigation bar - validateNavComponent("header.topNavigation.1.title"); - validateNavComponent("header.topNavigation.2.title"); - validateNavComponent("header.topNavigation.3.title"); - validateNavComponent("header.topNavigation.4.title"); + validateNavComponent(Neodymium.localizedText("header.topNavigation.1.title")); + validateNavComponent(Neodymium.localizedText("header.topNavigation.2.title")); + validateNavComponent(Neodymium.localizedText("header.topNavigation.3.title")); + validateNavComponent(Neodymium.localizedText("header.topNavigation.4.title")); // validate sub navigation "World Of Nature" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.topNavigation.1.title"))).hover(); - validateSubNavComponent("header.topNavigation.1.subCategory.1"); - validateSubNavComponent("header.topNavigation.1.subCategory.2"); - validateSubNavComponent("header.topNavigation.1.subCategory.3"); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.1.subCategory.1")); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.1.subCategory.2")); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.1.subCategory.3")); // validate sub navigation "Dining" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.topNavigation.2.title"))).hover(); - validateSubNavComponent("header.topNavigation.2.subCategory.1"); - validateSubNavComponent("header.topNavigation.2.subCategory.2"); - validateSubNavComponent("header.topNavigation.2.subCategory.3"); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.2.subCategory.1")); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.2.subCategory.2")); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.2.subCategory.3")); // validate sub navigation "Transportation" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.topNavigation.3.title"))).hover(); - validateSubNavComponent("header.topNavigation.3.subCategory.1"); - validateSubNavComponent("header.topNavigation.3.subCategory.2"); - validateSubNavComponent("header.topNavigation.3.subCategory.3"); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.3.subCategory.1")); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.3.subCategory.2")); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.3.subCategory.3")); // validate sub navigation "Panoramas" $$(".has-dropdown").findBy(exactText(Neodymium.localizedText("header.topNavigation.4.title"))).hover(); - validateSubNavComponent("header.topNavigation.4.subCategory.1"); - validateSubNavComponent("header.topNavigation.4.subCategory.2"); - validateSubNavComponent("header.topNavigation.4.subCategory.3"); - validateSubNavComponent("header.topNavigation.4.subCategory.4"); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.4.subCategory.1")); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.4.subCategory.2")); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.4.subCategory.3")); + validateSubNavComponent(Neodymium.localizedText("header.topNavigation.4.subCategory.4")); // close sub navigation $("#globalNavigation").hover(); diff --git a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java index 7e7904d5..2a83d7e5 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/HomePage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/HomePage.java @@ -37,6 +37,7 @@ public HomePage isExpectedPage() @Step("validate poster slide") public void validatePosterSlide(String position, String headline) { + // TODO - improve slideNavigation.findBy(exactText(position)).click(); slideNavigation.findBy(exactText(position)).click(); slideNavigation.findBy(exactText(position)).click(); @@ -90,7 +91,8 @@ public void validateStructure() super.validateStructure(); // validate poster slide - validatePosterSlide(); + // TODO - fix consistent click + //validatePosterSlide(); // validate intro $("#intro").shouldHave(exactText(Neodymium.localizedText("HomePage.intro"))).shouldBe(visible); diff --git a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java index 03672800..3424c7c0 100644 --- a/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java +++ b/src/test/java/posters/pageobjects/pages/browsing/ProductDetailPage.java @@ -34,9 +34,9 @@ public ProductDetailPage isExpectedPage() /// ----- validate content product detail page ----- /// - public void validateSizeDropdown(String size) + private void validateSizeDropdown(String size) { - productSize.should(matchText(Neodymium.localizedText(size))).should(exist); + productSize.should(matchText(size)).should(exist); } @Step("validate size dropdown") @@ -46,13 +46,13 @@ public void validateSizeDropdown() if ($$("#selectSize option").size() > 1) { - validateSizeDropdown("ProductdetailPage.size.16x12"); - validateSizeDropdown("ProductdetailPage.size.32x24"); - validateSizeDropdown("ProductdetailPage.size.64x48"); + validateSizeDropdown(Neodymium.localizedText("ProductdetailPage.size.16x12")); + validateSizeDropdown(Neodymium.localizedText("ProductdetailPage.size.32x24")); + validateSizeDropdown(Neodymium.localizedText("ProductdetailPage.size.64x48")); } else { - validateSizeDropdown("ProductdetailPage.size.96x32"); + validateSizeDropdown(Neodymium.localizedText("ProductdetailPage.size.96x32")); } productSize.scrollTo().click(); diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java index 510c0e8d..f2894ec4 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestBillingAddressPage.java @@ -63,20 +63,20 @@ public void validateProcessWrap() private void validateFillInHeadlines(String headline) { - $$(".form-group").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + $$(".form-group").findBy(exactText(headline)).shouldBe(visible); } @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - validateFillInHeadlines("AddressPages.fillIn.headlines.fullName"); - validateFillInHeadlines("AddressPages.fillIn.headlines.company"); - validateFillInHeadlines("AddressPages.fillIn.headlines.address"); - validateFillInHeadlines("AddressPages.fillIn.headlines.city"); - validateFillInHeadlines("AddressPages.fillIn.headlines.state"); - validateFillInHeadlines("AddressPages.fillIn.headlines.zip"); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.fullName")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.company")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.address")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.city")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.state")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.zip")); // TODO - fix after issue is fixed - //validateFillInHeadlines("AddressPages.fillIn.headlines.country"); + //validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.country")); } @Step("validate fill-in form placeholder") diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java index f927eb2a..389574f3 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestPaymentPage.java @@ -73,15 +73,15 @@ public void validateProcessWrap() private void validateFillInHeadlines(String headline) { - $$(".form-group label").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + $$(".form-group label").findBy(exactText(headline)).shouldBe(visible); } @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - validateFillInHeadlines("GuestPaymentPage.fillIn.headlines.cardNumber"); - validateFillInHeadlines("GuestPaymentPage.fillIn.headlines.cardHolderName"); - validateFillInHeadlines("GuestPaymentPage.fillIn.headlines.expirationDate"); + validateFillInHeadlines(Neodymium.localizedText("GuestPaymentPage.fillIn.headlines.cardNumber")); + validateFillInHeadlines(Neodymium.localizedText("GuestPaymentPage.fillIn.headlines.cardHolderName")); + validateFillInHeadlines(Neodymium.localizedText("GuestPaymentPage.fillIn.headlines.expirationDate")); } @Step("validate fill-in form placeholder") @@ -95,7 +95,7 @@ public void validateFillInPlaceholder() private void validateMonthDropdown(String month) { - $$("#expirationDateMonth").findBy(matchText(Neodymium.localizedText(month))).shouldBe(visible); + $$("#expirationDateMonth").findBy(matchText(month)).shouldBe(visible); } @Step("validate month dropdown") @@ -105,23 +105,23 @@ public void validateMonthDropdown() expirationMonth.scrollTo().click(); // validate months - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.january"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.february"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.march"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.april"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.may"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.june"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.july"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.august"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.september"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.october"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.november"); - validateMonthDropdown("GuestPaymentPage.fillIn.expireMonth.december"); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.january")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.february")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.march")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.april")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.may")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.june")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.july")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.august")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.september")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.october")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.november")); + validateMonthDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireMonth.december")); } private void validateYearDropdown(String year) { - $$("#expirationDateYear").findBy(matchText(Neodymium.localizedText(year))).shouldBe(visible); + $$("#expirationDateYear").findBy(matchText(year)).shouldBe(visible); } @Step("validate year dropdown") @@ -131,17 +131,17 @@ public void validateYearDropdown() expirationYear.scrollTo().click(); // validate years - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2023"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2024"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2025"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2026"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2027"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2028"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2029"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2030"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2031"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2032"); - validateYearDropdown("GuestPaymentPage.fillIn.expireYear.2033"); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2023")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2024")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2025")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2026")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2027")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2028")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2029")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2030")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2031")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2032")); + validateYearDropdown(Neodymium.localizedText("GuestPaymentPage.fillIn.expireYear.2033")); } @Step("validate required string") diff --git a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java index 102ee426..25983dee 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/GuestShippingAddressPage.java @@ -63,20 +63,20 @@ public void validateProcessWrap() private void validateFillInHeadlines(String headline) { - $$(".form-group").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + $$(".form-group").findBy(exactText(headline)).shouldBe(visible); } @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - validateFillInHeadlines("AddressPages.fillIn.headlines.fullName"); - validateFillInHeadlines("AddressPages.fillIn.headlines.company"); - validateFillInHeadlines("AddressPages.fillIn.headlines.address"); - validateFillInHeadlines("AddressPages.fillIn.headlines.city"); - validateFillInHeadlines("AddressPages.fillIn.headlines.state"); - validateFillInHeadlines("AddressPages.fillIn.headlines.zip"); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.fullName")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.company")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.address")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.city")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.state")); + validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.zip")); // TODO - fix after issue is fixed - //validateFillInHeadlines("AddressPages.fillIn.headlines.country"); + //validateFillInHeadlines(Neodymium.localizedText("AddressPages.fillIn.headlines.country")); } @Step("validate fill-in form placeholder") diff --git a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java index 08644776..e9a99c2c 100644 --- a/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java +++ b/src/test/java/posters/pageobjects/pages/checkout/PlaceOrderPage.java @@ -120,7 +120,7 @@ public void validateStructure() private void validateShippingAddressOverview(Address shippingAddress, String headline) { // validate headline - headlines.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + headlines.findBy(exactText(headline)).shouldBe(visible); // validate name String fullName = shippingAddress.getFirstName() + " " + shippingAddress.getLastName(); @@ -147,7 +147,7 @@ private void validateShippingAddressOverview(Address shippingAddress, String hea private void validateBillingAddressOverview(Address billingAddress, String headline) { // validate headline - headlines.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + headlines.findBy(exactText(headline)).shouldBe(visible); // validate name String fullName = billingAddress.getFirstName() + " " + billingAddress.getLastName(); @@ -174,7 +174,7 @@ private void validateBillingAddressOverview(Address billingAddress, String headl private void validatePaymentOverview(CreditCard creditCard, String headline) { // validate headline - headlines.findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + headlines.findBy(exactText(headline)).shouldBe(visible); // validate name paymentForm.find(".name").shouldHave(exactText(creditCard.getFullName())).shouldBe(visible); @@ -194,13 +194,13 @@ public void validateOrderOverview(Address shippingAddress, Address billingAddres title.shouldHave(exactText(Neodymium.localizedText("PlaceOrderPage.overview.title"))).shouldBe(visible); // validate shipping address - validateShippingAddressOverview(shippingAddress, "PlaceOrderPage.overview.headlines.shippingAddress"); + validateShippingAddressOverview(shippingAddress, Neodymium.localizedText("PlaceOrderPage.overview.headlines.shippingAddress")); // validate billing address - validateBillingAddressOverview(billingAddress, "PlaceOrderPage.overview.headlines.billingAddress"); + validateBillingAddressOverview(billingAddress, Neodymium.localizedText("PlaceOrderPage.overview.headlines.billingAddress")); // validate payment - validatePaymentOverview(creditCard, "PlaceOrderPage.overview.headlines.payment"); + validatePaymentOverview(creditCard, Neodymium.localizedText("PlaceOrderPage.overview.headlines.payment")); } /// ----- validate products ----- /// diff --git a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java index 021f397a..132e77cc 100644 --- a/src/test/java/posters/pageobjects/pages/user/RegisterPage.java +++ b/src/test/java/posters/pageobjects/pages/user/RegisterPage.java @@ -44,17 +44,17 @@ public RegisterPage isExpectedPage() private void validateFillInHeadlines(String headline) { - $$("#formRegister .form-group label").findBy(exactText(Neodymium.localizedText(headline))).shouldBe(visible); + $$("#formRegister .form-group label").findBy(exactText(headline)).shouldBe(visible); } @Step("validate fill-in form headlines") public void validateFillInHeadlines() { - validateFillInHeadlines("RegisterPage.headlines.firstName"); - validateFillInHeadlines("RegisterPage.headlines.lastName"); - validateFillInHeadlines("RegisterPage.headlines.email"); - validateFillInHeadlines("RegisterPage.headlines.password"); - validateFillInHeadlines("RegisterPage.headlines.passwordRepeat"); + validateFillInHeadlines(Neodymium.localizedText("RegisterPage.headlines.firstName")); + validateFillInHeadlines(Neodymium.localizedText("RegisterPage.headlines.lastName")); + validateFillInHeadlines(Neodymium.localizedText("RegisterPage.headlines.email")); + validateFillInHeadlines(Neodymium.localizedText("RegisterPage.headlines.password")); + validateFillInHeadlines(Neodymium.localizedText("RegisterPage.headlines.passwordRepeat")); } @Step("validate fill in form placeholder") diff --git a/src/test/java/posters/tests/testdata/dataobjects/Address.java b/src/test/java/posters/tests/testdata/dataobjects/Address.java index 9e5820b6..6407b7dd 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/Address.java +++ b/src/test/java/posters/tests/testdata/dataobjects/Address.java @@ -71,4 +71,11 @@ public String getCountry() { return country; } + + @Override + public String toString() + { + return "Address [firstName=" + firstName + ", lastName=" + lastName + ", company=" + company + ", street=" + street + ", city=" + city + ", state=" + + state + ", zip=" + zip + ", country=" + country + "]"; + } } \ No newline at end of file diff --git a/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java b/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java index 6d29d3ee..3d90106f 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java +++ b/src/test/java/posters/tests/testdata/dataobjects/CreditCard.java @@ -46,4 +46,11 @@ public String getExpDateYear() { return expDateYear; } + + @Override + public String toString() + { + return "CreditCard [fullName=" + fullName + ", cardNumber=" + cardNumber + ", crypticCardNumber=" + crypticCardNumber + ", expDateMonth=" + expDateMonth + + ", expDateYear=" + expDateYear + "]"; + } } diff --git a/src/test/java/posters/tests/testdata/dataobjects/Product.java b/src/test/java/posters/tests/testdata/dataobjects/Product.java index 1e0eb4dc..b4b1815f 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/Product.java +++ b/src/test/java/posters/tests/testdata/dataobjects/Product.java @@ -61,4 +61,10 @@ public double getTotalPrice() { return amount * getUnitPriceDouble(); } + + @Override + public String toString() + { + return "Product [name=" + name + ", unitPrice=" + unitPrice + ", style=" + style + ", size=" + size + ", amount=" + amount + "]"; + } } diff --git a/src/test/java/posters/tests/testdata/dataobjects/User.java b/src/test/java/posters/tests/testdata/dataobjects/User.java index 0ee63983..bd99c658 100644 --- a/src/test/java/posters/tests/testdata/dataobjects/User.java +++ b/src/test/java/posters/tests/testdata/dataobjects/User.java @@ -39,4 +39,10 @@ public String getPassword() { return password; } + + @Override + public String toString() + { + return "User [firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + ", password=" + password + "]"; + } }