diff --git a/CucumberTests/src/test/java/stepdefs/FavoriteShopList.java b/CucumberTests/src/test/java/stepdefs/FavoriteShopList.java index fa94b68..6ec2cd7 100644 --- a/CucumberTests/src/test/java/stepdefs/FavoriteShopList.java +++ b/CucumberTests/src/test/java/stepdefs/FavoriteShopList.java @@ -3,22 +3,29 @@ package stepdefs; import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; public class FavoriteShopList { @Given("^the user has at least (\\d+) favorite shop$") public void the_user_has_at_least_favorite_shop(int arg1) throws Exception { } - @When("^the user clicks on favorite shops$") - public void the_user_clicks_on_favorite_shops() throws Exception { + @Then("^the profile page should open$") + public void the_profile_page_should_open() throws Exception { + WebElement profile_info_text = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector("table.table.table-hover"))); + assert(profile_info_text.isDisplayed()); } @Then("^he should see his favorite shops list$") - public void he_Should_see_his_favorite_shops_list() throws Exception { + public void he_should_see_his_favorite_shops_list() throws Exception { } @When("^he clicks on delete a favorite shop entry$") - public void he_clicks_on_delete_a_favorite_shop_enty() throws Exception { + public void he_clicks_on_delete_a_favorite_shop_entry() throws Exception { } @Then("^the favorite shop entry should be deleted$") diff --git a/CucumberTests/src/test/java/stepdefs/Preconditions.java b/CucumberTests/src/test/java/stepdefs/Preconditions.java index f9c22b1..37acde2 100644 --- a/CucumberTests/src/test/java/stepdefs/Preconditions.java +++ b/CucumberTests/src/test/java/stepdefs/Preconditions.java @@ -4,4 +4,5 @@ import org.openqa.selenium.WebDriver; public class Preconditions { public static WebDriver driver; + public static final int delaySeconds = 7; } diff --git a/CucumberTests/src/test/java/stepdefs/PriceAlarm.java b/CucumberTests/src/test/java/stepdefs/PriceAlarm.java index 83c332e..41696ca 100644 --- a/CucumberTests/src/test/java/stepdefs/PriceAlarm.java +++ b/CucumberTests/src/test/java/stepdefs/PriceAlarm.java @@ -4,6 +4,12 @@ import io.cucumber.java.PendingException; import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.util.List; public class PriceAlarm { @Given("^the user has at least (\\d+) price alarm set$") @@ -12,42 +18,43 @@ public class PriceAlarm { @When("^the user clicks on the profile icon$") public void the_user_clicks_on_the_profile_icon() throws Exception { - } - - @Then("^the profile details popup should open$") - public void the_profile_details_popup_should_open() throws Exception { - } - - @When("^the user clicks on price alarms$") - public void the_user_clicks_on_price_alarms() throws Exception { - } - - @Then("^the price alarm list should open$") - public void the_price_alarm_list_should_open() throws Exception { + WebElement profileButton = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'profile')]"))); + profileButton.click(); } @Then("^the price alarm list should contain at least (\\d+) entry$") public void the_price_alarm_list_should_contain_at_least_entry(int arg1) throws Exception { + WebElement alarmEntry = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector("table.table.table-hover tr:nth-child(2)"))); + + assert (alarmEntry != null); } - @Then("^the price alarm list should contain a maximum of (\\d+) entries per page$") - public void the_price_alarm_list_should_contain_a_maximum_of_entries_per_page(int arg1) throws Exception { - } + @Given("^the user is on the profile page$") + public void the_user_is_on_the_profile_page() throws Exception { + Preconditions.driver.get("https://www.betterzon.xyz/profile"); - @Given("^the user is on the price alarm list page$") - public void the_user_is_on_the_price_alarm_list_page() throws Exception { + WebElement profile_info_text = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector("table.table.table-user-information"))); + assert (profile_info_text.isDisplayed()); } @When("^the user clicks on the \"([^\"]*)\" button next to a price alarm$") public void the_user_clicks_on_the_button_next_to_a_price_alarm(String arg1) throws Exception { - } + if (arg1.equals("remove")) { + WebElement entry = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector("table.table.table-hover tr:nth-child(2)"))); - @Then("^a popup should open asking the user to confirm the removal$") - public void a_popup_should_open_asking_the_user_to_confirm_the_removal() throws Exception { - } + if (entry == null) { + throw new Exception("Too few price alarm entries found!"); + } - @When("^the user confirms the removal of the price alarm$") - public void the_user_confirms_the_removal_of_the_price_alarm() throws Exception { + WebElement btn = entry.findElement(By.cssSelector("img.delete[src='../assets/images/Delete_icon-icons.com_55931.png']")); + + btn.click(); + } else if (arg1.equals("edit")) { + } } @Then("^the price alarm should be removed from the database$") diff --git a/CucumberTests/src/test/java/stepdefs/SearchProduct.java b/CucumberTests/src/test/java/stepdefs/SearchProduct.java index 73ab146..07a404b 100644 --- a/CucumberTests/src/test/java/stepdefs/SearchProduct.java +++ b/CucumberTests/src/test/java/stepdefs/SearchProduct.java @@ -4,9 +4,7 @@ import io.cucumber.java.PendingException; import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; -import org.openqa.selenium.By; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; +import org.openqa.selenium.*; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; @@ -15,8 +13,8 @@ public class SearchProduct { public void the_user_is_on_the_landing_page() throws Exception { //throw new PendingException(); Preconditions.driver.get("https://betterzon.xyz"); - WebElement logo = (new WebDriverWait(Preconditions.driver, 10)) - .until(ExpectedConditions.elementToBeClickable(By.cssSelector(".navbar-brand"))); + WebElement logo = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector("a.navbar-brand"))); } @When("^the user enters the search term \"([^\"]*)\" and clicks search$") @@ -24,49 +22,99 @@ public class SearchProduct { WebElement searchField = Preconditions.driver.findElement(By.cssSelector(".ng-untouched.ng-pristine.ng-valid")); searchField.sendKeys(searchTerm); searchField.sendKeys(Keys.ENTER); - WebElement logo = (new WebDriverWait(Preconditions.driver, 10)) + WebElement logo = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) .until(ExpectedConditions.elementToBeClickable(By.cssSelector(".navbar-brand"))); } @Then("^the user should see the error page \"([^\"]*)\"$") public void the_user_should_see_the_error_page(String arg0) throws Exception { - WebElement noProdsFoundMsg = (new WebDriverWait(Preconditions.driver, 10)) - .until(ExpectedConditions.elementToBeClickable(By.cssSelector(".ng-star-inserted"))); - assert(noProdsFoundMsg.getText().contains("No Products found!")); + WebElement noProdsFoundMsg = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'No Products found!')]"))); + assert (noProdsFoundMsg.isDisplayed()); } @Given("^the user is not logged in$") public void the_user_is_not_logged_in() throws Exception { + try { + WebElement logoutButton = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'log out')]"))); + + logoutButton.click(); + } catch (TimeoutException e) { + + } } @Given("^the user is logged in$") public void the_user_is_logged_in() throws Exception { + try { + WebElement loginButton = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'sign in')]"))); + loginButton.click(); + + WebElement usernameField = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.id("username"))); + usernameField.sendKeys("Selenium"); + + WebElement passwordField = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.id("password"))); + passwordField.sendKeys("Selenium"); + + WebElement loginBtn = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.className("btn_signin"))); + loginBtn.click(); + + } catch (TimeoutException e) { + + } } @Then("^the user should see a list of products$") public void the_user_should_see_a_list_of_products() throws Exception { - WebElement product = (new WebDriverWait(Preconditions.driver, 10)) - .until(ExpectedConditions.elementToBeClickable(By.cssSelector(".productItem.ng-star-inserted"))); - assert(product.isDisplayed()); + WebElement product = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector(".row.p-2.bg-white.border.rounded"))); + assert (product.isDisplayed()); } @When("^the user clicks on the first product$") public void the_user_clicks_on_the_first_product() throws Exception { + WebElement productDetailsBtn = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector(".row.p-2.bg-white.border.rounded button.btn.btn-primary.btn-sm"))); + productDetailsBtn.click(); } @Then("^the user should see the product detail page$") public void the_user_should_see_the_product_detail_page() throws Exception { + WebElement productTitle = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.productTitle"))); + assert (productTitle.isDisplayed()); } @Then("^the set price alarm box should show \"([^\"]*)\"$") public void the_set_price_alarm_box_should_show(String arg0) throws Exception { + WebElement alarmBox = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.priceAlarm"))); + if (arg0.equals("Login to set a price alarm")) { + assert (alarmBox.getText().equals("Login to set a price alarm")); + } else { + assert (alarmBox.isDisplayed()); + } } @When("^the user sets a price alarm$") public void the_user_sets_a_price_alarm() throws Exception { + WebElement alarmBoxField = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.priceAlarm input"))); + alarmBoxField.sendKeys("12345"); + WebElement alarmBox = (new WebDriverWait(Preconditions.driver, Preconditions.delaySeconds)) + .until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.priceAlarm"))); + alarmBox.click(); + + assert (alarmBox.isDisplayed() && alarmBoxField.isDisplayed()); } @Then("^the user should receive an email confirming the price alarm$") public void the_user_should_receive_an_email_confirming_the_price_alarm() throws Exception { + assert (true); } } diff --git a/CucumberTests/src/test/resource/favoriteShopList.feature b/CucumberTests/src/test/resource/favoriteShopList.feature index 079e781..ca31dd9 100644 --- a/CucumberTests/src/test/resource/favoriteShopList.feature +++ b/CucumberTests/src/test/resource/favoriteShopList.feature @@ -5,8 +5,7 @@ Feature: Favorite Shop List And the user is logged in And the user has at least 1 favorite shop When the user clicks on the profile icon - Then the profile details popup should open - When the user clicks on favorite shops + Then the profile page should open Then he should see his favorite shops list Scenario: Remove Favorite Shop Entry @@ -14,7 +13,6 @@ Feature: Favorite Shop List And the user is logged in And the user has at least 1 favorite shop When the user clicks on the profile icon - Then the profile details popup should open - When the user clicks on favorite shops - And he clicks on delete a favorite shop entry + Then the profile page should open + When he clicks on delete a favorite shop entry Then the favorite shop entry should be deleted diff --git a/CucumberTests/src/test/resource/priceAlarms.feature b/CucumberTests/src/test/resource/priceAlarms.feature index 0550eef..11a742c 100644 --- a/CucumberTests/src/test/resource/priceAlarms.feature +++ b/CucumberTests/src/test/resource/priceAlarms.feature @@ -5,23 +5,22 @@ Feature: Price Alarms And the user is logged in And the user has at least 1 price alarm set When the user clicks on the profile icon - Then the profile details popup should open - When the user clicks on price alarms - Then the price alarm list should open + Then the profile page should open And the price alarm list should contain at least 1 entry - And the price alarm list should contain a maximum of 20 entries per page Scenario: Remove a price alarm - Given the user is on the price alarm list page + Given the user is on the landing page And the user is logged in + When the user clicks on the profile icon + Then the profile page should open When the user clicks on the "remove" button next to a price alarm - Then a popup should open asking the user to confirm the removal - When the user confirms the removal of the price alarm Then the price alarm should be removed from the database Scenario: Edit a price alarm - Given the user is on the price alarm list page + Given the user is on the landing page And the user is logged in + When the user clicks on the profile icon + Then the profile page should open When the user clicks on the "edit" button next to a price alarm Then a popup should open where the user can edit the alarm When the user clicks on the "save changes" button diff --git a/CucumberTests/src/test/resource/searchProduct.feature b/CucumberTests/src/test/resource/searchProduct.feature index e73bdc5..cd05362 100644 --- a/CucumberTests/src/test/resource/searchProduct.feature +++ b/CucumberTests/src/test/resource/searchProduct.feature @@ -12,7 +12,7 @@ Feature: Search a Product Then the user should see a list of products When the user clicks on the first product Then the user should see the product detail page - And the set price alarm box should show "Log in to continue" + And the set price alarm box should show "Login to set a price alarm" Scenario: User is logged in, searches for known product Given the user is on the landing page diff --git a/README.md b/README.md index f4c214e..d2e31ca 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Betterzon -Website: https://www.betterzon.xyz
-Blog: https://blog.betterzon.xyz
+Website: https://betterzon.p4ddy.com
+Blog: https://blog.betterzon.p4ddy.com
Wiki: https://github.com/Mueller-Patrick/Betterzon/wiki # Code Quality @@ -8,5 +8,5 @@ Wiki: https://github.com/Mueller-Patrick/Betterzon/wiki [![Code Coverage](https://img.shields.io/badge/coverage-81%25-green)](https://ci.betterzon.xyz) # Project Status -[![Website Status](https://img.shields.io/website?label=www.betterzon.xyz&style=for-the-badge&url=https%3A%2F%2Fwww.betterzon.xyz)](https://www.betterzon.xyz) -[![Blog Status](https://img.shields.io/website?label=blog.betterzon.xyz&style=for-the-badge&url=https%3A%2F%2Fblog.betterzon.xyz)](https://blog.betterzon.xyz) +[![Website Status](https://img.shields.io/website?label=betterzon.p4ddy.com&style=for-the-badge&url=https%3A%2F%2Fbetterzon.p4ddy.com)](https://betterzon.p4ddy.com) +[![Blog Status](https://img.shields.io/website?label=blog.betterzon.p4ddy.com&style=for-the-badge&url=https%3A%2F%2Fblog.betterzon.p4ddy.com)](https://blog.betterzon.p4ddy.com) diff --git a/important_files/Betterzon_Blog_PDF_Export.zip b/important_files/Betterzon_Blog_PDF_Export.zip new file mode 100644 index 0000000..d79c36a Binary files /dev/null and b/important_files/Betterzon_Blog_PDF_Export.zip differ diff --git a/important_files/Betterzon_FP_Calculation.xlsx b/important_files/Betterzon_FP_Calculation.xlsx new file mode 100644 index 0000000..22b37da Binary files /dev/null and b/important_files/Betterzon_FP_Calculation.xlsx differ