diff --git a/pom.xml b/pom.xml index 54175bd..cf0a75b 100644 --- a/pom.xml +++ b/pom.xml @@ -16,9 +16,21 @@ - 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 diff --git a/src/main/java/wait_service/WaitService.java b/src/main/java/wait_service/WaitService.java new file mode 100644 index 0000000..e96d1cd --- /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/WebDriverFactory.java b/src/main/java/web_driver/WebDriverFactory.java new file mode 100644 index 0000000..f0f423c --- /dev/null +++ b/src/main/java/web_driver/WebDriverFactory.java @@ -0,0 +1,32 @@ +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 WebDriverFactory { + + private static WebDriver driver; + + public WebDriver getDriver() { + WebDriverManager.edgedriver().setup(); + if (driver == null){ + driver = new EdgeDriver(edgeOptions()); + } + return driver; + } + + public EdgeOptions edgeOptions() { + 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"); + + return edgeOptions; + } +} \ No newline at end of file diff --git a/src/test/java/elements/Button.java b/src/test/java/elements/Button.java new file mode 100644 index 0000000..56b7c5e --- /dev/null +++ b/src/test/java/elements/Button.java @@ -0,0 +1,22 @@ +package elements; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class Button { + + private UIElement uiElement; + + public Button(WebDriver driver, By locator) { + uiElement = new UIElement(driver, locator); + } + + public Button(WebDriver driver, WebElement element) { + uiElement = new UIElement(driver, element); + } + + public void click() { + uiElement.click(); + } +} \ No newline at end of file diff --git a/src/test/java/elements/CheckBox.java b/src/test/java/elements/CheckBox.java new file mode 100644 index 0000000..ff673f1 --- /dev/null +++ b/src/test/java/elements/CheckBox.java @@ -0,0 +1,22 @@ +package elements; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class CheckBox { + + private UIElement uiElement; + + public CheckBox(WebDriver driver, By locator) { + uiElement = new UIElement(driver, locator); + } + + public CheckBox(WebDriver driver, WebElement element) { + uiElement = new UIElement(driver, element); + } + + public void click() { + uiElement.click(); + } +} \ No newline at end of file diff --git a/src/test/java/elements/DropDown.java b/src/test/java/elements/DropDown.java new file mode 100644 index 0000000..449e869 --- /dev/null +++ b/src/test/java/elements/DropDown.java @@ -0,0 +1,22 @@ +package elements; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.Select; + +public class DropDown{ + + private UIElement uiElement; + public Select select; + + public DropDown(WebDriver driver, By locator) { + uiElement = new UIElement(driver, locator); + select = new Select(uiElement); + } + + public DropDown(WebDriver driver, WebElement element) { + uiElement = new UIElement(driver, element); + select = new Select(uiElement); + } +} \ No newline at end of file diff --git a/src/test/java/elements/RadioButtonTable.java b/src/test/java/elements/RadioButtonTable.java new file mode 100644 index 0000000..b20a869 --- /dev/null +++ b/src/test/java/elements/RadioButtonTable.java @@ -0,0 +1,23 @@ +package elements; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class RadioButtonTable { + + private UIElement uiElement; + + public RadioButtonTable(WebDriver driver, WebElement element) { + uiElement = new UIElement(driver, element); + } + + public RadioButtonTable(WebDriver driver, By locator) { + uiElement = new UIElement(driver, locator); + } + + + public void selectButtonByValue(int value) { + uiElement.findElement(By.xpath("//input[@type='radio' and @value='" + value + "']")).click(); + } +} \ No newline at end of file diff --git a/src/test/java/elements/TextInput.java b/src/test/java/elements/TextInput.java new file mode 100644 index 0000000..6b605dd --- /dev/null +++ b/src/test/java/elements/TextInput.java @@ -0,0 +1,22 @@ +package elements; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class TextInput { + + private UIElement uiElement; + + public TextInput(WebDriver driver, By locator) { + uiElement = new UIElement(driver, locator); + } + + public TextInput(WebDriver driver, WebElement element) { + uiElement = new UIElement(driver, element); + } + + public void sendKeys(CharSequence... s) { + uiElement.sendKeys(s); + } +} diff --git a/src/test/java/elements/UIElement.java b/src/test/java/elements/UIElement.java new file mode 100644 index 0000000..c2e0907 --- /dev/null +++ b/src/test/java/elements/UIElement.java @@ -0,0 +1,128 @@ +package elements; + +import org.openqa.selenium.*; +import wait_service.WaitService; + +import java.rmi.server.UID; +import java.util.ArrayList; +import java.util.List; + +public class UIElement implements WebElement { + + private WebElement webElement; + private WaitService waitService; + private WebDriver driver; + + public UIElement(WebDriver driver, WebElement element) { + this.driver = driver; + this.waitService = new WaitService(driver); + this.webElement = element; + } + + public UIElement(WebDriver driver, By locator) { + this.driver = driver; + this.waitService = new WaitService(driver); + this.webElement = waitService.waitForVisibilityByLocator(locator); + } + + + @Override + public void click() { + moveToElement(); + submit(); + } + + @Override + public void submit() { + webElement.submit(); + } + + @Override + public void sendKeys(CharSequence... keysToSend) { + moveToElement(); + webElement.sendKeys(keysToSend); + } + + @Override + public void clear() { + webElement.clear(); + } + + @Override + public String getTagName() { + return webElement.getTagName(); + } + + @Override + public String getAttribute(String name) { + return webElement.getAttribute(name); + } + + @Override + public boolean isSelected() { + return webElement.isSelected(); + } + + @Override + public boolean isEnabled() { + return webElement.isEnabled(); + } + + @Override + public String getText() { + return webElement.getText(); + } + + @Override + public List findElements(By by) { + return webElement.findElements(by); + } + + public List findUIElements(By by) { + ArrayList list = new ArrayList<>(); + for (WebElement element : webElement.findElements(by)) { + list.add(new UIElement(driver, element)); + } + return list; + } + + + @Override + public UIElement findElement(By by) { + return new UIElement(driver, webElement.findElement(by)); + } + + @Override + public boolean isDisplayed() { + return webElement.isDisplayed(); + } + + @Override + public Point getLocation() { + return webElement.getLocation(); + } + + @Override + public Dimension getSize() { + return webElement.getSize(); + } + + @Override + public Rectangle getRect() { + return webElement.getRect(); + } + + @Override + public String getCssValue(String propertyName) { + return webElement.getCssValue(propertyName); + } + + @Override + public X getScreenshotAs(OutputType target) throws WebDriverException { + return webElement.getScreenshotAs(target); + } + + public void moveToElement() { + ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true)", webElement); + } +} diff --git a/src/test/java/elements/table/Table.java b/src/test/java/elements/table/Table.java new file mode 100644 index 0000000..6fbb868 --- /dev/null +++ b/src/test/java/elements/table/Table.java @@ -0,0 +1,25 @@ +package elements.table; + +import elements.UIElement; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class Table { + + private UIElement uiElement; + public TableHeader tableHeader; + public TableBody tableBody; + + public Table(WebDriver driver, By locator) { + uiElement = new UIElement(driver, locator); + tableBody = new TableBody(driver, uiElement.findElement(By.cssSelector("tbody"))); + tableHeader = new TableHeader(driver, uiElement.findElement(By.cssSelector("thead"))); + } + + public Table(WebDriver driver, WebElement element) { + uiElement = new UIElement(driver, element); + tableBody = new TableBody(driver, uiElement.findElement(By.cssSelector("tbody"))); + tableHeader = new TableHeader(driver, uiElement.findElement(By.cssSelector("thead"))); + } +} \ No newline at end of file diff --git a/src/test/java/elements/table/TableBody.java b/src/test/java/elements/table/TableBody.java new file mode 100644 index 0000000..180db42 --- /dev/null +++ b/src/test/java/elements/table/TableBody.java @@ -0,0 +1,36 @@ +package elements.table; + +import elements.UIElement; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.ArrayList; +import java.util.List; + +public class TableBody { + + private UIElement uiElement; + + public TableBody(WebDriver driver, By locator) { + uiElement = new UIElement(driver, locator); + } + + public TableBody(WebDriver driver, WebElement element) { + uiElement = new UIElement(driver, element); + } + + public List getColumnByIndex(int index) { + List columns = uiElement.findUIElements(By.tagName("tr")); + UIElement column = columns.get(index -1); + return column.findUIElements(By.tagName("td")); + } + + public List getRowByIndex(int index) { + return uiElement.findUIElements(By.cssSelector(".column" + index)); + } + + public UIElement getCellByRowAndColumn(int row, int column) { + return getColumnByIndex(column).get(row -1); + } +} \ No newline at end of file diff --git a/src/test/java/elements/table/TableHeader.java b/src/test/java/elements/table/TableHeader.java new file mode 100644 index 0000000..9f17525 --- /dev/null +++ b/src/test/java/elements/table/TableHeader.java @@ -0,0 +1,26 @@ +package elements.table; + +import elements.UIElement; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.List; + +public class TableHeader { + + private UIElement uiElement; + + public TableHeader(WebDriver driver, By locator) { + uiElement = new UIElement(driver, locator); + } + + public TableHeader(WebDriver driver, WebElement element) { + uiElement = new UIElement(driver, element); + } + + public String getColumnHeaderTextByIndex(int index) { + List headerCells = uiElement.findUIElements(By.tagName("th")); + return headerCells.get(index -1).getText(); + } +} \ No newline at end of file diff --git a/src/test/java/page/AddProjectPage.java b/src/test/java/page/AddProjectPage.java new file mode 100644 index 0000000..b2484eb --- /dev/null +++ b/src/test/java/page/AddProjectPage.java @@ -0,0 +1,39 @@ +package page; + +import elements.Button; +import elements.DropDown; +import elements.RadioButtonTable; +import elements.TextInput; +import org.openqa.selenium.By; +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 radioButtonTableLocator = By.cssSelector("div.dirty-trackable.tab.tab1 > div.table"); + private By acceptBtnLocator = By.id("accept"); + + public TextInput getNameInput() { + return new TextInput(webDriver, nameInputLocator); + } + public Button getAccessBtn() { + return new Button(webDriver, accessBtnLocator); + } + + public RadioButtonTable getRadioButtonTable() { + return new RadioButtonTable(webDriver, radioButtonTableLocator); + } + + public DropDown getAccessDropdownBtn() { + return new DropDown(webDriver, accessDropdownBtnLocator); + } + + public Button getAcceptBtn() { + return new Button(webDriver, acceptBtnLocator); + } + +} diff --git a/src/test/java/page/DashboardPage.java b/src/test/java/page/DashboardPage.java new file mode 100644 index 0000000..cc94be8 --- /dev/null +++ b/src/test/java/page/DashboardPage.java @@ -0,0 +1,15 @@ +package page; + +import elements.Button; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import utils.BasePage; + +public class DashboardPage extends BasePage { + + private By addProjectBtnLocator = By.id("sidebar-projects-add"); + + public Button getAddProjectBtn() { + return new Button(webDriver, addProjectBtnLocator); + } +} diff --git a/src/test/java/page/LoginPage.java b/src/test/java/page/LoginPage.java new file mode 100644 index 0000000..7006ea5 --- /dev/null +++ b/src/test/java/page/LoginPage.java @@ -0,0 +1,26 @@ +package page; + +import elements.Button; +import elements.TextInput; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.w3c.dom.Text; +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 WebElement getEmailInput() { + return webDriver.findElement(emailInputLocator); + } + public TextInput getPassInput() { + return new TextInput(webDriver, pswInputLocator); + } + public Button getLoginButton() { + return new Button(webDriver, loginBtn); + } +} diff --git a/src/test/java/page/OverviewPage.java b/src/test/java/page/OverviewPage.java new file mode 100644 index 0000000..3c3f3f9 --- /dev/null +++ b/src/test/java/page/OverviewPage.java @@ -0,0 +1,28 @@ +package page; + +import elements.Button; +import elements.CheckBox; +import org.openqa.selenium.By; +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 Boolean isBannerOnPage() { + return isItemOnAPage(successBannerLocator); + } + public Button getDeleteBtn() { + return new Button(webDriver, deleteBtnLocator); + } + public CheckBox getCheckbox() { + return new CheckBox(webDriver, checkboxLocator); + } + public Button getConfirmButton() { + return new Button(webDriver, confirmButtonLocator); + } +} diff --git a/src/test/java/page/TablePage.java b/src/test/java/page/TablePage.java new file mode 100644 index 0000000..1b5f08a --- /dev/null +++ b/src/test/java/page/TablePage.java @@ -0,0 +1,14 @@ +package page; + +import elements.table.Table; +import org.openqa.selenium.By; +import utils.BasePage; + +public class TablePage extends BasePage { + + private By tableLocator = By.cssSelector(".table100"); + + public Table getTable() { + return new Table(webDriver, tableLocator); + } +} diff --git a/src/test/java/step/LoginStep.java b/src/test/java/step/LoginStep.java new file mode 100644 index 0000000..9f91e97 --- /dev/null +++ b/src/test/java/step/LoginStep.java @@ -0,0 +1,18 @@ +package step; + +import page.LoginPage; + +public class LoginStep { + + private LoginPage loginPage; + + public LoginStep(LoginPage loginPage) { + this.loginPage = loginPage; + } + + public void performLogin(String email, String pass) { + loginPage.getEmailInput().sendKeys(email); + loginPage.getPassInput().sendKeys(pass); + loginPage.getLoginButton().click(); + } +} diff --git a/src/test/java/step/Project.java b/src/test/java/step/Project.java new file mode 100644 index 0000000..1d3b560 --- /dev/null +++ b/src/test/java/step/Project.java @@ -0,0 +1,36 @@ +package step; + +import page.AddProjectPage; +import page.DashboardPage; +import page.OverviewPage; + +public class Project { + + private DashboardPage dashboardPage; + private AddProjectPage addProjectPage; + private OverviewPage overviewPage; + + public Project(DashboardPage dashboardPage, AddProjectPage addProjectPage, OverviewPage overviewPage) { + this.dashboardPage = dashboardPage; + this.addProjectPage = addProjectPage; + this.overviewPage = overviewPage; + } + + public void deleteProject() { + overviewPage.getDeleteBtn().click(); + overviewPage.getCheckbox().click(); + overviewPage.getConfirmButton().click(); + } + + public void createProject() { + dashboardPage.getAddProjectBtn().click(); + + addProjectPage.getNameInput().sendKeys("test"); + addProjectPage.getAccessBtn().click(); + addProjectPage.getRadioButtonTable().selectButtonByValue(1); + // + addProjectPage.getAccessDropdownBtn().select.selectByValue("Designer"); + // + addProjectPage.getAcceptBtn().click(); + } +} diff --git a/src/test/java/step/TableStep.java b/src/test/java/step/TableStep.java new file mode 100644 index 0000000..efedb96 --- /dev/null +++ b/src/test/java/step/TableStep.java @@ -0,0 +1,20 @@ +package step; + +import page.TablePage; + +public class TableStep{ + + private TablePage tablePage; + + public TableStep(TablePage tablePage) { + this.tablePage = tablePage; + } + + public String getTextFromCell(int row, int column) { + return tablePage.getTable().tableBody.getCellByRowAndColumn(row, column).getText(); + } + + public String getTextFromHeaderCell(int row) { + return tablePage.getTable().tableHeader.getColumnHeaderTextByIndex(row); + } +} diff --git a/src/test/java/test/LoginTest.java b/src/test/java/test/LoginTest.java new file mode 100644 index 0000000..4a5c6b7 --- /dev/null +++ b/src/test/java/test/LoginTest.java @@ -0,0 +1,26 @@ +package test; + +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Parameters; +import org.testng.annotations.Test; +import page.LoginPage; +import step.LoginStep; +import utils.BaseTest; + +public class LoginTest extends BaseTest { + + private LoginStep loginStep; + + @BeforeMethod + public void setUpMethod() { + loginStep = new LoginStep(new LoginPage()); + driver.get("https://piogjheioghtor.testrail.io/index.php?/auth/login/LWZhMDA0NWExYzgyM2UyNWUzMDVjMjE3ZmRjNzU1ZWEzMjJkOTZmNWY1MWEwODk0MDNjZDJhN2E1NTQ2YTEzM2Y:"); + } + + @Parameters({"email", "psw"}) + @Test(groups = {"login"}) + public void loginTest(String email, String psw) throws InterruptedException { + loginStep.performLogin(email, psw); + } +} diff --git a/src/test/java/test/ProjectTest.java b/src/test/java/test/ProjectTest.java new file mode 100644 index 0000000..f212128 --- /dev/null +++ b/src/test/java/test/ProjectTest.java @@ -0,0 +1,34 @@ +package test; + +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import page.AddProjectPage; +import page.DashboardPage; +import page.OverviewPage; +import step.Project; +import utils.BaseTest; + +public class ProjectTest extends BaseTest { + + private Project project; + private OverviewPage overviewPage; + + @BeforeMethod + public void setUpMethod() { + overviewPage = new OverviewPage(); + project = new Project(new DashboardPage(), new AddProjectPage(), new OverviewPage()); + } + + @Test(groups = {"create project"}, dependsOnGroups = {"login"}) + public void createProjectTest() { + project.createProject(); + Assert.assertTrue(overviewPage.isBannerOnPage()); + } + + @Test(groups = {"create project"}, dependsOnGroups = {"login", "create project"}) + public void deleteProjectTest() { + project.deleteProject(); + Assert.assertTrue(overviewPage.isBannerOnPage()); + } +} diff --git a/src/test/java/test/TableTest.java b/src/test/java/test/TableTest.java new file mode 100644 index 0000000..5cfb857 --- /dev/null +++ b/src/test/java/test/TableTest.java @@ -0,0 +1,32 @@ +package test; + +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import page.TablePage; +import step.TableStep; +import utils.BaseTest; + +public class TableTest extends BaseTest { + + private TableStep tableStep; + + @BeforeMethod + public void setUpMethod(){ + tableStep = new TableStep(new TablePage()); + driver.get("https://colorlib.com/etc/tb/Table_Responsive_v1/index.html"); + } + + @Test + public void tableBodyTest(){ + Assert.assertEquals(tableStep.getTextFromCell(2, 5), "200391"); + } + + @Test + public void tableHeaderTest(){ + Assert.assertEquals(tableStep.getTextFromHeaderCell(3), "Name"); + } + + + +} diff --git a/src/test/java/utils/BasePage.java b/src/test/java/utils/BasePage.java new file mode 100644 index 0000000..f4b62d7 --- /dev/null +++ b/src/test/java/utils/BasePage.java @@ -0,0 +1,27 @@ +package utils; + +import org.openqa.selenium.By; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.WebDriver; +import wait_service.WaitService; +import web_driver.WebDriverFactory; + +public class BasePage { + + public static WebDriver webDriver; + public WaitService service; + + public BasePage(){ + WebDriverFactory factory = new WebDriverFactory(); + webDriver = factory.getDriver(); + service = new WaitService(webDriver); + } + + protected Boolean isItemOnAPage(By by){ + try { + return webDriver.findElement(by).isDisplayed(); + } catch (NoSuchElementException e) { + return false; + } + } +} diff --git a/src/test/java/utils/BaseTest.java b/src/test/java/utils/BaseTest.java new file mode 100644 index 0000000..c39219e --- /dev/null +++ b/src/test/java/utils/BaseTest.java @@ -0,0 +1,23 @@ +package utils; + +import org.openqa.selenium.WebDriver; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import web_driver.WebDriverFactory; + +public class BaseTest { + + protected static WebDriver driver; + + @BeforeSuite + public void setUp(){ + WebDriverFactory factory = new WebDriverFactory(); + driver = factory.getDriver(); + } + + @AfterSuite + public void wrapUp(){ + driver.quit(); + } +}