Initial commit

This commit is contained in:
2021-01-19 14:03:37 +00:00
commit 807afea586
20 changed files with 482 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
# Project exclude paths
/target/

2
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,2 @@
# Default ignored files
/workspace.xml

22
.idea/codeStyles/Project.xml generated Normal file
View File

@@ -0,0 +1,22 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value>
<package name="java.util" alias="false" withSubpackages="false" />
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
<package name="io.ktor" alias="false" withSubpackages="true" />
</value>
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value>
</option>
</JetCodeStyleSettings>
</code_scheme>
</component>

13
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="Automation-Test-Framework" />
</profile>
</annotationProcessing>
</component>
</project>

14
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />

102
pom.xml Normal file
View File

@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Automation-Test-Framework</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<kotlin.version>1.4.0</kotlin.version>
<cucumber.version>6.8.1</cucumber.version>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version>
</dependency>
<!-- cucumber -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<!-- cucumber-junit -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<!-- jUnit -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>6.8.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>6.8.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,3 @@
public fun main(args: Array<String>){
print("Hello World!")
}

View File

@@ -0,0 +1,8 @@
package constants
enum class Drivers(
val driverProperty: String,
val driverFileName: String
){
Chrome("webdriver.chrome.driver", "chromedriver.exe")
}

View File

@@ -0,0 +1,7 @@
package constants
enum class Gender{
Male,
Female,
Other
}

View File

@@ -0,0 +1,3 @@
package constants
const val TIMEOUT_DURATION = 30L

View File

@@ -0,0 +1,63 @@
package pages
import org.openqa.selenium.WebDriver
import org.openqa.selenium.WebElement
import org.openqa.selenium.support.FindBy
import org.openqa.selenium.support.PageFactory
import utils.scrollTo
class FormPageFactory(
val driver: WebDriver
){
@FindBy(id = "firstName")
lateinit var firstName: WebElement
@FindBy(id = "lastName")
lateinit var lastName: WebElement
@FindBy(id = "userEmail")
lateinit var userEmail: WebElement
@FindBy(xpath = "//*[@id=\"genterWrapper\"]/div[2]/div[1]/label")
lateinit var male: WebElement
@FindBy(xpath = "//*[@id=\"genterWrapper\"]/div[2]/div[2]/label")
lateinit var female: WebElement
@FindBy(xpath = "//*[@id=\"genterWrapper\"]/div[2]/div[3]/label")
lateinit var other: WebElement
@FindBy(id = "userNumber")
lateinit var mobileNumber: WebElement
@FindBy(xpath = "//*[@id=\"submit\"]")
lateinit var submit: WebElement
init {
PageFactory.initElements(driver, this)
}
fun enterFirstName(first: String) = firstName.sendKeys(first)
fun enterLastName(last: String) = lastName.sendKeys(last)
fun enterEmailAddress(email: String) = userEmail.sendKeys(email)
fun selectGender(gender: String) = when(gender){
"Male"-> male.click()
"Female"-> female.click()
"Other"-> other.click()
else -> {}
}
fun enterMobileNumber(mobile: String) = mobileNumber.sendKeys(mobile)
fun submit(){
submit.apply {
scrollTo(driver)
click()
}
}
}

View File

@@ -0,0 +1,21 @@
package pages
import org.openqa.selenium.WebDriver
import org.openqa.selenium.WebElement
import org.openqa.selenium.support.FindBy
import org.openqa.selenium.support.PageFactory
class SubmittedFormFactory(
driver: WebDriver
) {
@FindBy(id = "example-modal-sizes-title-lg")
lateinit var tableHeader: WebElement
init {
PageFactory.initElements(driver, this)
}
fun checkTableIsDisplayed() = tableHeader.isDisplayed
}

View File

@@ -0,0 +1,77 @@
package stepDefinition
import constants.Drivers
import io.cucumber.java.After
import io.cucumber.java.Before
import io.cucumber.java.en.Given
import io.cucumber.java.en.Then
import io.cucumber.java.en.When
import org.openqa.selenium.WebDriver
import pages.FormPageFactory
import pages.SubmittedFormFactory
import stepDefinition.baseSteps.Driver
import stepDefinition.baseSteps.DriverSteps
import java.lang.AssertionError
class PracticeFormPageSteps: DriverSteps() {
lateinit var webDriver: WebDriver
lateinit var formPageFactory: FormPageFactory
lateinit var submittedFormFactory: SubmittedFormFactory
@Before
fun setup(){
webDriver = createWebDriver(Drivers.Chrome)
formPageFactory = FormPageFactory(webDriver)
submittedFormFactory = SubmittedFormFactory(webDriver)
}
@After
fun tearDown(){
webDriver.finish()
}
@Given("user is on practice form")
fun user_is_on_practice_form() {
webDriver.launchUrl("https://demoqa.com/automation-practice-form")
}
@When("user enters first name {string} and last name {string}")
fun user_enters_first_name_and_last_name(firstName: String?, lastName: String?) {
formPageFactory.apply {
firstName?.let { enterFirstName(it) }
lastName?.let { enterLastName(it) }
}
}
@When("user selects gender {string}")
fun user_selects_gender(gender: String?) {
gender?.let { formPageFactory.selectGender(gender) }
}
@When("user enters email address {string}")
fun user_enters_email_address(email: String?) {
email?.let { formPageFactory.enterEmailAddress(it) }
}
@When("user enters mobile number {string}")
fun user_enters_mobile_number(mobile: String?) {
mobile?.let { formPageFactory.enterMobileNumber(it) }
}
@When("user clicks submit button")
fun user_clicks_submit_button() {
formPageFactory.submit()
}
@Then("pop up is displayed")
fun pop_up_is_displayed() {
if(!submittedFormFactory.checkTableIsDisplayed()){
throw AssertionError("Popup not displayed")
}
}
}

