diff --git a/pom.xml b/pom.xml index 450d521..2d0c71d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,12 +10,12 @@ http://maven.apache.org jar Lippia-web-example-project - 3.1.2.2 - - + Lippia-web-example-project UTF-8 + @Smoke testng.xml diff --git a/src/main/java/com/crowdar/examples/pages/GoogleHomePage.java b/src/main/java/com/crowdar/examples/pages/GoogleHomePage.java deleted file mode 100644 index 3e46fab..0000000 --- a/src/main/java/com/crowdar/examples/pages/GoogleHomePage.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.crowdar.examples.pages; - -import org.openqa.selenium.By; -import org.openqa.selenium.remote.RemoteWebDriver; - -public class GoogleHomePage extends PageBaseGoogle { - - private final String INPUT_SEARCH_XPATH = "//input[@class='gLFyf gsfi']"; - private final String SEARCH_BUTTON_NAME = "btnK"; - - public GoogleHomePage(RemoteWebDriver driver) { - super(driver); - this.url = ""; //here you can define the custom paths For example:"/search" --> www.googe.com/search - } - - public void go() { - navigateToCompleteURL(); - } - - public void enterSearchCriteria(String text) { - completeField(By.xpath(INPUT_SEARCH_XPATH), text); - } - - public void clickSearchButton() { - clickElement(By.name(SEARCH_BUTTON_NAME)); - } - -} diff --git a/src/main/java/com/crowdar/examples/pages/GoogleSearchResultPage.java b/src/main/java/com/crowdar/examples/pages/GoogleSearchResultPage.java deleted file mode 100644 index df43593..0000000 --- a/src/main/java/com/crowdar/examples/pages/GoogleSearchResultPage.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.crowdar.examples.pages; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.RemoteWebDriver; - -public class GoogleSearchResultPage extends PageBaseGoogle { - - private WebElement stats() { - return getWebElement(By.id("rcnt")); - } - - public GoogleSearchResultPage(RemoteWebDriver driver) { - super(driver); - this.url = ""; //here you can define the custom paths For example:"/search" --> www.googe.com/search - } - - public String getStats() { - return stats().getText(); - } - -} diff --git a/src/main/java/com/crowdar/examples/pages/PageBaseGoogle.java b/src/main/java/com/crowdar/examples/pages/PageBaseGoogle.java deleted file mode 100644 index 347367a..0000000 --- a/src/main/java/com/crowdar/examples/pages/PageBaseGoogle.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.crowdar.examples.pages; - -import com.crowdar.core.pageObjects.PageBaseWeb; -import org.openqa.selenium.remote.RemoteWebDriver; - -public class PageBaseGoogle extends PageBaseWeb { - - public PageBaseGoogle(RemoteWebDriver driver) { - super(driver); - BASE_URL = "http://www.google.com.ar"; - } - - -} diff --git a/src/main/java/com/crowdar/examples/pages/PageBaseStore.java b/src/main/java/com/crowdar/examples/pages/PageBaseStore.java new file mode 100644 index 0000000..577c5b0 --- /dev/null +++ b/src/main/java/com/crowdar/examples/pages/PageBaseStore.java @@ -0,0 +1,15 @@ +package com.crowdar.examples.pages; + +import com.crowdar.core.pageObjects.PageBaseWeb; +import org.openqa.selenium.remote.RemoteWebDriver; + +@SuppressWarnings("deprecation") +public class PageBaseStore extends PageBaseWeb { + + public PageBaseStore(RemoteWebDriver driver) { + super(driver); + BASE_URL = "http://automationpractice.com"; + } + + +} diff --git a/src/main/java/com/crowdar/examples/pages/StoreHomePage.java b/src/main/java/com/crowdar/examples/pages/StoreHomePage.java new file mode 100644 index 0000000..e752bfa --- /dev/null +++ b/src/main/java/com/crowdar/examples/pages/StoreHomePage.java @@ -0,0 +1,20 @@ +package com.crowdar.examples.pages; + +import org.openqa.selenium.remote.RemoteWebDriver; + +public class StoreHomePage extends PageBaseStore { + + + @SuppressWarnings("deprecation") + public StoreHomePage(RemoteWebDriver driver) { + super(driver); + this.url = ""; + } + + @SuppressWarnings("deprecation") + public void go() { + navigateToCompleteURL(); + } + + +} diff --git a/src/main/java/com/crowdar/examples/pages/StoreLoginPage.java b/src/main/java/com/crowdar/examples/pages/StoreLoginPage.java new file mode 100644 index 0000000..f28b5c8 --- /dev/null +++ b/src/main/java/com/crowdar/examples/pages/StoreLoginPage.java @@ -0,0 +1,57 @@ +package com.crowdar.examples.pages; + +import org.openqa.selenium.By; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.Assert; + +public class StoreLoginPage extends PageBaseStore { + + private final String INPUT_EMAIL_ID = "email"; + private final String INPUT_PASSWORD_ID = "passwd"; + private final String MSG_LOGIN_FAIL = ".//li[contains(text(),'Authentication failed.')]"; + private final String ACCOUNT_INFO_MESSAGE = ".//p[@class='info-account']"; + + + public StoreLoginPage(RemoteWebDriver driver) { + super(driver); + this.url = ""; // here you can define the custom paths For example:"/search" --> + // www.googe.com/search + } + + @SuppressWarnings("deprecation") + public void completeLoginInfo(String type, String value) { + switch (type) { + case "email": { + completeField(By.id(INPUT_EMAIL_ID), value); + break; + } + case "password": { + completeField(By.id(INPUT_PASSWORD_ID), value); + break; + } + default: + break; + } + + } + + @SuppressWarnings("deprecation") + public void verifyResultLogin(String result) { + switch (result) { + case "login incorrecto": { + Assert.assertTrue(isElementVisible(By.xpath(MSG_LOGIN_FAIL))); + break; + } + case "login correcto": { + Assert.assertTrue(isElementVisible(By.xpath(ACCOUNT_INFO_MESSAGE))); + break; + } + default: + break; + } + + } + + + +} diff --git a/src/main/java/com/crowdar/examples/pages/StoreProductsPage.java b/src/main/java/com/crowdar/examples/pages/StoreProductsPage.java new file mode 100644 index 0000000..746e053 --- /dev/null +++ b/src/main/java/com/crowdar/examples/pages/StoreProductsPage.java @@ -0,0 +1,171 @@ +package com.crowdar.examples.pages; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.Assert; + +public class StoreProductsPage extends PageBaseStore { + // home + private final String BUTTON_SIGNIN_CSS_SELECTOR = "#header > div.nav > div > div > nav > div.header_user_info > a"; + // login + private final String BUTTON_SIGNIN_ID = "SubmitLogin"; + private final String ACCOUNT_INFO_MESSAGE = ".//p[@class='info-account']"; + // buy + private final String T_SHIRTS_BUTTON = "#my-account >div#page>div>#header>div>div>div>#block_top_menu>ul>li:nth-child(3)>a"; + private final String ADD_TO_CART = "div>#center_column>ul>li>div>div>div>a.button.ajax_add_to_cart_button.btn.btn-default"; + private final String T_SHIRTS_TITLE = ".//span[text()[contains(.,'T-shirts ')]]"; + private final String ADDED_MODAL_VISIBLE = ".//div[@id='layer_cart'][contains(@style,'display: block')]"; + private final String PROCEED_CHECKOUT_ADDED_BUTTON = "div#layer_cart>div.clearfix>div.layer_cart_cart>div.button-container>a"; + private final String SUMMARY_TITLE = ".//h1[@id='cart_title']"; + private final String PROCEED_CHECKOUT_SUMMARY_BUTTON = "div>#columns>div>#center_column>p>a"; + private final String ADDRESS_TITLE = ".//label[@for='id_address_delivery']"; + private final String PROCEED_CHECKOUT_ADDRESS_BUTTON = ".//button[@name='processAddress']"; + private final String SHIPPING_TITLE = ".//h1[text()= 'Shipping'][@class='page-heading']"; + private final String SHIPPING_AGREE_CHECKBOX = ".//label[@for= 'cgv']"; + private final String PROCEED_CHECKOUT_SHIPPING_BUTTON = ".//button[@name='processCarrier']"; + private final String PAY_BANK_WIRE_BUTTON = ".//a[@class= 'bankwire'][@title='Pay by bank wire']"; + private final String ORDER_SUMMARY_TITLE = ".//h1[normalize-space(text())='Order confirmation'][@class='page-heading']"; + private final String CONFIRM_ORDER_BUTTON = ".//span[normalize-space(text())='I confirm my order']/ancestor::button"; + private final String PAYMENT_TITLE = ".//span[text()[contains(.,'Your payment method')]]"; + private final String BANK_WIRE_TITLE = ".//span[text()[contains(.,' Bank-wire payment.')]]"; + + private int orderProceedWizard = 0; + private int orderSignIn = 0; + + @SuppressWarnings("deprecation") + public StoreProductsPage(RemoteWebDriver driver) { + super(driver); + this.url = ""; // here you can define the custom paths For example:"/search" --> + // www.googe.com/search + } + + + @SuppressWarnings("deprecation") + public void clickButton(String button) { + System.out.println("boton presionado: " + button); + switch (button) { + case ("Sign In"): { + if (this.orderSignIn == 0) { + this.orderSignIn++; + clickElement(By.cssSelector(BUTTON_SIGNIN_CSS_SELECTOR)); + } else if (this.orderSignIn == 1) { + clickElement(By.id(BUTTON_SIGNIN_ID)); + } + + break; + } + case ("T-Shirts"): { + clickElement(By.cssSelector(T_SHIRTS_BUTTON)); + break; + } + case ("Add to cart"): { + try { + Actions actions = new Actions(driver); // hover + WebElement addProduct = driver.findElement(By.xpath(".//div[@class='product-container']/ancestor::li")); + actions.moveToElement(addProduct).perform(); + System.out.println("HOVER producto"); + + WebElement addButton = driver.findElement(By.cssSelector(ADD_TO_CART)); + actions.moveToElement(addButton); + actions.click().build().perform(); + + System.out.println("CLICK: " + button); + } catch (Exception e) { + System.out.println("error: " + e.getMessage()); + } + + break; + } + case ("I agree to the terms"): { + clickElement(By.xpath(SHIPPING_AGREE_CHECKBOX)); + break; + } + case ("Pay by bank wire"): { + clickElement(By.xpath(PAY_BANK_WIRE_BUTTON)); + break; + } + case ("I confirm my order"): { + clickElement(By.xpath(CONFIRM_ORDER_BUTTON)); + break; + } + default: + break; + } + } + + @SuppressWarnings("deprecation") + public void clickProceedCheckoutButton() { + this.orderProceedWizard++; // suma a medida que se llama el metodo para pasar por todas las pantallas en + // orden + System.out.println("orden de flujo para wizard: " + this.orderProceedWizard); + switch (this.orderProceedWizard) { + case (1): { + clickElement(By.cssSelector(PROCEED_CHECKOUT_ADDED_BUTTON)); + break; + } + case (2): { + clickElement(By.cssSelector(PROCEED_CHECKOUT_SUMMARY_BUTTON)); + break; + } + case (3): { + clickElement(By.xpath(PROCEED_CHECKOUT_ADDRESS_BUTTON)); + break; + } + case (4): { + clickElement(By.xpath(PROCEED_CHECKOUT_SHIPPING_BUTTON)); + break; + } + default: + break; + } + } + + @SuppressWarnings("deprecation") + public void verifyPantalla(String pantalla) { + System.out.println("pantalla : " + pantalla); + switch (pantalla) { + case ("My Account"): { + Assert.assertTrue(isElementVisible(By.xpath(ACCOUNT_INFO_MESSAGE))); + break; + } + case ("T-Shirts"): { + + Assert.assertTrue(isElementVisible(By.xpath(T_SHIRTS_TITLE))); + break; + } + case ("Product Succesfully Added"): { + Assert.assertTrue(isElementVisible(By.xpath(ADDED_MODAL_VISIBLE))); + break; + } + case ("Summary"): { + Assert.assertTrue(isElementVisible(By.xpath(SUMMARY_TITLE))); + break; + } + case ("Address"): { + Assert.assertTrue(isElementVisible(By.xpath(ADDRESS_TITLE))); + break; + } + case ("Shipping"): { + Assert.assertTrue(isElementVisible(By.xpath(SHIPPING_TITLE))); + break; + } + case ("Payment"): { + Assert.assertTrue(isElementVisible(By.xpath(PAYMENT_TITLE))); + break; + } + case ("Bank-wire payment"): { + Assert.assertTrue(isElementVisible(By.xpath(BANK_WIRE_TITLE))); + break; + } + case ("Order confirmation"): { + Assert.assertTrue(isElementVisible(By.xpath(ORDER_SUMMARY_TITLE))); + break; + } + default: + break; + } + } + +} diff --git a/src/main/java/com/crowdar/examples/steps/GoogleSteps.java b/src/main/java/com/crowdar/examples/steps/GoogleSteps.java deleted file mode 100644 index 9fff4c3..0000000 --- a/src/main/java/com/crowdar/examples/steps/GoogleSteps.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.crowdar.examples.steps; - -import com.crowdar.core.Injector; -import com.crowdar.core.PageSteps; -import com.crowdar.examples.pages.GoogleHomePage; -import com.crowdar.examples.pages.GoogleSearchResultPage; -import io.cucumber.java.en.*; -import org.testng.Assert; - -public class GoogleSteps extends PageSteps { - - @Given("The client is in google page") - public void home() { - Injector._page(GoogleHomePage.class).go(); - } - - @When("The client search for word (.*)") - public void search(String criteria) { - Injector._page(GoogleHomePage.class).enterSearchCriteria(criteria); - Injector._page(GoogleHomePage.class).clickSearchButton(); - - } - - @Then("The client verify that results are shown properly") - public void statVerfication() { - Assert.assertTrue(!Injector._page(GoogleSearchResultPage.class).getStats().isEmpty()); - - } -} diff --git a/src/main/java/com/crowdar/examples/steps/StoreSteps.java b/src/main/java/com/crowdar/examples/steps/StoreSteps.java new file mode 100644 index 0000000..57189f3 --- /dev/null +++ b/src/main/java/com/crowdar/examples/steps/StoreSteps.java @@ -0,0 +1,63 @@ +package com.crowdar.examples.steps; + +import com.crowdar.core.Injector; +import com.crowdar.core.PageSteps; +import com.crowdar.examples.pages.StoreHomePage; +import com.crowdar.examples.pages.StoreLoginPage; +import com.crowdar.examples.pages.StoreProductsPage; +import io.cucumber.java.en.And; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.When; +import io.cucumber.java.en.Then; + +public class StoreSteps extends PageSteps { + + // From principal page to login + + @Given("El cliente se encuentra en la pantalla (.*)") + public void verifyIsInScreen(String screen) { + switch (screen) { + case "Home": { + Injector._page(StoreHomePage.class).go(); + break; + } + case "My Account": { + Injector._page(StoreProductsPage.class).verifyPantalla(screen); + break; + } + } + } + + @Then("El cliente puede ver mensaje de (.*)") + public void verifyResultLogin(String result) { + Injector._page(StoreLoginPage.class).verifyResultLogin(result); + } + + // From login page to account + @When("El cliente ingresa su (.*): (.*)") + public void inputLoginData(String type ,String email) { + Injector._page(StoreLoginPage.class).completeLoginInfo(type, email); + } + +// @And("El cliente ingresa su password: (.*)") +// public void inputPassword(String password) { +// Injector._page(StoreLoginPage.class).completeLoginInfo(password); +// } + + // From account page to t-shirt + @When("El cliente verifica que fue redireccionado a la pantalla (.*)") + public void getAccountPageStateToBuy(String screen) { + Injector._page(StoreProductsPage.class).verifyPantalla(screen); + } + + @And("El cliente clickea sobre el botón (.*)") + public void clickButton(String button) { + Injector._page(StoreProductsPage.class).clickButton(button); + } + + @And("El cliente clickea sobre Proceed to checkout") + public void clickProceedCheckout() { + Injector._page(StoreProductsPage.class).clickProceedCheckoutButton(); + } + +} diff --git a/src/test/resources/features/Buy.feature b/src/test/resources/features/Buy.feature new file mode 100644 index 0000000..c5d7ed4 --- /dev/null +++ b/src/test/resources/features/Buy.feature @@ -0,0 +1,39 @@ +Feature: + Como cliente quiero ingresar a la página y realizar una compra + +@Buy @Smoke +Scenario: El cliente realiza una compra + + Given El cliente se encuentra en la pantalla Home + When El cliente clickea sobre el botón Sign In + Then El cliente verifica que fue redireccionado a la pantalla Login + + When El cliente ingresa su email: gerquino@gmail.com + And El cliente ingresa su password: a4b3c2d1 + And El cliente clickea sobre el botón Sign In + Then El cliente verifica que fue redireccionado a la pantalla My Account + + When El cliente clickea sobre el botón T-Shirts + Then El cliente verifica que fue redireccionado a la pantalla T-Shirts + + When El cliente clickea sobre el botón Add to cart + Then El cliente verifica que fue redireccionado a la pantalla Product Succesfully Added + + When El cliente clickea sobre Proceed to checkout + And El cliente verifica que fue redireccionado a la pantalla Summary + And El cliente clickea sobre Proceed to checkout + And El cliente verifica que fue redireccionado a la pantalla Address + And El cliente clickea sobre Proceed to checkout + And El cliente verifica que fue redireccionado a la pantalla Shipping + And El cliente clickea sobre el botón I agree to the terms + And El cliente clickea sobre Proceed to checkout + And El cliente verifica que fue redireccionado a la pantalla Payment + And El cliente clickea sobre el botón Pay by bank wire + And El cliente verifica que fue redireccionado a la pantalla Bank-wire payment + And El cliente clickea sobre el botón I confirm my order + Then El cliente verifica que fue redireccionado a la pantalla Order confirmation + + + + + diff --git a/src/test/resources/features/Login.feature b/src/test/resources/features/Login.feature new file mode 100644 index 0000000..70fbb09 --- /dev/null +++ b/src/test/resources/features/Login.feature @@ -0,0 +1,19 @@ +Feature: + Como cliente quiero ingresar a la página y loguearme + +@Login @Smoke +Scenario Outline: El cliente inicia sesión + + Given El cliente se encuentra en la pantalla Home + When El cliente clickea sobre el botón Sign In + Then El cliente verifica que fue redireccionado a la pantalla Login + + When El cliente ingresa su email: + And El cliente ingresa su password: + And El cliente clickea sobre el botón Sign In + Then El cliente puede ver mensaje de + + Examples: + |email |password |resultado | + |error@error.com |abcd1234 |login incorrecto | + |gerquino@gmail.com |a4b3c2d1 |login correcto | \ No newline at end of file diff --git a/src/test/resources/features/googleSearch.feature b/src/test/resources/features/googleSearch.feature deleted file mode 100644 index f490395..0000000 --- a/src/test/resources/features/googleSearch.feature +++ /dev/null @@ -1,25 +0,0 @@ -Feature: As a potential client i need to search in google to find a web site - - @Smoke - Scenario: The client search by "crowdar" - Given The client is in google page - When The client search for word crowdar - Then The client verify that results are shown properly - - @Smoke - Scenario: The client search by "automation" - Given The client is in google page - When The client search for word automation - Then The client verify that results are shown properly - - @Smoke - Scenario: The client search by "docker" - Given The client is in google page - When The client search for word docker - Then The client verify that results are shown properly - - @Smoke - Scenario: The client search by "vagrant" - Given The client is in google page - When The client search for word vagrant - Then The client verify that results are shown properly \ No newline at end of file