From e29903d87bdbf080ace5ea5ea7706c2ccbf97f19 Mon Sep 17 00:00:00 2001 From: "Yury.Chychayeu" Date: Thu, 18 Jan 2024 14:30:29 +0100 Subject: [PATCH 1/4] better base --- pom.xml | 18 ++++++++++--- .../java/web_driver/WebDriverFactory.java | 27 +++++++++++++++++++ src/test/java/utils/BaseTest.java | 22 +++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 src/main/java/web_driver/WebDriverFactory.java create mode 100644 src/test/java/utils/BaseTest.java 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/web_driver/WebDriverFactory.java b/src/main/java/web_driver/WebDriverFactory.java new file mode 100644 index 0000000..b1efff3 --- /dev/null +++ b/src/main/java/web_driver/WebDriverFactory.java @@ -0,0 +1,27 @@ +package web_driver; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.edge.EdgeDriver; +import org.openqa.selenium.edge.EdgeOptions; + +public class WebDriverFactory { + + public WebDriver getDriver(){ + System.setProperty("webdriver.edge.driver", "src/main/resources/msedgedriver.exe"); + return new EdgeDriver(edgeOptions()); + } + + 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/utils/BaseTest.java b/src/test/java/utils/BaseTest.java new file mode 100644 index 0000000..50e49d7 --- /dev/null +++ b/src/test/java/utils/BaseTest.java @@ -0,0 +1,22 @@ +package utils; + +import org.openqa.selenium.WebDriver; +import org.testng.annotations.AfterSuite; +import org.testng.annotations.BeforeMethod; +import web_driver.WebDriverFactory; + +public class BaseTest { + + protected static WebDriver driver; + + @BeforeMethod + public void setUp(){ + WebDriverFactory factory = new WebDriverFactory(); + driver = factory.getDriver(); + } + + @AfterSuite + public void wrapUp(){ + driver.quit(); + } +} From 50b1d38d3c7663f4b785227266c296af24925019 Mon Sep 17 00:00:00 2001 From: "Yury.Chychayeu" Date: Mon, 22 Jan 2024 10:03:22 +0100 Subject: [PATCH 2/4] TestRail Page Object with steps --- src/main/java/wait_service/WaitService.java | 23 ++++++++++++++ .../java/web_driver/WebDriverFactory.java | 7 ++++- src/test/java/page/AddProjectPage.java | 31 +++++++++++++++++++ src/test/java/page/DashboardPage.java | 14 +++++++++ src/test/java/page/LoginPage.java | 22 +++++++++++++ src/test/java/page/OverviewPage.java | 26 ++++++++++++++++ src/test/java/step/AddProjectStep.java | 25 +++++++++++++++ src/test/java/step/DeleteProjectStep.java | 18 +++++++++++ src/test/java/step/LoginStep.java | 19 ++++++++++++ src/test/java/test/CreateProjectTest.java | 29 +++++++++++++++++ src/test/java/test/DeleteProjectTest.java | 26 ++++++++++++++++ src/test/java/test/LoginTest.java | 27 ++++++++++++++++ src/test/java/utils/BasePage.java | 27 ++++++++++++++++ src/test/java/utils/BaseTest.java | 3 +- 14 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 src/main/java/wait_service/WaitService.java create mode 100644 src/test/java/page/AddProjectPage.java create mode 100644 src/test/java/page/DashboardPage.java create mode 100644 src/test/java/page/LoginPage.java create mode 100644 src/test/java/page/OverviewPage.java create mode 100644 src/test/java/step/AddProjectStep.java create mode 100644 src/test/java/step/DeleteProjectStep.java create mode 100644 src/test/java/step/LoginStep.java create mode 100644 src/test/java/test/CreateProjectTest.java create mode 100644 src/test/java/test/DeleteProjectTest.java create mode 100644 src/test/java/test/LoginTest.java create mode 100644 src/test/java/utils/BasePage.java 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/WebDriverFactory.java b/src/main/java/web_driver/WebDriverFactory.java index b1efff3..2c5ebba 100644 --- a/src/main/java/web_driver/WebDriverFactory.java +++ b/src/main/java/web_driver/WebDriverFactory.java @@ -6,9 +6,14 @@ public class WebDriverFactory { + private static WebDriver driver; + public WebDriver getDriver(){ System.setProperty("webdriver.edge.driver", "src/main/resources/msedgedriver.exe"); - return new EdgeDriver(edgeOptions()); + if (driver == null){ + driver = new EdgeDriver(edgeOptions()); + } + return driver; } public EdgeOptions edgeOptions(){ diff --git a/src/test/java/page/AddProjectPage.java b/src/test/java/page/AddProjectPage.java new file mode 100644 index 0000000..4bdc0d2 --- /dev/null +++ b/src/test/java/page/AddProjectPage.java @@ -0,0 +1,31 @@ +package page; + +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 designerDropdownLinkLocator = By.xpath("//a[contains(text(), 'Designer')]"); + private By acceptBtnLocator = By.id("accept"); + + 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..5546f82 --- /dev/null +++ b/src/test/java/page/DashboardPage.java @@ -0,0 +1,14 @@ +package page; + +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 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..8e208b3 --- /dev/null +++ b/src/test/java/page/LoginPage.java @@ -0,0 +1,22 @@ +package page; + +import org.openqa.selenium.By; +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 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..d3a8afd --- /dev/null +++ b/src/test/java/page/OverviewPage.java @@ -0,0 +1,26 @@ +package page; + +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 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/AddProjectStep.java b/src/test/java/step/AddProjectStep.java new file mode 100644 index 0000000..d30cb06 --- /dev/null +++ b/src/test/java/step/AddProjectStep.java @@ -0,0 +1,25 @@ +package step; + +import page.AddProjectPage; +import page.DashboardPage; + +public class AddProjectStep { + + private DashboardPage dashboardPage; + private AddProjectPage addProjectPage; + + public AddProjectStep(DashboardPage dashboardPage, AddProjectPage addProjectPage) { + this.dashboardPage = dashboardPage; + this.addProjectPage = addProjectPage; + } + + public void createProject(){ + dashboardPage.getAddProjectBtn().click(); + + addProjectPage.getNameInput().sendKeys("test"); + addProjectPage.getAccessBtn().click(); + addProjectPage.getAccessDropdownBtn().click(); + addProjectPage.getDesignerDropdownMenuLink().click(); + addProjectPage.getAcceptBtn().click(); + } +} diff --git a/src/test/java/step/DeleteProjectStep.java b/src/test/java/step/DeleteProjectStep.java new file mode 100644 index 0000000..61518c0 --- /dev/null +++ b/src/test/java/step/DeleteProjectStep.java @@ -0,0 +1,18 @@ +package step; + +import page.OverviewPage; + +public class DeleteProjectStep { + + private OverviewPage overviewPage; + + public DeleteProjectStep(OverviewPage overviewPage) { + this.overviewPage = overviewPage; + } + + public void deleteProject(){ + overviewPage.getDeleteBtn().click(); + overviewPage.getCheckbox().click(); + overviewPage.getConfirmButton().click(); + } +} diff --git a/src/test/java/step/LoginStep.java b/src/test/java/step/LoginStep.java new file mode 100644 index 0000000..5b08cb1 --- /dev/null +++ b/src/test/java/step/LoginStep.java @@ -0,0 +1,19 @@ +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/test/CreateProjectTest.java b/src/test/java/test/CreateProjectTest.java new file mode 100644 index 0000000..708c6c9 --- /dev/null +++ b/src/test/java/test/CreateProjectTest.java @@ -0,0 +1,29 @@ +package test; + +import com.beust.ah.A; +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.AddProjectStep; +import utils.BaseTest; + +public class CreateProjectTest extends BaseTest { + + private AddProjectStep addProjectStep; + private OverviewPage overviewPage; + + @BeforeMethod + public void setUpMethod(){ + overviewPage = new OverviewPage(); + addProjectStep = new AddProjectStep(new DashboardPage(), new AddProjectPage()); + } + + @Test(groups = {"create project"}, dependsOnGroups = {"login"}) + public void createProjectTest(){ + addProjectStep.createProject(); + Assert.assertTrue(overviewPage.isBannerOnPage()); + } +} diff --git a/src/test/java/test/DeleteProjectTest.java b/src/test/java/test/DeleteProjectTest.java new file mode 100644 index 0000000..ea9e2b0 --- /dev/null +++ b/src/test/java/test/DeleteProjectTest.java @@ -0,0 +1,26 @@ +package test; + +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import page.OverviewPage; +import step.DeleteProjectStep; +import utils.BaseTest; + +public class DeleteProjectTest extends BaseTest { + + private DeleteProjectStep deleteProjectStep; + private OverviewPage overviewPage; + + @BeforeMethod + public void setUpMethod(){ + overviewPage = new OverviewPage(); + deleteProjectStep = new DeleteProjectStep(overviewPage); + } + + @Test(dependsOnGroups = {"create project", "login"}) + public void deleteProjectTest(){ + deleteProjectStep.deleteProject(); + Assert.assertTrue(overviewPage.isBannerOnPage()); + } +} diff --git a/src/test/java/test/LoginTest.java b/src/test/java/test/LoginTest.java new file mode 100644 index 0000000..1d5ac1f --- /dev/null +++ b/src/test/java/test/LoginTest.java @@ -0,0 +1,27 @@ +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://uyfiytfuyl.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); + Assert.assertEquals(driver.getCurrentUrl(), "https://uyfiytfuyl.testrail.io/index.php?/dashboard"); + } +} 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 index 50e49d7..c39219e 100644 --- a/src/test/java/utils/BaseTest.java +++ b/src/test/java/utils/BaseTest.java @@ -3,13 +3,14 @@ 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; - @BeforeMethod + @BeforeSuite public void setUp(){ WebDriverFactory factory = new WebDriverFactory(); driver = factory.getDriver(); From 5838dc7fc99ee818104d21b408764b7794626519 Mon Sep 17 00:00:00 2001 From: "Yury.Chychayeu" Date: Tue, 23 Jan 2024 12:52:39 +0100 Subject: [PATCH 3/4] fixes --- .../java/web_driver/WebDriverFactory.java | 3 ++- src/test/java/step/DeleteProjectStep.java | 18 ------------- .../{AddProjectStep.java => Project.java} | 13 ++++++++-- src/test/java/test/DeleteProjectTest.java | 26 ------------------- ...reateProjectTest.java => ProjectTest.java} | 17 +++++++----- 5 files changed, 24 insertions(+), 53 deletions(-) delete mode 100644 src/test/java/step/DeleteProjectStep.java rename src/test/java/step/{AddProjectStep.java => Project.java} (59%) delete mode 100644 src/test/java/test/DeleteProjectTest.java rename src/test/java/test/{CreateProjectTest.java => ProjectTest.java} (55%) diff --git a/src/main/java/web_driver/WebDriverFactory.java b/src/main/java/web_driver/WebDriverFactory.java index 2c5ebba..439d84b 100644 --- a/src/main/java/web_driver/WebDriverFactory.java +++ b/src/main/java/web_driver/WebDriverFactory.java @@ -1,5 +1,6 @@ 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; @@ -9,7 +10,7 @@ public class WebDriverFactory { private static WebDriver driver; public WebDriver getDriver(){ - System.setProperty("webdriver.edge.driver", "src/main/resources/msedgedriver.exe"); + WebDriverManager.edgedriver().setup(); if (driver == null){ driver = new EdgeDriver(edgeOptions()); } diff --git a/src/test/java/step/DeleteProjectStep.java b/src/test/java/step/DeleteProjectStep.java deleted file mode 100644 index 61518c0..0000000 --- a/src/test/java/step/DeleteProjectStep.java +++ /dev/null @@ -1,18 +0,0 @@ -package step; - -import page.OverviewPage; - -public class DeleteProjectStep { - - private OverviewPage overviewPage; - - public DeleteProjectStep(OverviewPage overviewPage) { - this.overviewPage = overviewPage; - } - - public void deleteProject(){ - overviewPage.getDeleteBtn().click(); - overviewPage.getCheckbox().click(); - overviewPage.getConfirmButton().click(); - } -} diff --git a/src/test/java/step/AddProjectStep.java b/src/test/java/step/Project.java similarity index 59% rename from src/test/java/step/AddProjectStep.java rename to src/test/java/step/Project.java index d30cb06..bd6183c 100644 --- a/src/test/java/step/AddProjectStep.java +++ b/src/test/java/step/Project.java @@ -2,15 +2,24 @@ import page.AddProjectPage; import page.DashboardPage; +import page.OverviewPage; -public class AddProjectStep { +public class Project { private DashboardPage dashboardPage; private AddProjectPage addProjectPage; + private OverviewPage overviewPage; - public AddProjectStep(DashboardPage dashboardPage, AddProjectPage addProjectPage) { + 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(){ diff --git a/src/test/java/test/DeleteProjectTest.java b/src/test/java/test/DeleteProjectTest.java deleted file mode 100644 index ea9e2b0..0000000 --- a/src/test/java/test/DeleteProjectTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package test; - -import org.testng.Assert; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; -import page.OverviewPage; -import step.DeleteProjectStep; -import utils.BaseTest; - -public class DeleteProjectTest extends BaseTest { - - private DeleteProjectStep deleteProjectStep; - private OverviewPage overviewPage; - - @BeforeMethod - public void setUpMethod(){ - overviewPage = new OverviewPage(); - deleteProjectStep = new DeleteProjectStep(overviewPage); - } - - @Test(dependsOnGroups = {"create project", "login"}) - public void deleteProjectTest(){ - deleteProjectStep.deleteProject(); - Assert.assertTrue(overviewPage.isBannerOnPage()); - } -} diff --git a/src/test/java/test/CreateProjectTest.java b/src/test/java/test/ProjectTest.java similarity index 55% rename from src/test/java/test/CreateProjectTest.java rename to src/test/java/test/ProjectTest.java index 708c6c9..0d66712 100644 --- a/src/test/java/test/CreateProjectTest.java +++ b/src/test/java/test/ProjectTest.java @@ -1,29 +1,34 @@ package test; -import com.beust.ah.A; 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.AddProjectStep; +import step.Project; import utils.BaseTest; -public class CreateProjectTest extends BaseTest { +public class ProjectTest extends BaseTest { - private AddProjectStep addProjectStep; + private Project project; private OverviewPage overviewPage; @BeforeMethod public void setUpMethod(){ overviewPage = new OverviewPage(); - addProjectStep = new AddProjectStep(new DashboardPage(), new AddProjectPage()); + project = new Project(new DashboardPage(), new AddProjectPage(), new OverviewPage()); } @Test(groups = {"create project"}, dependsOnGroups = {"login"}) public void createProjectTest(){ - addProjectStep.createProject(); + project.createProject(); + Assert.assertTrue(overviewPage.isBannerOnPage()); + } + + @Test(groups = {"create project"}, dependsOnGroups = {"login"}) + public void deleteProjectTest(){ + project.deleteProject(); Assert.assertTrue(overviewPage.isBannerOnPage()); } } From 88b792c814dc15ad043dfbfeb8d7b4559ac5ffda Mon Sep 17 00:00:00 2001 From: "Yury.Chychayeu" Date: Sun, 18 Feb 2024 18:06:32 +0100 Subject: [PATCH 4/4] Added wrappers --- src/main/java/wait_service/WaitService.java | 4 +- .../java/web_driver/WebDriverFactory.java | 5 +- src/test/java/elements/Button.java | 22 +++ src/test/java/elements/CheckBox.java | 22 +++ src/test/java/elements/DropDown.java | 22 +++ src/test/java/elements/RadioButtonTable.java | 23 ++++ src/test/java/elements/TextInput.java | 22 +++ src/test/java/elements/UIElement.java | 128 ++++++++++++++++++ src/test/java/elements/table/Table.java | 25 ++++ src/test/java/elements/table/TableBody.java | 36 +++++ src/test/java/elements/table/TableHeader.java | 26 ++++ src/test/java/page/AddProjectPage.java | 30 ++-- src/test/java/page/DashboardPage.java | 5 +- src/test/java/page/LoginPage.java | 16 ++- src/test/java/page/OverviewPage.java | 16 ++- src/test/java/page/TablePage.java | 14 ++ src/test/java/step/LoginStep.java | 3 +- src/test/java/step/Project.java | 10 +- src/test/java/step/TableStep.java | 20 +++ src/test/java/test/LoginTest.java | 5 +- src/test/java/test/ProjectTest.java | 8 +- src/test/java/test/TableTest.java | 32 +++++ 22 files changed, 450 insertions(+), 44 deletions(-) create mode 100644 src/test/java/elements/Button.java create mode 100644 src/test/java/elements/CheckBox.java create mode 100644 src/test/java/elements/DropDown.java create mode 100644 src/test/java/elements/RadioButtonTable.java create mode 100644 src/test/java/elements/TextInput.java create mode 100644 src/test/java/elements/UIElement.java create mode 100644 src/test/java/elements/table/Table.java create mode 100644 src/test/java/elements/table/TableBody.java create mode 100644 src/test/java/elements/table/TableHeader.java create mode 100644 src/test/java/page/TablePage.java create mode 100644 src/test/java/step/TableStep.java create mode 100644 src/test/java/test/TableTest.java diff --git a/src/main/java/wait_service/WaitService.java b/src/main/java/wait_service/WaitService.java index 64f8c00..e96d1cd 100644 --- a/src/main/java/wait_service/WaitService.java +++ b/src/main/java/wait_service/WaitService.java @@ -12,11 +12,11 @@ public class WaitService { private WebDriverWait wait; - public WaitService(WebDriver driver){ + public WaitService(WebDriver driver) { this.wait = new WebDriverWait(driver, Duration.ofSeconds(10)); } - public WebElement waitForVisibilityByLocator(By lo){ + 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 index 439d84b..f0f423c 100644 --- a/src/main/java/web_driver/WebDriverFactory.java +++ b/src/main/java/web_driver/WebDriverFactory.java @@ -9,7 +9,7 @@ public class WebDriverFactory { private static WebDriver driver; - public WebDriver getDriver(){ + public WebDriver getDriver() { WebDriverManager.edgedriver().setup(); if (driver == null){ driver = new EdgeDriver(edgeOptions()); @@ -17,7 +17,7 @@ public WebDriver getDriver(){ return driver; } - public EdgeOptions edgeOptions(){ + public EdgeOptions edgeOptions() { EdgeOptions edgeOptions = new EdgeOptions(); edgeOptions.setHeadless(true); @@ -29,5 +29,4 @@ public EdgeOptions edgeOptions(){ 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 index 4bdc0d2..b2484eb 100644 --- a/src/test/java/page/AddProjectPage.java +++ b/src/test/java/page/AddProjectPage.java @@ -1,5 +1,9 @@ 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; @@ -9,23 +13,27 @@ 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 radioButtonTableLocator = By.cssSelector("div.dirty-trackable.tab.tab1 > div.table"); private By acceptBtnLocator = By.id("accept"); - public WebElement getNameInput(){ - return service.waitForVisibilityByLocator(nameInputLocator); + public TextInput getNameInput() { + return new TextInput(webDriver, nameInputLocator); } - public WebElement getAccessBtn(){ - return service.waitForVisibilityByLocator(accessBtnLocator); + public Button getAccessBtn() { + return new Button(webDriver, accessBtnLocator); } - public WebElement getAccessDropdownBtn(){ - return service.waitForVisibilityByLocator(accessDropdownBtnLocator); + + public RadioButtonTable getRadioButtonTable() { + return new RadioButtonTable(webDriver, radioButtonTableLocator); } - public WebElement getDesignerDropdownMenuLink(){ - return service.waitForVisibilityByLocator(designerDropdownLinkLocator); + + public DropDown getAccessDropdownBtn() { + return new DropDown(webDriver, accessDropdownBtnLocator); } - public WebElement getAcceptBtn(){ - return service.waitForVisibilityByLocator(acceptBtnLocator); + + public Button getAcceptBtn() { + return new Button(webDriver, acceptBtnLocator); } } diff --git a/src/test/java/page/DashboardPage.java b/src/test/java/page/DashboardPage.java index 5546f82..cc94be8 100644 --- a/src/test/java/page/DashboardPage.java +++ b/src/test/java/page/DashboardPage.java @@ -1,5 +1,6 @@ package page; +import elements.Button; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import utils.BasePage; @@ -8,7 +9,7 @@ public class DashboardPage extends BasePage { private By addProjectBtnLocator = By.id("sidebar-projects-add"); - public WebElement getAddProjectBtn(){ - return service.waitForVisibilityByLocator(addProjectBtnLocator); + public Button getAddProjectBtn() { + return new Button(webDriver, addProjectBtnLocator); } } diff --git a/src/test/java/page/LoginPage.java b/src/test/java/page/LoginPage.java index 8e208b3..7006ea5 100644 --- a/src/test/java/page/LoginPage.java +++ b/src/test/java/page/LoginPage.java @@ -1,7 +1,11 @@ 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 { @@ -10,13 +14,13 @@ public class LoginPage extends BasePage { private By pswInputLocator = By.id("password"); private By loginBtn = By.id("button_primary"); - public WebElement getEmailInput(){ - return service.waitForVisibilityByLocator(emailInputLocator); + public WebElement getEmailInput() { + return webDriver.findElement(emailInputLocator); } - public WebElement getPassInput(){ - return service.waitForVisibilityByLocator(pswInputLocator); + public TextInput getPassInput() { + return new TextInput(webDriver, pswInputLocator); } - public WebElement getLoginButton(){ - return service.waitForVisibilityByLocator(loginBtn); + public Button getLoginButton() { + return new Button(webDriver, loginBtn); } } diff --git a/src/test/java/page/OverviewPage.java b/src/test/java/page/OverviewPage.java index d3a8afd..3c3f3f9 100644 --- a/src/test/java/page/OverviewPage.java +++ b/src/test/java/page/OverviewPage.java @@ -1,5 +1,7 @@ package page; +import elements.Button; +import elements.CheckBox; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import utils.BasePage; @@ -11,16 +13,16 @@ public class OverviewPage extends BasePage { 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(){ + public Boolean isBannerOnPage() { return isItemOnAPage(successBannerLocator); } - public WebElement getDeleteBtn(){ - return service.waitForVisibilityByLocator(deleteBtnLocator); + public Button getDeleteBtn() { + return new Button(webDriver, deleteBtnLocator); } - public WebElement getCheckbox(){ - return service.waitForVisibilityByLocator(checkboxLocator); + public CheckBox getCheckbox() { + return new CheckBox(webDriver, checkboxLocator); } - public WebElement getConfirmButton(){ - return service.waitForVisibilityByLocator(confirmButtonLocator); + 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 index 5b08cb1..9f91e97 100644 --- a/src/test/java/step/LoginStep.java +++ b/src/test/java/step/LoginStep.java @@ -10,10 +10,9 @@ public LoginStep(LoginPage loginPage) { this.loginPage = loginPage; } - public void performLogin(String email, String pass){ + 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 index bd6183c..1d3b560 100644 --- a/src/test/java/step/Project.java +++ b/src/test/java/step/Project.java @@ -16,19 +16,21 @@ public Project(DashboardPage dashboardPage, AddProjectPage addProjectPage, Overv this.overviewPage = overviewPage; } - public void deleteProject(){ + public void deleteProject() { overviewPage.getDeleteBtn().click(); overviewPage.getCheckbox().click(); overviewPage.getConfirmButton().click(); } - public void createProject(){ + public void createProject() { dashboardPage.getAddProjectBtn().click(); addProjectPage.getNameInput().sendKeys("test"); addProjectPage.getAccessBtn().click(); - addProjectPage.getAccessDropdownBtn().click(); - addProjectPage.getDesignerDropdownMenuLink().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 index 1d5ac1f..4a5c6b7 100644 --- a/src/test/java/test/LoginTest.java +++ b/src/test/java/test/LoginTest.java @@ -13,15 +13,14 @@ public class LoginTest extends BaseTest { private LoginStep loginStep; @BeforeMethod - public void setUpMethod(){ + public void setUpMethod() { loginStep = new LoginStep(new LoginPage()); - driver.get("https://uyfiytfuyl.testrail.io/index.php?/auth/login/LWZhMDA0NWExYzgyM2UyNWUzMDVjMjE3ZmRjNzU1ZWEzMjJkOTZmNWY1MWEwODk0MDNjZDJhN2E1NTQ2YTEzM2Y:"); + 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); - Assert.assertEquals(driver.getCurrentUrl(), "https://uyfiytfuyl.testrail.io/index.php?/dashboard"); } } diff --git a/src/test/java/test/ProjectTest.java b/src/test/java/test/ProjectTest.java index 0d66712..f212128 100644 --- a/src/test/java/test/ProjectTest.java +++ b/src/test/java/test/ProjectTest.java @@ -15,19 +15,19 @@ public class ProjectTest extends BaseTest { private OverviewPage overviewPage; @BeforeMethod - public void setUpMethod(){ + public void setUpMethod() { overviewPage = new OverviewPage(); project = new Project(new DashboardPage(), new AddProjectPage(), new OverviewPage()); } @Test(groups = {"create project"}, dependsOnGroups = {"login"}) - public void createProjectTest(){ + public void createProjectTest() { project.createProject(); Assert.assertTrue(overviewPage.isBannerOnPage()); } - @Test(groups = {"create project"}, dependsOnGroups = {"login"}) - public void deleteProjectTest(){ + @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"); + } + + + +}