This is a demo project, implementation is done using Page Object Pattern and Data driven framework.
Below inheritance, constructor concepts are used.
The config.prpoerties
file has username, password, url and browser.
Base Class
package com.crm.qa.base;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import com.crm.qa.utilities.TestUtil;
public class TestBase {
public static Properties prop;
public static WebDriver driver;
public TestBase() {
//import variables from Config.properties file
try {
prop=new Properties();
FileInputStream fis=new FileInputStream(System.getProperty("user.dir")+"/src/main/java/com/crm/qa/configuration/config.properties");
prop.load(fis);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
public static void initialization()
{
String browser= prop.getProperty("browser");
if(browser.equalsIgnoreCase("firefox"))
{
System.setProperty("webdriver.gecko.driver", "./Drivers/geckodriver.exe");
FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.setCapability("marionette", true);
driver = new FirefoxDriver(firefoxOptions);
}
if(browser.equalsIgnoreCase("chrome"))
{
System.setProperty("webdriver.chrome.driver", "./Drivers/chromedriver.exe");
driver=new ChromeDriver();
}
driver.manage().window().maximize();
driver.manage().deleteAllCookies();
driver.manage().timeouts().pageLoadTimeout(TestUtil.PAGE_LOAD_TIMEOUT, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(TestUtil.IMPLICIT_WAIT, TimeUnit.SECONDS);
driver.get(prop.getProperty("baseURL"));
}
}
Login Page Object Class
package com.crm.qa.pages;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import com.crm.qa.base.TestBase;
public class LoginPageCRM extends TestBase {
//PageFactory
@FindBy(name="username")
WebElement username;
@FindBy(name="password")
WebElement password;
@FindBy(xpath = "//input[@type='submit']")
WebElement loginBtn;
@FindBy(xpath= "//a[contains(text(),'Sign Up')]")
WebElement signUP;
@FindBy(xpath="//img[contains(@class,'img-responsive')]")
WebElement crmLogo;
//to initialize page objects
public LoginPageCRM()
{
PageFactory.initElements(driver, LoginPageCRM.class );
}
//Actions
//1. verify title of page
public String validateLoginPageTitle()
{
return driver.getTitle();
}
//2. Validate crm image
public boolean validateCRMLogo()
{
return crmLogo.isDisplayed();
}
//3. Login
public HomePageCRM login(String uname, String pwd)
{
username.sendKeys(uname);
password.sendKeys(pwd);
loginBtn.click();
return new HomePageCRM();
}
}
<------------------------------------LoginTest Class------------------------------------->
package com.crm.qa.testcases;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.crm.qa.base.TestBase;
import com.crm.qa.pages.HomePageCRM;
import com.crm.qa.pages.LoginPageCRM;
public class LoginTest extends TestBase{
public LoginTest()
{
super();
}
LoginPageCRM loginPage;
public HomePageCRM homePageCRM;
@BeforeTest
public void setUP()
{
initialization();
loginPage=new LoginPageCRM();
}
@Test(priority=1)
public void LoginPageTitleTest()
{
String pageTitle= loginPage.validateLoginPageTitle();
Assert.assertEquals(pageTitle,"CRMPRO - CRM software for customer relationship management, sales, and support.");
}
@Test(priority=2)
public void CRMLogoTest()
{
Assert.assertEquals(loginPage.validateCRMLogo(), true);
}
@Test(priority=3)
public void loginPageTest()
{
homePageCRM= loginPage.login(prop.getProperty("username"), prop.getProperty("password"));
}
@AfterTest
public void tearDown()
{
driver.quit();
}
}
Now when I run the LoginTest class as TestNG Test, I get error in console as below-->
com.crm.qa.testcases.LoginTest#setUP
Exception
java.lang.StackOverflowError
at java.base/java.util.stream.StreamOpFlag.fromCharacteristics(StreamOpFlag.java:733)
at java.base/java.util.stream.StreamSupport.stream(StreamSupport.java:70)
at java.base/java.util.Arrays.stream(Arrays.java:5446)
at java.base/java.util.Arrays.stream(Arrays.java:5427)
at java.base/java.lang.Class.methodToString(Class.java:3579)
at java.base/java.lang.Class.getConstructor0(Class.java:3508)
at java.base/java.lang.Class.getConstructor(Class.java:2244)
at org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:128)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:64)
at com.crm.qa.pages.LoginPageCRM.<init>(LoginPageCRM.java:33)
at jdk.internal.reflect.GeneratedConstructorAccessor9.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:350)
at java.base/java.lang.Class.newInstance(Class.java:645)
at org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:131)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:64)
at com.crm.qa.pages.LoginPageCRM.<init>(LoginPageCRM.java:33)
at jdk.internal.reflect.GeneratedConstructorAccessor9.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:350)
at java.base/java.lang.Class.newInstance(Class.java:645)
at org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:131)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:64)
at com.crm.qa.pages.LoginPageCRM.<init>(LoginPageCRM.java:33)
at jdk.internal.reflect.GeneratedConstructorAccessor9.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
........
My Eclipse verion : Version: 2021-03 (4.19.0) Build id: 20210312-0638
eclipse.ini file
-startup
plugins/org.eclipse.equinox.launcher_1.6.100.v20201223-0822.jar
--launcher.library
C:\Users\JACOB\.p2\pool\plugins\org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.100.v20210209-1541
-product
org.eclipse.epp.package.java.product
-showsplash
C:\Users\JACOB\.p2\pool\plugins\org.eclipse.epp.package.common_4.19.0.20210311-1200
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vm
C:/Program Files/Java/jdk-15.0.1/bin/javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=11
-Dosgi.instance.area.default=@user.home/eclipse-workspace
-Dsun.java.command=Eclipse
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-Dosgi.requiredJavaVersion=11
-Dosgi.dataAreaRequiresExplicitInit=true
-Dorg.eclipse.swt.graphics.Resource.reportNonDisposed=true
-Xms256m
-Xmx2048m
--add-modules=ALL-SYSTEM
-Declipse.p2.max.threads=10
-Doomph.update.url=http://download.eclipse.org/oomph/updates/milestone/latest
-Doomph.redirection.index.redirection=index:/->http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/