Excuse please review my code. I am working in Selenium with page object design pattern, without any Selenium frameworksautomation testing. I I did a sampleautomation testing for my login page. I am using selenium with page object pattern. I wrote here my code. I am using java language and I am keeping my test data in a property file:
baseurl=http://
nam=geo,sony,geo,geogr,ge
pas=1234,123,56,345,12
There is pageobject package to identify the locators.
package pageobject;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
/**
* Created by naveen on 6/3/17.
*/
public class HomePage {
@FindBy(how= How.NAME, using = "username")
WebElement username;
@FindBy(how=How.NAME, using = "password")
WebElement password;
@FindBy(how=How.XPATH, using="//*[@id=\'login-container\']/form/div[3]/div/p/input[1]" )
WebElement button;
//enter username
public void userLogin(String user, String pass)
{
username.sendKeys(user);
password.sendKeys(pass);
button.click();
}
}
what should I need to improve ? and steps package for initializing the elements for locators class.
package steps;
import org.openqa.selenium.support.PageFactory;
import pageobject.HomePage;
import util.DriverManager;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
* Created by naveen on 6/3/17.
*/
public class LoginSteps extends DriverManager {
public LoginSteps() throws IOException {
}
// public HomePage Login(String nam, String pas) {
public HomePage Login() {
String nam, pas;
// SamleFileInput();
String[] namArray = prop.getProperty("nam").split(",");
String[] pasArray = prop.getProperty("pas").split(",");
HomePage homePageObj = PageFactory.initElements(DriverManager.driver, HomePage.class);
String resultData;
String status;
// BufferedWriter writer = null;
String timeLog = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
File logFile = new File(timeLog + ".txt");
// writer = new BufferedWriter(new FileWriter(logFile))
// homePageObj.userLogin(nam,pas);
int len = namArray.length;
try (BufferedWriter writer = new BufferedWriter(new FileWriter(logFile))) {
for (int i = 0; i < len; i++) {
nam = namArray[i];
pas = pasArray[i];
homePageObj.userLogin(nam, pas);
if (driver.getPageSource().contains("Hello Sony George")) {
status = "Success";
} else {
status = "Failed";
}
resultData = "User: " + nam + " Pwd: " + pas + " Status: " + status+"\n";
System.out.println(resultData);
writer.append(resultData);
}
writer.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// Close the writer regardless of what happens...
} catch (Exception e) {
}
// homePageObj.userLogin(nam,pas);
return homePageObj;
}
}
}
util packageIt will help me to initilize the webdrivergo to next step.
package pageobject;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
/**
* Created by naveen on 6/3/17.
*/
public class HomePage {
@FindBy(how= How.NAME, using = "username")
WebElement username;
@FindBy(how=How.NAME, using = "password")
WebElement password;
@FindBy(how=How.XPATH, using="//*[@id=\'login-container\']/form/div[3]/div/p/input[1]" )
WebElement button;
//enter username
public void userLogin(String user, String pass)
{
username.sendKeys(user);
password.sendKeys(pass);
button.click();
}
}
package steps;
import org.openqa.selenium.support.PageFactory;
import pageobject.HomePage;
import util.DriverManager;
import java.io.IOException;
/**
* Created by naveen on 6/3/17.
*/
public class LoginSteps {
public LoginSteps() throws IOException {
}
public HomePage Login(String uname, String pwd) {
HomePage homePageObj = PageFactory.initElements(DriverManager.driver, HomePage.class);
homePageObj.userLogin(uname, pwd);
return homePageObj;
}
}
package util;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
/**
* Created by naveen on 6/3/17.
*/
public class DriverManager
{
public static WebDriver driver;
String baseUrl;
public Properties prop;
public DriverManager() throws IOException {
// Get baseUrl property
File file = new File("config.properties");
FileInputStream fileInput = null;
try {
fileInput = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//load properties file
prop = new Properties();
try {
prop.load(fileInput);
} catch (IOException e) {
e.printStackTrace();
}
// Start driver
System.setProperty("webdriver.chrome.driver", "/home/naveen/chromedriver");
driver = new ChromeDriver();
driver.manage().window().maximize();
baseUrl = prop.getProperty("baseurl");
driver.get(baseUrl);
}
}
package login;
import org.openqa.selenium.By;
import org.testng.Assert;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import steps.LoginSteps;
import util.DriverManager;
import java.io.IOException;
public class LoginTest extends DriverManager
{
LoginSteps lSteps;
int inputDataFlag = 0;
// 0 -> Invalid i/p
// 1 -> Valid inputs
String[] successMsg;
int successCounter = 0;
String successText;
public LoginTest() throws IOException {
lSteps = new LoginSteps();
successMsg = prop.getProperty("loginSuccess").split(",");
}
// Invalid Credential as input
@Test(dataProvider = "setData")
public void initDriver(String name, String password) {
//Arrange
lSteps.Login(name, password);
Assert.assertFalse(driver.getPageSource().contains("Hello Sony George"), "Valid credentials");
}
// valid Credential as input
@Test(priority = 1,dataProvider = "setData")
public void init(String name,String password)
{
lSteps.Login(name,password);
Assert.assertTrue(driver.getPageSource().contains(successMsg[successCounter]), "Valid credentials");
//logout
if(driver.getPageSource().contains(successMsg[successCounter])){
driver.findElement(By.xpath("//*[@id=\'rightMenu\']/li/a")).click();
driver.findElement(By.linkText("Logout")).click();
successCounter++;
}
}
@DataProvider
Object[][] setData() {
Object[][] dataValues = getValues();
return dataValues;
}
private String[][] getValues(){
String[] namArray = new String[0];
String[] pasArray = new String[0];
if(inputDataFlag == 0){
namArray = prop.getProperty("invalidnames").split(",");
pasArray = prop.getProperty("invalidPwd").split(",");
}else if(inputDataFlag == 1){
namArray = prop.getProperty("validnames").split(",");
pasArray = prop.getProperty("validPwd").split(",");
}
String nam, pas;
int len = namArray.length;
String[][] dataValues = new String[len][2];
for (int i = 0; i < len; i++) {
nam = namArray[i];
pas = pasArray[i];
dataValues[i][0] = nam;
dataValues[i][1] = pas;
}
inputDataFlag++;
return dataValues;
}
@AfterSuite
public void close() {
driver.close();
}
}
Here is the login test itself.property file
import org.testng.Assert;
import org.testng.annotations.Test;
import pageobject.HomePage;
import steps.LoginSteps;
import java.io.IOException;
import static util.DriverManager.driver;
/**
* Created by naveen on 6/3/17.
*/
public class LoginTest
{
public LoginTest() throws IOException {
}
@Test
public void initDriver()invalidnames throws= InterruptedExceptiongeo, IOException {
//Arrange
sony,geo,geogr,geoson,geo,"", try {sony
HomePage pageinvalidPwd = new LoginSteps().Login();
1234,123,56,345,123456789,123,"", Assert.assertTrue(driver.getPageSource().contains("Hello Sony George"));
123
} catch (IOException#Valid e)Test {case
validnames = e.printStackTrace();somevalidnames
validPwd = }somevalidpassword
loginSuccess = //AppointmentPageHello page1=newSony Appointmentsteps().Valid(prop.getProperty("num"),prop.getProperty("usernam"),prop.getProperty("ema"),prop.getProperty("cliid"),prop.getProperty("strdate")George,prop.getProperty("cat"));
Hello Naveen,Hello }
}Juswin
Is it a good practice to keep the looping statement for test data in loginsteps ? whether I have a user register page, so I think it will more shuffled code. so Is it possible to keep the looping statement for all common class files to put in drivermanager ? whats your opinion ?