From cad3399b17c521464072f33555f719952d673cd7 Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Wed, 21 Sep 2022 22:53:01 +0500 Subject: Solve TestCase1 --- .../java/com/mavlushechka/a1qa/models/Domain.java | 19 ++++++ .../java/com/mavlushechka/a1qa/models/Email.java | 4 ++ .../com/mavlushechka/a1qa/models/Interest.java | 18 ++++++ .../java/com/mavlushechka/a1qa/models/User.java | 4 ++ .../com/mavlushechka/a1qa/pages/FirstCardForm.java | 42 +++++++++++++ .../java/com/mavlushechka/a1qa/pages/GamePage.java | 38 ++++++++++++ .../java/com/mavlushechka/a1qa/pages/HomePage.java | 20 +++++++ .../mavlushechka/a1qa/pages/SecondCardForm.java | 25 ++++++++ src/main/resources/testData.json | 4 +- src/test/java/com/mavlushechka/a1qa/TestCase1.java | 68 ++++++++++++++++++++++ 10 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/mavlushechka/a1qa/models/Domain.java create mode 100644 src/main/java/com/mavlushechka/a1qa/models/Email.java create mode 100644 src/main/java/com/mavlushechka/a1qa/models/Interest.java create mode 100644 src/main/java/com/mavlushechka/a1qa/models/User.java create mode 100644 src/main/java/com/mavlushechka/a1qa/pages/FirstCardForm.java create mode 100644 src/main/java/com/mavlushechka/a1qa/pages/GamePage.java create mode 100644 src/main/java/com/mavlushechka/a1qa/pages/HomePage.java create mode 100644 src/main/java/com/mavlushechka/a1qa/pages/SecondCardForm.java create mode 100644 src/test/java/com/mavlushechka/a1qa/TestCase1.java diff --git a/src/main/java/com/mavlushechka/a1qa/models/Domain.java b/src/main/java/com/mavlushechka/a1qa/models/Domain.java new file mode 100644 index 0000000..d5310d4 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/models/Domain.java @@ -0,0 +1,19 @@ +package com.mavlushechka.a1qa.models; + +public enum Domain { + + ORG("org"), COUK("co.uk"), NET("net"), GOV("gov"), DE("de"), FR("fr"), NL("nl"), COM("com"), BE("be"), JPG("jpg"); + + private final String DOMAIN; + + + Domain(String domain) { + this.DOMAIN = domain; + } + + @Override + public String toString() { + return DOMAIN; + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/models/Email.java b/src/main/java/com/mavlushechka/a1qa/models/Email.java new file mode 100644 index 0000000..5e82ad0 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/models/Email.java @@ -0,0 +1,4 @@ +package com.mavlushechka.a1qa.models; + +public record Email(String username, String server, Domain domain) { +} diff --git a/src/main/java/com/mavlushechka/a1qa/models/Interest.java b/src/main/java/com/mavlushechka/a1qa/models/Interest.java new file mode 100644 index 0000000..8bb2d9a --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/models/Interest.java @@ -0,0 +1,18 @@ +package com.mavlushechka.a1qa.models; + +import com.mavlushechka.a1qa.elements.Button; +import com.mavlushechka.a1qa.utils.StringUtils; +import org.openqa.selenium.By; + +public enum Interest { + + BALLS(), CABLES(), CINNAMON(), CLOSETS(), COTTON(), DOUGH(), DRYWALL(), ENVELOPPES(), FAUCETS(), MULLETS(), POLO(), PONIES(), POSTITS(), PURPLE(), QUESTIONS(), SELECTALL(), SNAILS(), SQUARES(), TIRES(), UNSELECTALL(), WINDOWS(); + + public final Button checkbox; + + + Interest() { + checkbox = new Button(By.xpath("//label[contains(@class, 'checkbox__label') and contains(@for, 'interest_%s')]".formatted(toString().toLowerCase())), StringUtils.capitalizeFirstLetter(toString().toLowerCase()) + " checkbox"); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/models/User.java b/src/main/java/com/mavlushechka/a1qa/models/User.java new file mode 100644 index 0000000..22ab581 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/models/User.java @@ -0,0 +1,4 @@ +package com.mavlushechka.a1qa.models; + +public record User(Email email, String password) { +} diff --git a/src/main/java/com/mavlushechka/a1qa/pages/FirstCardForm.java b/src/main/java/com/mavlushechka/a1qa/pages/FirstCardForm.java new file mode 100644 index 0000000..df5608b --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/pages/FirstCardForm.java @@ -0,0 +1,42 @@ +package com.mavlushechka.a1qa.pages; + +import com.mavlushechka.a1qa.elements.Button; +import com.mavlushechka.a1qa.elements.Field; +import com.mavlushechka.a1qa.elements.Label; +import com.mavlushechka.a1qa.models.User; +import org.openqa.selenium.By; + +public class FirstCardForm extends BaseForm { + + private final Field passwordField = new Field(By.xpath("//*[contains(@class, 'login-form__field-row') and not(contains(@class, 'align'))]//input"), "Password"); + private final Field emailField = new Field(By.xpath("//*[contains(@class, 'login-form__field-row')]//*[contains(@class, 'align__cell')]//input"), "Email"); + private final Field emailServerField = new Field(By.xpath("//*[contains(@class, 'login-form__field-row')]//*[contains(@class, 'align__cell')]//input[contains(@placeholder, 'Domain')]"), "Domain"); + private final Button dropdownOpenerButton = new Button(By.xpath("//*[contains(@class, 'dropdown__opener')]"), "Dropdown opener"); + private final Button termsAndConditionsCheckbox = new Button(By.xpath("//*[contains(@class, 'checkbox')]"), "Terms and conditions checkbox"); + private final Button nextButton = new Button(By.xpath("//*[contains(@class, 'button-container__secondary')]//a[contains(@class, 'button--secondary') and not(contains(@class, 'u-right'))]"), "Next"); + + private final String dropdownListItemXpath = "//*[contains(@class, 'dropdown__list')]//*[contains(text(), '%s')]"; + + + public FirstCardForm() { + super(new Label(By.xpath("//*[contains(@class, 'login-form')]"), "First card"), "First card"); + } + + public void performAuthorization(User user) { + clearFields(); + passwordField.sendKeys(user.password(), true); + emailField.sendKeys(user.email().username()); + emailServerField.sendKeys(user.email().server()); + dropdownOpenerButton.click(); + new Button(By.xpath(dropdownListItemXpath.formatted(user.email().domain())), "Domain").click(); + termsAndConditionsCheckbox.click(); + nextButton.click(); + } + + private void clearFields() { + passwordField.clear(); + emailField.clear(); + emailServerField.clear(); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/pages/GamePage.java b/src/main/java/com/mavlushechka/a1qa/pages/GamePage.java new file mode 100644 index 0000000..740f634 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/pages/GamePage.java @@ -0,0 +1,38 @@ +package com.mavlushechka.a1qa.pages; + +import com.mavlushechka.a1qa.elements.Label; +import com.mavlushechka.a1qa.models.Interest; +import com.mavlushechka.a1qa.models.User; +import org.openqa.selenium.By; + +public class GamePage extends BaseForm { + + private final FirstCardForm firstCardForm = new FirstCardForm(); + private final SecondCardForm secondCardForm = new SecondCardForm(); + + + public GamePage() { + super(new Label(By.xpath("//*[@id='app']//*[contains(@class, 'game')]"), "Game view"), "Game"); + } + + public boolean isFirstCardFormOpened() { + return firstCardForm.isOpened(); + } + + public void performAuthorization(User user) { + firstCardForm.performAuthorization(user); + } + + public boolean isSecondCardOpened() { + return secondCardForm.isOpened(); + } + + public void select(Interest interest) { + secondCardForm.select(interest); + } + + public void clickDownloadImageButton() { + secondCardForm.clickDownloadImageButton(); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/pages/HomePage.java b/src/main/java/com/mavlushechka/a1qa/pages/HomePage.java new file mode 100644 index 0000000..ee52ba9 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/pages/HomePage.java @@ -0,0 +1,20 @@ +package com.mavlushechka.a1qa.pages; + +import com.mavlushechka.a1qa.elements.Button; +import com.mavlushechka.a1qa.elements.Label; +import org.openqa.selenium.By; + +public class HomePage extends BaseForm { + + private final Button nextPageButton = new Button(By.xpath("//a[contains(@class, 'start__link')]"), "Next page"); + + + public HomePage() { + super(new Label(By.xpath("//*[@id='app']//*[contains(@class, 'start')]"), "App container"), "Home"); + } + + public void clickNextPageButton() { + nextPageButton.click(); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/pages/SecondCardForm.java b/src/main/java/com/mavlushechka/a1qa/pages/SecondCardForm.java new file mode 100644 index 0000000..ea381cb --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/pages/SecondCardForm.java @@ -0,0 +1,25 @@ +package com.mavlushechka.a1qa.pages; + +import com.mavlushechka.a1qa.elements.Button; +import com.mavlushechka.a1qa.elements.Label; +import com.mavlushechka.a1qa.models.Interest; +import org.openqa.selenium.By; + +public class SecondCardForm extends BaseForm { + + private final Button downloadImageButton = new Button(By.xpath("//button[contains(@class, 'avatar-and-interests__avatar-upload-button')]"), "Download image"); + + + public SecondCardForm() { + super(new Label(By.xpath("//*[contains(@class, 'avatar-and-interests-page')]"), "Second card"), "Second card"); + } + + public void select(Interest interest) { + interest.checkbox.click(); + } + + public void clickDownloadImageButton() { + downloadImageButton.click(); + } + +} diff --git a/src/main/resources/testData.json b/src/main/resources/testData.json index 0e0dcd2..e6d034b 100644 --- a/src/main/resources/testData.json +++ b/src/main/resources/testData.json @@ -1,3 +1,5 @@ { - + "testCase1": { + "interestsToChoose": 3 + } } \ No newline at end of file diff --git a/src/test/java/com/mavlushechka/a1qa/TestCase1.java b/src/test/java/com/mavlushechka/a1qa/TestCase1.java new file mode 100644 index 0000000..e26ce84 --- /dev/null +++ b/src/test/java/com/mavlushechka/a1qa/TestCase1.java @@ -0,0 +1,68 @@ +package com.mavlushechka.a1qa; + +import com.mavlushechka.a1qa.models.Domain; +import com.mavlushechka.a1qa.models.Email; +import com.mavlushechka.a1qa.models.Interest; +import com.mavlushechka.a1qa.models.User; +import com.mavlushechka.a1qa.pages.GamePage; +import com.mavlushechka.a1qa.pages.HomePage; +import com.mavlushechka.a1qa.utils.IntegerUtils; +import com.mavlushechka.a1qa.utils.JSONParser; +import com.mavlushechka.a1qa.utils.LoggerUtils; +import com.mavlushechka.a1qa.utils.StringUtils; +import org.testng.Assert; +import org.testng.annotations.Test; + +public class TestCase1 extends BaseTest { + + @Test + public void test() { + HomePage homePage = new HomePage(); + Assert.assertTrue(homePage.isOpened(), "This is not the " + homePage.getName() + "."); + LoggerUtils.step("Click the link (in text 'Please click HERE to GO to the next page') to navigate the next page."); + homePage.clickNextPageButton(); + + GamePage gamePage = new GamePage(); + String randomUpperText = StringUtils.generateRandomText( + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.lettersLowerBound")), + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.lettersUpperBound")), + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.length")) + ).toUpperCase(); + User user = new User( + new Email( + StringUtils.generateRandomText( + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.lettersLowerBound")), + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.lettersUpperBound")), + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.length")) + ) + randomUpperText, + StringUtils.generateRandomText( + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.lettersLowerBound")), + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.lettersUpperBound")), + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.length")) + ), + Domain.values()[IntegerUtils.getRandomNumber(Integer.parseInt(JSONParser.parse("config", "integerUtils.randomNumberMin")), Domain.values().length)] + ), + StringUtils.generateRandomText( + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.lettersLowerBound")), + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.lettersUpperBound")), + Integer.parseInt(JSONParser.parse("config", "randomTextGenerator.length")) + ) + randomUpperText + IntegerUtils.getRandomNumber( + Integer.parseInt(JSONParser.parse("config", "integerUtils.randomNumberMin")), + Integer.parseInt(JSONParser.parse("config", "integerUtils.randomNumberMax")) + ) + ); + Assert.assertTrue(gamePage.isOpened(), "This is not the " + gamePage.getName() + "."); + Assert.assertTrue(gamePage.isFirstCardFormOpened(), "The first card is not opened."); + LoggerUtils.step("Input random valid password, email, accept the terms of use and click \"next\" button."); + gamePage.performAuthorization(user); + + Assert.assertTrue(gamePage.isSecondCardOpened(), "The second card is not opened."); + gamePage.select(Interest.UNSELECTALL); + LoggerUtils.step("Choose %d random interest, upload image, click \"Next\" button.".formatted(Integer.parseInt(JSONParser.parse("testData", "testCase1.interestsToChoose")))); + for (int i = 0; i < Integer.parseInt(JSONParser.parse("testData", "testCase1.interestsToChoose")); i++) { + gamePage.select(Interest.values()[IntegerUtils.getRandomNumber(Integer.parseInt(JSONParser.parse("config", "integerUtils.randomNumberMin")), Interest.values().length)]); + } + gamePage.clickDownloadImageButton(); + } + +} -- cgit v1.2.3