diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 5ac5e60..d94a002 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -1,24 +1,24 @@ -name: CI -on: - push: - branches: [main] - pull_request: - branches: [main] -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 15 - uses: actions/setup-java@v3 - with: - java-version: 15 - distribution: 'adopt' - - uses: gradle/gradle-build-action@v2 - with: - arguments: build --scan - - name: Archive test report - uses: actions/upload-artifact@v3 - with: - name: Test report - path: build/reports/tests/test \ No newline at end of file +#name: CI +#on: +# push: +# branches: [main] +# pull_request: +# branches: [main] +#jobs: +# build: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# - name: Set up JDK 15 +# uses: actions/setup-java@v4 +# with: +# java-version: 15 +# distribution: 'adopt' +# - uses: gradle/gradle-build-action@v2 +# with: +# arguments: build --scan +# - name: Archive test report +# uses: actions/upload-artifact@v4 +# with: +# name: Test report +# path: build/reports/tests/test \ No newline at end of file diff --git a/src/test/java/pages/CartPage.java b/src/test/java/pages/CartPage.java index ac57987..05f8235 100644 --- a/src/test/java/pages/CartPage.java +++ b/src/test/java/pages/CartPage.java @@ -9,7 +9,7 @@ public class CartPage extends BasePage { - public CartPage(final WebDriver driver) { + public CartPage(WebDriver driver) { super(driver); } diff --git a/src/test/java/pages/CheckoutStepOnePage.java b/src/test/java/pages/CheckoutStepOnePage.java new file mode 100644 index 0000000..6c469c9 --- /dev/null +++ b/src/test/java/pages/CheckoutStepOnePage.java @@ -0,0 +1,62 @@ +package pages; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +import static constraints.TestConstraints.TEST_URL; + +public class CheckoutStepOnePage extends BasePage { + public CheckoutStepOnePage(WebDriver driver) { + super(driver); + + } + + private final By firstNameInput = By.id("first-name"); + private final By lastNameInput = By.id("last-name"); + private final By postalCodeInput = By.id("postal-code"); + private final By continueButton = By.id("continue"); + private final By cancelButton = By.id("cancel"); + + + /** + * Fill in first name, last name, and ZIP/postal code. + */ + public void fillCustomerInfo(String firstName, String lastName, String zipCode) { + driver.findElement(firstNameInput).clear(); + driver.findElement(firstNameInput).sendKeys(firstName); + + driver.findElement(lastNameInput).clear(); + driver.findElement(lastNameInput).sendKeys(lastName); + + driver.findElement(postalCodeInput).clear(); + driver.findElement(postalCodeInput).sendKeys(zipCode); + } + + /** + * Click “Continue” and verify navigation to step two. + */ + public void continueCheckout() { + driver.findElement(continueButton).click(); + String url = driver.getCurrentUrl(); + if (!url.equals(TEST_URL + "checkout-step-two.html")) { + throw new AssertionError( + "Expected to navigate to checkout-step-two.html but was: " + url + ); + } + } + + /** + * Click “Cancel” and verify navigation back to cart. + */ + + public void cancelCheckout() { + driver.findElement(cancelButton).click(); + String url = driver.getCurrentUrl(); + if (!url.equals(TEST_URL + "cart.html")) { + throw new AssertionError( + "Expected to navigate to cart.html but was: " + url + ); + } + } + +} diff --git a/src/test/java/pages/InventoryPage.java b/src/test/java/pages/InventoryPage.java index b293811..3d6fd69 100644 --- a/src/test/java/pages/InventoryPage.java +++ b/src/test/java/pages/InventoryPage.java @@ -57,7 +57,7 @@ public int getCartBadgeCount() { } - public InventoryPage(final WebDriver driver) { + public InventoryPage(WebDriver driver) { super(driver); } diff --git a/src/test/java/pages/LoginPage.java b/src/test/java/pages/LoginPage.java index acb9ad9..93898b6 100644 --- a/src/test/java/pages/LoginPage.java +++ b/src/test/java/pages/LoginPage.java @@ -15,7 +15,7 @@ public class LoginPage extends BasePage { @FindBy(id = "login-button") private WebElement loginButton; - public LoginPage(final WebDriver driver) { + public LoginPage(WebDriver driver) { super(driver); } diff --git a/src/test/java/pages/MenuPopUP.java b/src/test/java/pages/MenuPopUP.java index 372bf73..39df0f3 100644 --- a/src/test/java/pages/MenuPopUP.java +++ b/src/test/java/pages/MenuPopUP.java @@ -16,7 +16,7 @@ public class MenuPopUP extends BasePage { @FindBy(id = "logout_sidebar_link") private WebElement logoutLink; - public MenuPopUP(final WebDriver driver) { + public MenuPopUP(WebDriver driver) { super(driver); } diff --git a/src/test/java/steps/SauceDemoSteps.java b/src/test/java/steps/SauceDemoSteps.java index 81de48c..86e4565 100644 --- a/src/test/java/steps/SauceDemoSteps.java +++ b/src/test/java/steps/SauceDemoSteps.java @@ -8,10 +8,7 @@ import io.cucumber.java.en.When; import org.openqa.selenium.By; import org.openqa.selenium.support.PageFactory; -import pages.CartPage; -import pages.InventoryPage; -import pages.LoginPage; -import pages.MenuPopUP; +import pages.*; import java.util.List; import java.util.Map; @@ -24,12 +21,15 @@ public class SauceDemoSteps { private final MenuPopUP menuPopUP; private final CartPage sauceDemoCartPage; + private final CheckoutStepOnePage sauceDemoCheckoutStepOncePage; + public SauceDemoSteps() { sauceDemoLoginPage = PageFactory.initElements(driver, LoginPage.class); sauceDemoInventoryPage = PageFactory.initElements(driver, InventoryPage.class); menuPopUP = PageFactory.initElements(driver, MenuPopUP.class); - sauceDemoCartPage = PageFactory.initElements(driver,CartPage.class); + sauceDemoCartPage = PageFactory.initElements(driver, CartPage.class); + sauceDemoCheckoutStepOncePage = PageFactory.initElements(driver, CheckoutStepOnePage.class); } @Given("^I login with \"([^\"]*)\"$") @@ -77,6 +77,50 @@ public void i_logout_the_web() { menuPopUP.logout(); } + + @And("^I proceed to checkout") + public void i_proceed_checkout() { + driver.findElement(By.cssSelector("[data-test='checkout']")).click(); + } + + + @When("I fill checkout form with first name {string}, last name {string}, zip code {string}") + public void i_fill_checkout_form(String first, String last, String zip) { + sauceDemoCheckoutStepOncePage.fillCustomerInfo(first, last, zip); + } + + @And("I {string} the checkout process") + public void i_choose_action(String action) { + if (action.equalsIgnoreCase("continue")) { + sauceDemoCheckoutStepOncePage.continueCheckout(); + } else if (action.equalsIgnoreCase("cancel")) { + sauceDemoCheckoutStepOncePage.cancelCheckout(); + } else { + throw new IllegalArgumentException("Unknown action: " + action); + } + driver.quit(); + } + + @Given("I am on the checkout step one page") + public void i_am_on_checkout_step_one() { + + } + + @Given("I am on the checkout step two page") + public void i_am_on_checkout_step_two() { + + } + + @Given("I am on the inventory page") + public void i_am_on_inventory() { + + } + + @Given("I am on the cart page") + public void i_am_on_cart() { + + } + @When("I view the cart") public void i_view_the_Cart() { driver.findElement(By.cssSelector("span[data-test='shopping-cart-badge']")).click(); diff --git a/src/test/resources/Features/saucedemo_login.feature b/src/test/resources/Features/1_saucedemo_login.feature similarity index 89% rename from src/test/resources/Features/saucedemo_login.feature rename to src/test/resources/Features/1_saucedemo_login.feature index 412e4e5..89f29e9 100644 --- a/src/test/resources/Features/saucedemo_login.feature +++ b/src/test/resources/Features/1_saucedemo_login.feature @@ -3,8 +3,9 @@ Feature: UI - SauceDemoLogin Test Scenario Outline: User can login successfully with an account to see the PRODUCTS page then logout successfully to see the Login page Given I login with "" + Then I am on the inventory page Then The Product page display success with - When I logout the web + And I logout the web Examples: | username | product_item | diff --git a/src/test/resources/Features/saucedemo_cart.feature b/src/test/resources/Features/2_saucedemo_cart.feature similarity index 100% rename from src/test/resources/Features/saucedemo_cart.feature rename to src/test/resources/Features/2_saucedemo_cart.feature diff --git a/src/test/resources/Features/3_saucedemo_cart_checkout.feature b/src/test/resources/Features/3_saucedemo_cart_checkout.feature new file mode 100644 index 0000000..a2dc407 --- /dev/null +++ b/src/test/resources/Features/3_saucedemo_cart_checkout.feature @@ -0,0 +1,20 @@ +@ui @sauceDemoCartCheckout +Feature: UI - SauceDemoCartCheckout Test + + Scenario Outline: User can add any product for proceed to checkout step One and step Two + Given I login with "" + When I add the following products to the cart: + | name | price | + | Sauce Labs Backpack | $29.99 | + | Sauce Labs Bike Light | $9.99 | + Then I view the cart + And I proceed to checkout + Then the cart badge should show 2 + When I fill checkout form with first name "Jane", last name "Smith", zip code "54321" + And I "continue" the checkout process + + Examples: + | username | + | standard_user | + +# not stable for checking - need handle return page objects between cancel and continue