diff --git a/pom.xml b/pom.xml index 54175bd..c1a0116 100644 --- a/pom.xml +++ b/pom.xml @@ -16,10 +16,37 @@ - junit - junit - 3.8.1 + org.seleniumhq.selenium + selenium-java + 4.10.0 + + + + io.github.bonigarcia + webdrivermanager + 5.4.0 + + + + org.testng + testng + 7.8.0 test + + io.cucumber + cucumber-java + 7.15.0 + + + io.cucumber + cucumber-testng + 7.15.0 + + + io.cucumber + cucumber-picocontainer + 7.15.0 + diff --git a/src/main/java/wait_service/WaitService.java b/src/main/java/wait_service/WaitService.java new file mode 100644 index 0000000..64f8c00 --- /dev/null +++ b/src/main/java/wait_service/WaitService.java @@ -0,0 +1,23 @@ +package wait_service; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.time.Duration; + +public class WaitService { + + private WebDriverWait wait; + + public WaitService(WebDriver driver){ + this.wait = new WebDriverWait(driver, Duration.ofSeconds(10)); + } + + public WebElement waitForVisibilityByLocator(By lo){ + return wait.until(ExpectedConditions.visibilityOfElementLocated(lo)); + } + +} diff --git a/src/main/java/web_driver/WebDriverService.java b/src/main/java/web_driver/WebDriverService.java new file mode 100644 index 0000000..f3decef --- /dev/null +++ b/src/main/java/web_driver/WebDriverService.java @@ -0,0 +1,29 @@ +package web_driver; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.edge.EdgeDriver; +import org.openqa.selenium.edge.EdgeOptions; + +public class WebDriverService { + + private WebDriver driver; + + public WebDriverService() { + WebDriverManager.edgedriver().setup(); + EdgeOptions edgeOptions = new EdgeOptions(); + + edgeOptions.setHeadless(true); + edgeOptions.addArguments("--disable-gpu"); + edgeOptions.addArguments("--window-size=1920,1200"); + edgeOptions.addArguments("--ignore-certificate-errors"); + edgeOptions.addArguments("--silent"); + edgeOptions.addArguments("--start-maximized"); + driver = new EdgeDriver(edgeOptions); + } + + public WebDriver getDriver() { + return driver; + } + +} \ No newline at end of file diff --git a/src/test/java/RunCucumberTest.java b/src/test/java/RunCucumberTest.java new file mode 100644 index 0000000..e5b6ea8 --- /dev/null +++ b/src/test/java/RunCucumberTest.java @@ -0,0 +1,17 @@ +import io.cucumber.testng.AbstractTestNGCucumberTests; +import io.cucumber.testng.CucumberOptions; +import org.testng.annotations.DataProvider; + +@CucumberOptions( + features = {"src/test/resources/features"}, + plugin = {"json:target/cucumber.json", "html:target/site/cucumber-pretty"}, + glue = "step" +) +public class RunCucumberTest extends AbstractTestNGCucumberTests { + + @Override + @DataProvider + public Object[][] scenarios() { + return super.scenarios(); + } +} diff --git a/src/test/java/page/AddProjectPage.java b/src/test/java/page/AddProjectPage.java new file mode 100644 index 0000000..7d923d7 --- /dev/null +++ b/src/test/java/page/AddProjectPage.java @@ -0,0 +1,36 @@ +package page; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import utils.BasePage; + +public class AddProjectPage extends BasePage { + + private By nameInputLocator = By.id("name"); + private By accessBtnLocator = By.id("projects-tabs-access"); + private By accessDropdownBtnLocator = By.className("dropdown-icon-black"); + private By designerDropdownLinkLocator = By.xpath("//a[contains(text(), 'Designer')]"); + private By acceptBtnLocator = By.id("accept"); + + public AddProjectPage(WebDriver driver) { + super(driver); + } + + public WebElement getNameInput() { + return service.waitForVisibilityByLocator(nameInputLocator); + } + public WebElement getAccessBtn() { + return service.waitForVisibilityByLocator(accessBtnLocator); + } + public WebElement getAccessDropdownBtn() { + return service.waitForVisibilityByLocator(accessDropdownBtnLocator); + } + public WebElement getDesignerDropdownMenuLink(){ + return service.waitForVisibilityByLocator(designerDropdownLinkLocator); + } + public WebElement getAcceptBtn() { + return service.waitForVisibilityByLocator(acceptBtnLocator); + } + +} diff --git a/src/test/java/page/DashboardPage.java b/src/test/java/page/DashboardPage.java new file mode 100644 index 0000000..7859a01 --- /dev/null +++ b/src/test/java/page/DashboardPage.java @@ -0,0 +1,19 @@ +package page; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import utils.BasePage; + +public class DashboardPage extends BasePage { + + private By addProjectBtnLocator = By.id("sidebar-projects-add"); + + public DashboardPage(WebDriver driver) { + super(driver); + } + + public WebElement getAddProjectBtn() { + return service.waitForVisibilityByLocator(addProjectBtnLocator); + } +} diff --git a/src/test/java/page/LoginPage.java b/src/test/java/page/LoginPage.java new file mode 100644 index 0000000..d34747e --- /dev/null +++ b/src/test/java/page/LoginPage.java @@ -0,0 +1,27 @@ +package page; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import utils.BasePage; + +public class LoginPage extends BasePage { + + private By emailInputLocator = By.id("name"); + private By pswInputLocator = By.id("password"); + private By loginBtn = By.id("button_primary"); + + public LoginPage(WebDriver driver) { + super(driver); + } + + public WebElement getEmailInput() { + return service.waitForVisibilityByLocator(emailInputLocator); + } + public WebElement getPassInput() { + return service.waitForVisibilityByLocator(pswInputLocator); + } + public WebElement getLoginButton() { + return service.waitForVisibilityByLocator(loginBtn); + } +} diff --git a/src/test/java/page/OverviewPage.java b/src/test/java/page/OverviewPage.java new file mode 100644 index 0000000..e40d39f --- /dev/null +++ b/src/test/java/page/OverviewPage.java @@ -0,0 +1,31 @@ +package page; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import utils.BasePage; + +public class OverviewPage extends BasePage { + + private By successBannerLocator = By.cssSelector(".message"); + private By deleteBtnLocator = By.xpath("//tr[@class = 'even hoverSensitive']/td[@class='action'][2]"); + private By checkboxLocator = By.xpath("//span[@class = 'dialog-confirm']/strong[contains(text(), 'Yes')]"); + private By confirmButtonLocator = By.xpath("//a[@data-testid = 'caseFieldsTabDeleteDialogButtonOk']"); + + public OverviewPage(WebDriver driver) { + super(driver); + } + + public Boolean isBannerOnPage() { + return isItemOnAPage(successBannerLocator); + } + public WebElement getDeleteBtn() { + return service.waitForVisibilityByLocator(deleteBtnLocator); + } + public WebElement getCheckbox() { + return service.waitForVisibilityByLocator(checkboxLocator); + } + public WebElement getConfirmButton() { + return service.waitForVisibilityByLocator(confirmButtonLocator); + } +} diff --git a/src/test/java/step/Hook.java b/src/test/java/step/Hook.java new file mode 100644 index 0000000..64aafda --- /dev/null +++ b/src/test/java/step/Hook.java @@ -0,0 +1,28 @@ +package step; + +import io.cucumber.java.After; +import io.cucumber.java.Before; +import utils.BaseCucumberStep; +import web_driver.WebDriverService; + +public class Hook extends BaseCucumberStep { + + private BaseCucumberStep baseCucumberStep; + + public Hook(BaseCucumberStep baseCucumberStep) { + this.baseCucumberStep = baseCucumberStep; + } + + @Before + public void setUp(){ + baseCucumberStep.driver = new WebDriverService().getDriver(); + } + + + @After + public void warUp(){ + if (baseCucumberStep.driver != null){ + baseCucumberStep.driver.close(); + } + } +} diff --git a/src/test/java/step/LoginStep.java b/src/test/java/step/LoginStep.java new file mode 100644 index 0000000..fb899a0 --- /dev/null +++ b/src/test/java/step/LoginStep.java @@ -0,0 +1,41 @@ +package step; + +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import org.openqa.selenium.WebDriver; +import org.testng.Assert; +import page.LoginPage; +import utils.BaseCucumberStep; + +public class LoginStep extends BaseCucumberStep{ + + private LoginPage loginPage; + @Given("driver is ready") + public void openDriver() { + driver.get("https://piogjheioghtor.testrail.io/index.php?/auth/login/LWZhMDA0NWExYzgyM2UyNWUzMDVjMjE3ZmRjNzU1ZWEzMjJkOTZmNWY1MWEwODk0MDNjZDJhN2E1NTQ2YTEzM2Y:"); + + } + + @Given("page is opened") + public void openPage() { + loginPage = new LoginPage(driver); + } + + @When("perform login with {string} email and {string} password") + public void performLogin(String email, String pass) { + loginPage.getEmailInput().sendKeys(email); + loginPage.getPassInput().sendKeys(pass); + loginPage.getLoginButton().click(); + } + + @Then("Dashboard page is opened") + public void isDashboardPageOpened() { + Assert.assertEquals(driver.getCurrentUrl(), "https://piogjheioghtor.testrail.io/index.php?/dashboard"); + } + + @Then("login page is opened") + public void loginPageIsOpened() { + Assert.assertEquals(driver.getCurrentUrl(), "https://piogjheioghtor.testrail.io/index.php?/auth/login/LWZhMDA0NWExYzgyM2UyNWUzMDVjMjE3ZmRjNzU1ZWEzMjJkOTZmNWY1MWEwODk0MDNjZDJhN2E1NTQ2YTEzM2Y:"); + } +} diff --git a/src/test/java/step/Project.java b/src/test/java/step/Project.java new file mode 100644 index 0000000..0b9d06a --- /dev/null +++ b/src/test/java/step/Project.java @@ -0,0 +1,49 @@ +package step; + +import com.beust.ah.A; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import org.testng.Assert; +import page.AddProjectPage; +import page.DashboardPage; +import page.OverviewPage; +import utils.BaseCucumberStep; + +public class Project extends BaseCucumberStep { + + private DashboardPage dashboardPage; + private AddProjectPage addProjectPage; + private OverviewPage overviewPage; + + + + @Given("pages opened") + public void openPages() { + dashboardPage = new DashboardPage(driver); + addProjectPage = new AddProjectPage(driver); + overviewPage = new OverviewPage(driver); + } + + @When("Delete project") + public void deleteProject() { + overviewPage.getDeleteBtn().click(); + overviewPage.getCheckbox().click(); + overviewPage.getConfirmButton().click(); + } + @When("Create project") + public void createProject() { + dashboardPage.getAddProjectBtn().click(); + + addProjectPage.getNameInput().sendKeys("test"); + addProjectPage.getAccessBtn().click(); + addProjectPage.getAccessDropdownBtn().click(); + addProjectPage.getDesignerDropdownMenuLink().click(); + addProjectPage.getAcceptBtn().click(); + } + + @Then("Banner on a page") + public void isBannerOnPage() { + Assert.assertTrue(overviewPage.isBannerOnPage()); + } +} diff --git a/src/test/java/utils/BaseCucumberStep.java b/src/test/java/utils/BaseCucumberStep.java new file mode 100644 index 0000000..be0eb4b --- /dev/null +++ b/src/test/java/utils/BaseCucumberStep.java @@ -0,0 +1,8 @@ +package utils; + +import org.openqa.selenium.WebDriver; + +public class BaseCucumberStep { + + public static WebDriver driver; +} diff --git a/src/test/java/utils/BasePage.java b/src/test/java/utils/BasePage.java new file mode 100644 index 0000000..40fa00f --- /dev/null +++ b/src/test/java/utils/BasePage.java @@ -0,0 +1,24 @@ +package utils; + +import org.openqa.selenium.By; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.WebDriver; +import wait_service.WaitService; + +public class BasePage{ + public WaitService service; + private WebDriver driver; + + public BasePage(WebDriver driver) { + this.service = new WaitService(driver); + this.driver = driver; + } + + protected Boolean isItemOnAPage(By by) { + try { + return driver.findElement(by).isDisplayed(); + } catch (NoSuchElementException e) { + return false; + } + } +} diff --git a/src/test/resources/features/login.feature b/src/test/resources/features/login.feature new file mode 100644 index 0000000..d2e66dc --- /dev/null +++ b/src/test/resources/features/login.feature @@ -0,0 +1,13 @@ +Feature: Full test rail test + Scenario: Login, create project, delete project + Given driver is ready + Given page is opened + Then login page is opened + When perform login with "email" email and "password" password + Then Dashboard page is opened + Given pages opened + When Create project + Then Banner on a page + When Delete project + Then Banner on a page +