View File

@@ -0,0 +1,11 @@
package stepDefinition
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber::class)
@CucumberOptions(features = ["src/test/resources/features"],
glue = ["stepDefinition"],
plugin = ["pretty", "json:target/reports/cucumber.json"])
class TestRunner

View File

@@ -0,0 +1,20 @@
package stepDefinition.baseSteps
import constants.Drivers
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import java.io.IOException
abstract class Driver{
fun createChromeDriver(driver: Drivers): WebDriver {
val path = System.getProperty("user.dir")
System.setProperty(driver.driverProperty, "$path\\src\\test\\resources\\drivers\\${driver.driverFileName}")
return when(driver){
Drivers.Chrome -> ChromeDriver()
else -> { throw IOException("No web driver available")}
}
}
}

View File

@@ -0,0 +1,30 @@
package stepDefinition.baseSteps
import constants.Drivers
import constants.TIMEOUT_DURATION
import org.openqa.selenium.WebDriver
import java.util.concurrent.TimeUnit
abstract class DriverSteps : Driver(){
fun createWebDriver(driver: Drivers): WebDriver{
return createChromeDriver(driver).apply {
manage().timeouts().let { tO ->
tO.implicitlyWait(TIMEOUT_DURATION, TimeUnit.SECONDS)
tO.pageLoadTimeout(TIMEOUT_DURATION, TimeUnit.SECONDS)
}
}
}
fun WebDriver.launchUrl(url: String){
navigate().to(url)
}
fun WebDriver.finish(){
close()
quit()
}
}

View File

@@ -0,0 +1,14 @@
package utils
import org.openqa.selenium.WebDriver
import org.openqa.selenium.WebElement
import org.openqa.selenium.interactions.Actions
/*
* Scroll down to a web element
*/
fun WebElement.scrollTo(driver: WebDriver){
val actions = Actions(driver)
actions.moveToElement(this)
actions.perform()
}

Binary file not shown.

View File

@@ -0,0 +1,68 @@
Feature: Feature to test the practice form
@SmokeTest @RegressionTest
Scenario Outline: Check user can successfully submit a form with minimum mandatory valid credentials
Given user is on practice form
When user enters first name "<firstName>" and last name "<lastName>"
And user selects gender "<gender>"
And user enters email address "<emailAddress>"
And user enters mobile number "<mobileNumber>"
And user clicks submit button
Then pop up is displayed
Examples:
| firstName | lastName | gender | emailAddress | mobileNumber |
| Harvey | Specter | Male | harvey.specter@pearson-specter.com | 2125096995 |
| Rachel | Zane | Female | rachel.zane@pearson-specter.com | 2125096965 |
@SmokeTest @RegressionTest
Scenario Outline: Check user can successfully submit a form with all the minimum valid credentials and 1 letter names
Given user is on practice form
When user enters first name "<firstName>" and last name "<lastName>"
And user selects gender "<gender>"
And user enters email address "<emailAddress>"
And user enters mobile number "<mobileNumber>"
And user clicks submit button
Then pop up is displayed
Examples:
| firstName | lastName | gender | emailAddress | mobileNumber |
| i | j | Male | j@domain.com | 2125096995 |
| 2 | y | Female | y@domain.com | 2125096965 |
@RegressionTest
Scenario Outline: Check user cannot submit a form with if fields are empty
Given user is on practice form
When user enters first name "<firstName>" and last name "<lastName>"
And user selects gender "<gender>"
And user enters email address "<emailAddress>"
And user enters mobile number "<mobileNumber>"
And user clicks submit button
Then no pop up is displayed
Examples:
| firstName | lastName | gender | emailAddress | mobileNumber |
| | Lastname | Male | name@domain.com | 2125096995 |
| FirstName | | Female | name@domain.com | 2125096965 |
| FirstName | Lastname | | name@domain.com | 2125096965 |
| FirstName | Lastname | Other | | 2125096965 |
| FirstName | Lastname | Other | name@domain.com | |
@RegressionTest
Scenario Outline: Check email address shows error if incorrect email string
Given user is on practice form
When user enters email address "<emailAddress>"
Then email input is displaying an error
Examples:
| emailAddress |
| namedomain.com |
| name@domain.c |
| @domain.com |