├── .gitignore ├── build.gradle └── src └── test ├── java ├── pages │ ├── RegistrationPage.java │ └── components │ │ ├── CalendarComponent.java │ │ └── RegistrationResultsModal.java └── tests │ ├── RegistrationTests.java │ ├── RegistrationWithFakerTests.java │ ├── RegistrationWithPageObjectsTests.java │ ├── TestBase.java │ └── TestData.java └── resources └── img └── 1.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Properties files 14 | *.properties 15 | 16 | # Package Files # 17 | *.jar 18 | *.war 19 | *.nar 20 | *.ear 21 | *.zip 22 | *.tar.gz 23 | *.rar 24 | *.iml 25 | 26 | # Project gen files 27 | .idea 28 | .allure/ 29 | .gradle/ 30 | allure-results/ 31 | gradle/ 32 | build/ 33 | bin/ 34 | out/ 35 | logs/ 36 | target/ 37 | .classpath 38 | .project 39 | .settings/org.eclipse.buildship.core.prefs 40 | .vscode 41 | /gradlew 42 | /gradlew.bat -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' // Используем язык Java. Java-library легковестный вариант. 3 | } 4 | // Откуда зависимости цепляем, как правило, по дефолту mavenCentral() 5 | repositories { 6 | mavenCentral() 7 | } 8 | // Зависимости, какие библиотеки (фреймворк, тест-ранер) будем использовать. Искать в https://mvnrepository.com/repos/central 9 | dependencies { 10 | testImplementation ( 11 | "com.codeborne:selenide:6.16.0", // Селенид 12 | "com.github.javafaker:javafaker:0.15", // Генерация данный. baeldung.com/java-faker 13 | "org.junit.jupiter:junit-jupiter:5.9.3", // Junit5 14 | "org.slf4j:slf4j-simple:2.0.7") // Простой и понятный синтаксис логов. Больше информации выводит 15 | } 16 | 17 | tasks.withType(JavaCompile) { 18 | options.encoding = 'UTF-8' 19 | } 20 | 21 | test { 22 | useJUnitPlatform() // Говорим Gradle что будем использовать JUnit5 23 | } -------------------------------------------------------------------------------- /src/test/java/pages/RegistrationPage.java: -------------------------------------------------------------------------------- 1 | package pages; 2 | 3 | import com.codeborne.selenide.Selenide; 4 | import com.codeborne.selenide.SelenideElement; 5 | import pages.components.CalendarComponent; 6 | import pages.components.RegistrationResultsModal; 7 | 8 | import static com.codeborne.selenide.Condition.text; 9 | import static com.codeborne.selenide.Selectors.byText; 10 | import static com.codeborne.selenide.Selenide.$; 11 | import static com.codeborne.selenide.Selenide.open; 12 | 13 | public class RegistrationPage { 14 | private CalendarComponent calendarComponent = new CalendarComponent(); 15 | private RegistrationResultsModal registrationResultsModal = new RegistrationResultsModal(); 16 | 17 | private final String titleText = "Student Registration Form"; 18 | private SelenideElement firstNameInput = $("#firstName"), 19 | lastNameInput = $("#lastName"), 20 | emailInput = $("#userEmail"), 21 | genderInput = $("#genterWrapper"), 22 | userNumberInput = $("#userNumber"), 23 | dateOfBirthInput = $("#dateOfBirthInput"), 24 | subjectInput = $("#subjectsInput"), 25 | hobbiesInput = $("#hobbiesWrapper"), 26 | uploadPicInput = $("#uploadPicture"), 27 | currentAddressInput = $("#currentAddress"), 28 | stateClickInput = $("#state"), 29 | stateInput = $("#stateCity-wrapper"), 30 | cityClickInput = $("#city"), 31 | cityInput = $("#stateCity-wrapper"), 32 | submitInput = $("#submit"); 33 | 34 | public RegistrationPage openPage() { 35 | open("/automation-practice-form"); 36 | $(".practice-form-wrapper").shouldHave(text(titleText)); 37 | Selenide.executeJavaScript("$('#fixedban').remove()"); 38 | Selenide.executeJavaScript("$('footer').remove()"); 39 | return this; 40 | } 41 | 42 | public RegistrationPage setFirstName(String value) { 43 | firstNameInput.setValue(value); 44 | return this; 45 | } 46 | 47 | public RegistrationPage setLastName(String value) { 48 | lastNameInput.setValue(value); 49 | return this; 50 | } 51 | 52 | public RegistrationPage setEmail(String value) { 53 | emailInput.setValue(value); 54 | return this; 55 | } 56 | 57 | public RegistrationPage setGender(String value) { 58 | genderInput.$(byText(value)).click(); 59 | return this; 60 | } 61 | 62 | public RegistrationPage setUserNumber(String value) { 63 | userNumberInput.setValue(value); 64 | return this; 65 | } 66 | 67 | public RegistrationPage setBirthDate(String day, String month, String year) { 68 | dateOfBirthInput.click(); 69 | calendarComponent.setDate(day, month, year); 70 | return this; 71 | } 72 | 73 | public RegistrationPage setSubject(String value) { 74 | subjectInput.setValue(value).pressEnter(); 75 | return this; 76 | } 77 | 78 | public RegistrationPage setHobbies(String value) { 79 | hobbiesInput.$(byText(value)).click(); 80 | return this; 81 | } 82 | 83 | public RegistrationPage setUploadPic(String value) { 84 | uploadPicInput.uploadFromClasspath(value); 85 | return this; 86 | } 87 | 88 | public RegistrationPage setCurrentAddress(String value) { 89 | currentAddressInput.setValue(value); 90 | return this; 91 | } 92 | 93 | public RegistrationPage setState(String value) { 94 | stateClickInput.click(); 95 | stateInput.$(byText(value)).click(); 96 | return this; 97 | } 98 | 99 | public RegistrationPage setCity(String value) { 100 | cityClickInput.click(); 101 | cityInput.$(byText(value)).click(); 102 | return this; 103 | } 104 | 105 | public RegistrationPage setSubmit() { 106 | submitInput.click(); 107 | return this; 108 | } 109 | 110 | 111 | public RegistrationPage verifyResultsModalAppears() { 112 | registrationResultsModal.verifyModalAppears(); 113 | return this; 114 | } 115 | 116 | public RegistrationPage verifyResult(String key, String value) { 117 | registrationResultsModal.verifyResult(key, value); 118 | return this; 119 | } 120 | } 121 | 122 | -------------------------------------------------------------------------------- /src/test/java/pages/components/CalendarComponent.java: -------------------------------------------------------------------------------- 1 | package pages.components; 2 | 3 | import static com.codeborne.selenide.Selenide.$; 4 | 5 | public class CalendarComponent { 6 | public void setDate(String day, String month, String year) { 7 | $(".react-datepicker__month-select").selectOption(month); 8 | $(".react-datepicker__year-select").selectOption(year); 9 | $(".react-datepicker__day--0" + day + 10 | ":not(.react-datepicker__day--outside-month)").click(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/test/java/pages/components/RegistrationResultsModal.java: -------------------------------------------------------------------------------- 1 | package pages.components; 2 | 3 | import static com.codeborne.selenide.Condition.appear; 4 | import static com.codeborne.selenide.Condition.text; 5 | import static com.codeborne.selenide.Selectors.byText; 6 | import static com.codeborne.selenide.Selenide.$; 7 | 8 | public class RegistrationResultsModal { 9 | public void verifyModalAppears() { 10 | $(".modal-content").should(appear); 11 | $("#example-modal-sizes-title-lg").shouldHave(text("Thanks for submitting the form")); 12 | } 13 | 14 | public void verifyResult(String key, String value) { 15 | $(".table-responsive").$(byText(key)).parent().shouldHave(text(value)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/tests/RegistrationTests.java: -------------------------------------------------------------------------------- 1 | package tests; 2 | 3 | import com.codeborne.selenide.Configuration; 4 | import com.codeborne.selenide.Selenide; 5 | import org.junit.jupiter.api.BeforeAll; 6 | import org.junit.jupiter.api.Test; 7 | 8 | import static com.codeborne.selenide.Condition.*; 9 | import static com.codeborne.selenide.Selectors.byText; 10 | import static com.codeborne.selenide.Selenide.$; 11 | import static com.codeborne.selenide.Selenide.open; 12 | 13 | public class RegistrationTests { 14 | 15 | @BeforeAll 16 | static void beforeAll() { 17 | Configuration.baseUrl = "https://demoqa.com"; 18 | Configuration.browserSize = "1920x1080"; 19 | Configuration.pageLoadStrategy = "eager"; 20 | Configuration.holdBrowserOpen = true; 21 | } 22 | 23 | @Test 24 | void successfulRegistrationTest() { 25 | String firstName = "Sergey", 26 | lastName = "Konoplev", 27 | userEmail = "sergeyKonoplev@gmail.com", 28 | gender = "Male", 29 | userNumber = "9875036934", 30 | fullDateOfBirth = "08 May,1996", 31 | dayOfBirth = "08", 32 | monthOfBirth = "May", 33 | yearOfBirth = "1996", 34 | subjects = "Maths", 35 | hobbies = "Sports", 36 | picture = "img/1.png", 37 | verifyPicture = "1.png", 38 | currentAddress = "Russia", 39 | state = "NCR", 40 | city = "Delhi", 41 | stateAndCity = state + ' ' + city; 42 | 43 | open("/automation-practice-form"); 44 | $(".practice-form-wrapper").shouldHave(text("Student Registration Form")); 45 | Selenide.executeJavaScript("$('#fixedban').remove()"); 46 | Selenide.executeJavaScript("$('footer').remove()"); 47 | 48 | $("#firstName").setValue(firstName); 49 | $("#lastName").setValue(lastName); 50 | $("#userEmail").setValue(userEmail); 51 | $("#genterWrapper").$(byText(gender)).click(); 52 | $("#userNumber").setValue(userNumber); 53 | 54 | $("#dateOfBirthInput").click(); 55 | $(".react-datepicker__month-select").selectOption(monthOfBirth); 56 | $(".react-datepicker__year-select").selectOption(yearOfBirth); 57 | $(".react-datepicker__day--0" + dayOfBirth + ":not(.react-datepicker__day--outside-month)").click(); 58 | 59 | $("#subjectsInput").setValue(subjects).pressEnter(); 60 | $("#hobbiesWrapper").$(byText(hobbies)).click(); 61 | $("#uploadPicture").uploadFromClasspath(picture); 62 | $("#currentAddress").setValue(currentAddress); 63 | $("#state").click(); 64 | $("#stateCity-wrapper").$(byText("NCR")).click(); 65 | $("#city").click(); 66 | $("#stateCity-wrapper").$(byText("Delhi")).click(); 67 | $("#submit").click(); 68 | 69 | $(".modal-content").should(appear); 70 | $("#example-modal-sizes-title-lg").shouldHave(text("Thanks for submitting the form")); 71 | $(".table-responsive").shouldHave( 72 | text(firstName), text(lastName), text(userEmail), text(gender), 73 | text(userNumber), text(fullDateOfBirth), text(subjects), text(hobbies), 74 | text(verifyPicture), text(currentAddress), text(stateAndCity)); 75 | } 76 | } -------------------------------------------------------------------------------- /src/test/java/tests/RegistrationWithFakerTests.java: -------------------------------------------------------------------------------- 1 | package tests; 2 | 3 | import com.codeborne.selenide.Configuration; 4 | import com.codeborne.selenide.Selenide; 5 | import org.junit.jupiter.api.BeforeAll; 6 | import org.junit.jupiter.api.Test; 7 | 8 | import static com.codeborne.selenide.Condition.appear; 9 | import static com.codeborne.selenide.Condition.text; 10 | import static com.codeborne.selenide.Selectors.byText; 11 | import static com.codeborne.selenide.Selenide.$; 12 | import static com.codeborne.selenide.Selenide.open; 13 | 14 | public class RegistrationWithFakerTests { 15 | 16 | @BeforeAll 17 | static void beforeAll() { 18 | Configuration.baseUrl = "https://demoqa.com"; 19 | Configuration.browserSize = "1920x1080"; 20 | Configuration.pageLoadStrategy = "eager"; 21 | Configuration.holdBrowserOpen = true; 22 | } 23 | 24 | @Test 25 | void successfulRegistrationTest() { 26 | 27 | TestData data = new TestData(); 28 | 29 | open("/automation-practice-form"); 30 | $(".practice-form-wrapper").shouldHave(text("Student Registration Form")); 31 | Selenide.executeJavaScript("$('#fixedban').remove()"); 32 | Selenide.executeJavaScript("$('footer').remove()"); 33 | 34 | $("#firstName").setValue(data.firstNameData); 35 | $("#lastName").setValue(data.lastNameData); 36 | $("#userEmail").setValue(data.userEmailData); 37 | $("#genterWrapper").$(byText(data.genderData)).click(); 38 | $("#userNumber").setValue(data.userNumberData); 39 | 40 | $("#dateOfBirthInput").click(); 41 | $(".react-datepicker__month-select").selectOption(data.monthOfBirthData); 42 | $(".react-datepicker__year-select").selectOption(data.yearOfBirthData); 43 | $(".react-datepicker__day--0" + data.dayOfBirthData + ":not(.react-datepicker__day--outside-month)").click(); 44 | 45 | $("#subjectsInput").setValue(data.subjectsData).pressEnter(); 46 | $("#hobbiesWrapper").$(byText(data.hobbiesData)).click(); 47 | $("#uploadPicture").uploadFromClasspath(data.pictureData); 48 | $("#currentAddress").setValue(data.currentAddressData); 49 | $("#state").click(); 50 | $("#stateCity-wrapper").$(byText(data.stateData)).click(); 51 | $("#city").click(); 52 | $("#stateCity-wrapper").$(byText(data.cityData)).click(); 53 | $("#submit").click(); 54 | 55 | $(".modal-content").should(appear); 56 | $("#example-modal-sizes-title-lg").shouldHave(text("Thanks for submitting the form")); 57 | $(".table-responsive").shouldHave( 58 | text(data.firstNameData), text(data.lastNameData), text(data.userEmailData), text(data.genderData), 59 | text(data.userNumberData), text(data.fullDateOfBirthData), text(data.subjectsData), text(data.hobbiesData), 60 | text(data.verifyPictureData), text(data.currentAddressData), text(data.stateAndCityData)); 61 | } 62 | } -------------------------------------------------------------------------------- /src/test/java/tests/RegistrationWithPageObjectsTests.java: -------------------------------------------------------------------------------- 1 | package tests; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | public class RegistrationWithPageObjectsTests extends TestBase { 6 | 7 | @Test 8 | void successfulRegistrationTest() { 9 | 10 | TestData data = new TestData(); 11 | 12 | registrationPage.openPage() 13 | .setFirstName(data.firstNameData) 14 | .setLastName(data.lastNameData) 15 | .setEmail(data.userEmailData) 16 | .setGender(data.genderData) 17 | .setUserNumber(data.userNumberData) 18 | .setBirthDate(data.dayOfBirthData, data.monthOfBirthData, data.yearOfBirthData) 19 | .setSubject(data.subjectsData) 20 | .setHobbies(data.hobbiesData) 21 | .setUploadPic(data.pictureData) 22 | .setCurrentAddress(data.currentAddressData) 23 | .setState(data.stateData) 24 | .setCity(data.cityData) 25 | .setSubmit(); 26 | 27 | registrationPage.verifyResultsModalAppears() 28 | .verifyResult("Student Name", data.studentNameData) 29 | .verifyResult("Student Email", data.userEmailData) 30 | .verifyResult("Gender", data.genderData) 31 | .verifyResult("Mobile", data.userNumberData) 32 | .verifyResult("Date of Birth", data.fullDateOfBirthData) 33 | .verifyResult("Subjects", data.subjectsData) 34 | .verifyResult("Hobbies", data.hobbiesData) 35 | .verifyResult("Picture", data.verifyPictureData) 36 | .verifyResult("Address", data.currentAddressData) 37 | .verifyResult("State and City", data.stateAndCityData); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/test/java/tests/TestBase.java: -------------------------------------------------------------------------------- 1 | package tests; 2 | 3 | import com.codeborne.selenide.Configuration; 4 | import org.junit.jupiter.api.BeforeAll; 5 | import pages.RegistrationPage; 6 | 7 | public class TestBase { 8 | RegistrationPage registrationPage = new RegistrationPage(); 9 | 10 | @BeforeAll 11 | static void beforeAll() { 12 | Configuration.baseUrl = "https://demoqa.com"; 13 | Configuration.browserSize = "1920x1080"; 14 | Configuration.pageLoadStrategy = "eager"; 15 | Configuration.holdBrowserOpen = false; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/tests/TestData.java: -------------------------------------------------------------------------------- 1 | package tests; 2 | 3 | import com.github.javafaker.Faker; 4 | 5 | public class TestData { 6 | 7 | Faker faker = new Faker(); 8 | 9 | public String firstNameData = faker.name().firstName(), 10 | lastNameData = faker.name().lastName(), 11 | studentNameData = firstNameData + ' ' + lastNameData, 12 | userEmailData = faker.internet().emailAddress(), 13 | genderData = faker.options().option("Male", "Female", "Other"), 14 | userNumberData = faker.number().numberBetween(1000000000l, 9999999999l) + "", 15 | dayOfBirthData = String.format("%02d", faker.number().numberBetween(1, 28)), 16 | monthOfBirthData = faker.options().option("January", "February", "March", "April", 17 | "May", "June", "July", "August", "September", "October", "November", "December"), 18 | yearOfBirthData = faker.number().numberBetween(1900, 2022) + "", 19 | fullDateOfBirthData = dayOfBirthData + " " + monthOfBirthData + "," + yearOfBirthData, 20 | subjectsData = faker.options().option("Chemistry", "Computer Science", "Commerce", "Accounting", 21 | "Economics", "Social Studies", "Civics", "English", "Arts", "History", "Maths", "Phisics", "Biology", "Hindi"), 22 | hobbiesData = faker.options().option("Sports", "Reading", "Music"), 23 | pictureData = "img/1.png", 24 | verifyPictureData = "1.png", 25 | currentAddressData = faker.address().streetAddress(), 26 | stateData = faker.options().option("NCR", "Uttar Pradesh", "Haryana", "Rajasthan"), 27 | cityData = setCityData(stateData), 28 | stateAndCityData = stateData + ' ' + cityData; 29 | 30 | public String setCityData(String state1) { 31 | String city = new String(); 32 | switch (state1) { 33 | case "NCR": 34 | city = faker.options().option("Delhi", "Gurgaon", "Noida"); 35 | break; 36 | case "Uttar Pradesh": 37 | city = faker.options().option("Agra", "Lucknow", "Merrut"); 38 | break; 39 | case "Haryana": 40 | city = faker.options().option("Karnal", "Panipat"); 41 | break; 42 | case "Rajasthan": 43 | city = faker.options().option("Jaipur", "Jaiselmer"); 44 | break; 45 | default: 46 | } 47 | return city; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/test/resources/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbrownbear/web_automation_tests/1a78dd3279b5d37bd2371b6c54bbe004b5df3580/src/test/resources/img/1.png --------------------------------------------------------------------------------