when i am using pojo, i am getting exception? - selenium

hi all please check my code
public class Sample1 extends Sample {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver",
"C:\\Users\\Balaji-PC\\cucumber\\SamplePro\\driver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.facebook.com/");
driver.manage().window().maximize();
Sample s= new Sample1();
WebElement d = s.getUsername();
d.sendKeys("lsmanikandan");
s.getPassword().sendKeys("manikandan");
}
}
Please check below my pojo class
public class Sample {
WebDriver driver;
public Sample() {
PageFactory.initElements(driver, this);
}
#FindBy(id = "email")
private WebElement username;
#FindBy(id = "pass")
private WebElement password;
public WebElement getUsername() {
return username;
}
public WebElement getPassword() {
return password;
}
}
please find below the exception
Exception in thread "main" java.lang.NullPointerException at
org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at
org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy4.sendKeys(Unknown Source) at
org.test.Sample1.main(Sample1.java:18)

The issue in your code is that you are not passing your driver state from child class Sample 1 to based class Sample.
The magic is in these three points
Adding parametrized constructor in Child class - Sample1
public Sample1(WebDriver driver) { super(driver); }
Adding parametrized constructor in Parent Class - Sample
public Sample(WebDriver driver) {
PageFactory.initElements(driver, this);
System.out.println("Page Factory started");
}
Creating object to called page factory in Parent class by passing driver.
Sample s = new Sample1(driver);
public class Sample {
WebDriver driver;
public Sample(WebDriver driver) {
PageFactory.initElements(driver, this);
System.out.println("Page Factory started");
}
#FindBy(id = "email")
private WebElement username;
#FindBy(id = "pass")
private WebElement password;
public WebElement getUsername() {
System.out.println(username.getAttribute("data-testid"));
return username;
}
public WebElement getPassword() {
System.out.println(username.getAttribute("data-testid"));
return password;
} }
public class Sample {
WebDriver driver;
public Sample(WebDriver driver) {
PageFactory.initElements(driver, this);
System.out.println("Page Factory started");
}
#FindBy(id = "email")
private WebElement username;
#FindBy(id = "pass")
private WebElement password;
public WebElement getUsername() {
System.out.println(username.getAttribute("data-testid"));
return username;
}
public WebElement getPassword() {
System.out.println(username.getAttribute("data-testid"));
return password;
} }

Related

How to use Extent Report logs in Page Objects?

I am getting Null Pointer Exception when using the test.log() method into Page Objects.
My Extent Report test is defined in the "#BeforeMethod" at the TestBase class. Hence, I need to access the test.log(); into the Page Object e.g. LoginPage.java. It's works fine at the test case level i.e. LoginPageTest.java
#BeforeMethod
public void beforeMethod(Method method) {
String testMethodName = method.getName();
test = extent.createTest(testMethodName);
String testReslt = method.getName();
test.info(MarkupHelper.createLabel(testReslt, ExtentColor.BLUE));
log.info("**************" + method.getName() + "Started***************");
}
public static void logExtentReport(String str) {
test.log(Status.INFO, str);
}
Below is the LoginPage.java (which is a page-object class)
public class LoginPage {
private WebDriver driver;
private final Logger log = LoggerHelper.getLogger(LoginPage.class);
VerificationHelper verificationHelper;
WaitHelper waitHelper;
#FindBy(css = "#email")
WebElement loginEmail;
#FindBy(css = "#password")
WebElement loginPassword;
#FindBy(css = "#loginbutton")
WebElement loginBtn;
#FindBy(css = "#loginerrormsg")
WebElement authenticationFailureMessage;
#FindBy(css = "#soflow-color")
WebElement userProfileDrpDwn;
#FindBy(xpath = "//option[#value='string:logout']")
WebElement logout;
#FindBy(tagName = "a")
List<WebElement> allLinks;
String urls[] = null;
public LoginPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
waitHelper = new WaitHelper(driver);
waitHelper.waitForElement(loginBtn,
ObjectReader.reader.getExplicitWait());
}
public void enterEmailAddress(String emailAddress) {
log.info("entering email address...." + emailAddress);
this.loginEmail.clear();
this.loginEmail.sendKeys(emailAddress);
}
public void enterPassword(String password) {
log.info("entering password...." + password);
this.loginPassword.clear();
this.loginPassword.sendKeys(password);
}
public ProspectorPage clickOnSubmitButton(String isValidCredentials) {
log.info("clicking on submit button...");
loginBtn.click();
if (isValidCredentials.equalsIgnoreCase("yes")) {
return new ProspectorPage(driver);
}
return null;
}
public boolean verifySuccessLoginMsg() {
return new VerificationHelper(driver).isDisplayed(userProfileDrpDwn);
}
public boolean verifyAuthenticationFailureMsg() {
return new
VerificationHelper(driver).isDisplayed(authenticationFailureMessage);
}
public void loginToApplication(String emailAddress, String password,
String isValidCredentials) {
enterEmailAddress(emailAddress);
loginBtn.click();
enterPassword(password);
new TestBase().captureScreen("Login Page_1", driver);
clickOnSubmitButton(isValidCredentials);
}
public void logout() {
userProfileDrpDwn.click();
new TestBase().captureScreen("Logout", driver);
waitHelper.waitForElement(logout,
ObjectReader.reader.getExplicitWait());
logout.click();
log.info("clicked on logout link");
TestBase.logExtentReport("clicked on logout link");
waitHelper.waitForElement(loginBtn,
ObjectReader.reader.getExplicitWait());
}
}
}
As you can see in the LoginPage class, I have used TestBase.logExtentReport() method, which is showing NullPointerException, and I cannot initialize the TestBase reference in the PageObject class. Hence, How can I use the logExtentReport method there?
Helper Class is also getting NPE, even after changing the scope of logger from final to static. Below is the code:
import com.uiFramework.engie.prospector.helper.logger.LoggerHelper;
import com.uiFramework.engie.prospector.testbase.TestBase;
public class VerificationHelper {
private WebDriver driver;
private static Logger log =
LoggerHelper.getLogger(VerificationHelper.class);
public VerificationHelper(WebDriver driver){
this.driver = driver;
}
public boolean isDisplayed(WebElement element){
try{
element.isDisplayed();
log.info("element is Displayed.."+element.getText());
TestBase.logExtentReport("element is
Displayed.."+element.getText());
return true;
}
catch(Exception e){
log.error("element is not Displayed..", e.getCause());
TestBase.logExtentReport("element is not
Displayed.."+e.getMessage());
return false;
}
}
public boolean isNotDisplayed(WebElement element){
try{
element.isDisplayed();
log.info("element is present.."+element.getText());
TestBase.logExtentReport("element is
present.."+element.getText());
return false;
}
catch(Exception e){
log.error("element is not present..");
return true;
}
}
public String readValueFromElement(WebElement element){
if(null == element){
log.info("WebElement is null..");
return null;
}
boolean status = isDisplayed(element);
if(status){
log.info("element text is .."+element.getText());
return element.getText();
}
else{
return null;
}
}
public String getText(WebElement element){
if(null == element){
log.info("WebElement is null..");
return null;
}
boolean status = isDisplayed(element);
if(status){
log.info("element text is .."+element.getText());
return element.getText();
}
else{
return null;
}
}
}
Just change
private final Logger log = LoggerHelper.getLogger(LoginPage.class);
to
private static final Logger log = LoggerHelper.getLogger(LoginPage.class);

Cannot pass from login popup page to password popup page in Selenium

I am trying to create a Selenium test for the account login. Each time when a 'continue' button is clicked it says:
no such element: Unable to locate element:
{"method":"xpath","selector":"//INPUT[#id='password']"}
and remains on the email page, doesn't move to the password page. Though xpath of 'password' textbox is correct. My code is below.
login class
public class login {
WebDriver driver;
public login(WebDriver driver)
{
this.driver = driver;
PageFactory.initElements(driver, this);
}
#FindBy(xpath="//LI[#data-cy='account']")
WebElement CreateorLoginButtonXpath;
#FindBy(xpath="//INPUT[#id='username']")
WebElement EmailTextBoxXpath ;
#FindBy(xpath="//BUTTON[#class='capText font16']")
WebElement ContinueButtonXpath;
#FindBy(xpath="//INPUT[#id='password']")
WebElement PasswordTextBoxXpath;
#FindBy(xpath="//BUTTON[#data-cy='login']")
WebElement LoginButtonXpath;
public void clickCreateorLoginButtonXpath()
{
CreateorLoginButtonXpath.click();
System.out.println("login or create button is clicked");
}
public void TypeEmailTextBoxXpath(String email)
{
EmailTextBoxXpath.sendKeys(email);
System.out.println("email is typed");
}
public void clickContinueButtonXpath()
{
ContinueButtonXpath.click();
System.out.println("Continue Button is clicked");
}
public void TypePasswordTextBoxXpath(String password)
{
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(PasswordTextBoxXpath)).sendKeys(password);
System.out.println("Password is given");
}
public void clickLoginButtonXpath()
{
LoginButtonXpath.click();
System.out.println("Login Button is clicked");
}
}
main class
public class RunloginTestCase {
WebDriver driver = new ChromeDriver();
login lg = new login(driver);
#BeforeTest
public void openBrowser() throws InterruptedException
{
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.get("https://www.makemytrip.com/");
System.out.println("Broweser opened");
}
#Test
public void loginTestPositive() throws InterruptedException
{
lg.clickCreateorLoginButtonXpath();
lg.TypeEmailTextBoxXpath("test1992#test.com");
Thread.sleep(2000L);
lg.clickContinueButtonXpath();
driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS) ;
lg.TypePasswordTextBoxXpath("!Qwerqwer1");
lg.clickLoginButtonXpath();
Thread.sleep(3000L);
lg.clickSkipVerificationPopupPageButtonXpath();
}
}
I think you provided a wrong formatted email address. Please try with a valid sample email like "test#test.test" ...
public class RunloginTestCase {
WebDriver driver = new ChromeDriver();
#BeforeTest
public void openBrowser() throws InterruptedException
{
driver.get("https://www.makemytrip.com/");
System.out.println("Broweser opened");
Thread.sleep(3000L);
}
#Test
public void loginTestPositive() throws InterruptedException{
login lg = new login(driver);
lg.clickCreateorLoginButtonXpath();
lg.TypeEmailTextBoxXpath("email");
Thread.sleep(5000L);
lg.clickContinueButtonXpath();
Thread.sleep(5000L);
lg.TypePasswordTextBoxXpath("password");
lg.clickLoginButtonXpath();
}
}
Please try with this one

Running selenium, cucumber and Page Factory. Second step definition fail to run

I wrote a cucumber framework that has two feature files and two stepdefinitions which are glued to the feature files. When i run the test together, it ran for the first stepDefinition and fail to enter the second stepDefinition. I have initialize my pages and yet couldn't get it to work.
Error and Codes below
java.lang.NullPointerException
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy19.click(Unknown Source)
at Pages.HomePage.CreateANewOrderPage.createOrderLink(CreateANewOrderPage.java:35)
at StepDefinitions.CreateOrderStep.user_click_on_create_a_new_order(CreateOrderStep.java:24)
at ✽.When user click on create a new order(CreateOrder.feature:5)
public class CreateANewOrderPage {
WebDriver driver;
public CreateANewOrdePage(WebDriver driver){
this.driver=driver;
PageFactory.initElements(driver, this);
}
#FindBy (linkText= "Create a new order")
public WebElement createOrderLink;
public void createOrderLink(){
createOrderLink.click();
}
public class SigninPage {
WebDriver driver;
public SigninPage(WebDriver driver) {
this.driver=driver;
PageFactory.initElements(driver, this);
}
#FindBy(xpath="//*[#id=\"userName\"]")
public WebElement usernameField;
#FindBy(name="password")
public WebElement passwordField;
#FindBy(id="buttonSubmitLogin")
public WebElement submitBtn;
public void loginDetails(String uname, String psw) {
usernameField.sendKeys(uname);
passwordField.sendKeys(psw);}
public void clickLogin(){
submitBtn.click();
}
}
public class SigninStep {
WebDriver driver;
SigninPage logIn = new SigninPage(driver);
#Given("^user navigates to mySite$")
public void userNavigatesToMysite() throws Throwable {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\mypc\\Documents\\Automation\\drivers\\chromedriver.exe");
driver=new ChromeDriver();
driver.get("www.com");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
#And("^user enter \"([^\"]*)\" and \"([^\"]*)\"$")
public void userEnterValidCredentials(String validuname, String validpsw) throws Throwable {
SigninPage logIn = new SigninPage(driver);
logIn.loginDetails("jdjdjdj","jjdjdj");
}
#When("^user click on Sign in$")
public void userClickSignIn() throws Throwable {
SigninPage logIn = new SigninPage(driver);
logIn.clickLogin();
}
}
public class CreateOrderStep {
WebDriver driver;
CreateANewOrderPage ordercreate;
#When("^user click on create a new order$")
public void user_click_on_create_a_new_order() throws Throwable {
ordercreate= PageFactory.initElements(driver,CreateANewOrderPage.class);
ordercreate.createOrderLink();
}
#RunWith(Cucumber.class)
#CucumberOptions (features = "src\\test\\java\\Features\\",
glue ={"StepDefinitions"},
tags={"#Signin, #CreateOrder"}
//format = {"pretty", "html:target/Destination.."}
// format={"json:target/Destination/cucumber.json"
)
public class SigninRunner {
}

How to Set up POM Structure using selenium java and (TestNG Framework)

I'm new for QA automation and I have average knowledge in java,
so I decided to use (Selenium+Java) to do automation.
I will attach the code I did to the automation.and the script runs smoothly.
But the Structure I did is incorrect as I want to follow the (POM-Selenium).POM-Page Oriented Model
This Script navigates as Follows
Login(Page)-->Peronal(Drop/down Selection)--->AddEdit((Drop/down Selection))-->Personal(Page)-->Add(Button)-->PersonalDetails(Page)
The test scenario is......
the user should "login" to the system, and have to click "personal" drop down in the navigation tab then there will be an "AddEdit" drop downselection.then the user is directed to the page titled as "personal", the user should click "Add" button on that page to get directed to another page called "personal Details" user can add the relevant fields which are provided from the page to add a new Client.
Please help me to arrange this to POM Structure.because I'm having very hard time to think how it goes.what frustrates me is in order user to add a relevant record he/she should be logged in to the system and in POM it says login is a separate page I have to navigate through three pages to complete the task.it would be great if you can help me out.and it's open to discussion and sorry if my English is bad. and please consider me as a total noob when it comes to automation :) thanks!
This is the Test Script I wrote...
package TestNG;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;
import org.openqa.selenium.*;
import org.openqa.selenium.By.ByXPath;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.*;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.Test;
//public String baseUrl;
//public String driverPath;
//public WebDriver driver;
public class Tester {
public String baseUrl = "http://xxx.xxx.xxx.xxx:xxxx/xxx/";
public String driverPath = "C:\\Users\\User\\Desktop\\geckodriver.exe";
public WebDriver driver;
#Test(priority = 0)
public void Login() {
System.out.println("launching firefox browser");
System.setProperty("webdriver.gecko.driver", driverPath);
driver = new FirefoxDriver();
driver.get(baseUrl);
WebElement username = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[#id=\"userId\"]")));
username.sendKeys("xxxxxxxxx");
WebElement password = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[#id=\"loginPassword\"]")));
password.sendKeys("xxxxxxxxxxxxxxxxxx");
WebElement button = (new WebDriverWait(driver, 10)).until(ExpectedConditions
.presenceOfElementLocated(By.xpath("/html/body/div/div[3]/div/div/form/div[3]/div[2]/div/button")));
button.click();
String expectedTitle = "xxxxxxxxxxxxxxxxxxxxxxxx";
String actualTitle = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/div[2]/div[2]/div/div/h1")))
.getText().toString();
// System.out.println(actualTitle);
Assert.assertEquals(actualTitle, expectedTitle);
// driver.close();
}
#Test(priority = 1)
public void Personal_Tab_Selection() {
clickWhenReady("/html/body/div[2]/div[2]/nav/div/div[2]/div/div[1]/ul/li[5]/a", 10, driver);
}
#Test(priority = 2)
public void Add_Edit_Selection() {
clickLinkByHref("/rsa/5/15/staff/n/i/list", driver);
}
#Test(priority = 3)
public void Add_Button() {
clickWhenReady("/html/body/div[2]/div[2]/div/div[2]/form/div[2]/div/div/a", 10, driver);
}
#Test(priority = 4)
public void Radio_Button_AMW() {
WebElement amw_radio = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[1]/div/div/label[1]")));
amw_radio.click();
}
#Test(priority = 5)
public void Radio_Button_service_provider() {
WebElement service_provider = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[2]/div/div/label[1]")));
service_provider.click();
}
#Test(priority = 6)
public void Service_Provider_Name_select() {
WebElement Service_Provider_DD = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[3]/div/div/a")));
Service_Provider_DD.click();
driver.findElement(By.cssSelector("ul > li:nth-child(2)")).click();
}
#Test(priority = 7)
public void Employee_Code_Enter() {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[5]/div/input"))
.sendKeys("01112");
}
#Test(priority = 8)
public void Click_Salutation() {
WebElement Salutation_DD = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[6]/div/div/a")));
Salutation_DD.click();
}
#Test(priority = 9)
public void Salutation_Click() {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[6]/div/div/div/ul/li[5]"))
.click();
}
#Test(priority = 10)
public void employee_name() {
WebElement empname = driver
.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[7]/div/input"));
empname.sendKeys("Test2");
}
#Test(priority = 11)
public void Sap_plant_code() {
WebElement plant_code = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[8]/div/div/a")));
plant_code.click();
}
#Test(priority = 12)
public void sap_code_set() {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[8]/div/div/div/ul/li[3]"))
.click();
}
#Test(priority = 13)
public void sap_vendor_code() {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[9]/div/input"))
.sendKeys("test_2");
}
#Test(priority = 14)
public void employee_role_select() {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[10]/div/div/ul")).click();
}
#Test(priority = 15)
public void select_Technician_role() {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[10]/div/div/div/ul/li"))
.click();
}
#Test(priority = 16)
public void select_status() {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[11]/div/div/a")).click();
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[11]/div/div/div/ul/li[1]"))
.click();
}
#Test(priority = 17)
public void click_save_button() {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[2]/div/div/button[1]")).click();
}
#Test(priority = 18)
public void Record_add_notification_Check() {
if ((new WebDriverWait(driver, 10)).until(ExpectedConditions
.presenceOfElementLocated(By.xpath("/html/body/div[2]/div[3]/div/div/button"))) != null) {
driver.findElement(By.xpath("/html/body/div[2]/div[3]/div/div/button")).click();
} else {
infoBox("not Added", "Not Added");
}
}
public static void infoBox(String infoMessage, String titleBar) {
JOptionPane.showMessageDialog(null, infoMessage, "InfoBox: " + titleBar, JOptionPane.INFORMATION_MESSAGE);
}
public static void clickWhenReady(String location, int timeout, WebDriver driver) {
WebElement element = null;
WebDriverWait wait = new WebDriverWait(driver, timeout);
element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(location)));
element.click();
}
public static void clickLinkByHref(String href, WebDriver driver) {
List<WebElement> anchors = driver.findElements(By.tagName("a"));
Iterator<WebElement> i = anchors.iterator();
while (i.hasNext()) {
WebElement anchor = i.next();
if (anchor.getAttribute("href").contains(href)) {
anchor.click();
break;
}
}
}
}
A few words about your script:
presenceOfElementLocated(By.xpath("//*[#id=\"userId\"]")) - If an element have an id you should always try to use id instead of xpath
By.xpath("/html/body/div/div[3]/div/div/form/div[3]/div[2]/div/button")) - It is recommended to use logical xpath instead of absolute xpath as much as possible. Else your xpath becomes vulnerable.
Now as you are willing to follow the POM, you need to define all the elements of a page in a single page which will be called the PageFactory. Likewise, all the Elements of a webpage will reside in separate class.
For e.g. an entry for an element on a webpage may look like:
#FindBy(id="user_login")
WebElement username;
As you are using TestNG, you can move the Browser related code to a seperate class Browserfactory. From your test class, within #BeforeTest Annotation call the methods of Browserfactory to initialize the browser, open the url.
These are some of the basic steps to implement your code through POM.
Let me know if this solves your query.
These are the classes I created depending on the pages of UI,ill attach the structure as a snapshot too :)
public class Driver_class {
private static String baseUrl;
private static String driverPath;
public static WebDriver driver;
public static WebDriver getDriver() {
baseUrl = "http://xxx.xxx.xxx.xxx:xx:xx\\Desktop\\geckodriver.exe";
if (driver == null) {
System.setProperty("webdriver.gecko.driver", "C:\\Users\\User\\Desktop\\geckodriver.exe");
driver = new FirefoxDriver();
driver.get(baseUrl);
}
return driver;
}
}
public class Login {
public WebElement uid;
public WebElement pwd;
public WebElement loginbtn;
public void get_elements(WebDriver driver) {
uid = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[#id=\"userId\"]")));
pwd = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[#id=\"loginPassword\"]")));
loginbtn = (new WebDriverWait(driver, 10)).until(ExpectedConditions
.presenceOfElementLocated(By.xpath("/html/body/div/div[3]/div/div/form/div[3]/div[2]/div/button")));
}
public void customerLogin() {
this.uid.sendKeys("xxxxxxxx");
this.pwd.sendKeys("xxxxxxxxxxx");
this.loginbtn.click();
}
}
public class Navigation {
public WebElement Personal_Tab;
public WebElement Add_Edit_p;
public void navigate_personal_button(WebDriver driver) {
clickWhenReady("/html/body/div[2]/div[2]/nav/div/div[2]/div/div[1]/ul/li[5]/a", 10, driver);
}
public void navigate_personal_add_button(WebDriver driver) {
clickLinkByHref("/rsa/5/15/staff/n/i/list", driver);
}
public static void clickWhenReady(String location, int timeout, WebDriver driver) {
WebElement element = null;
WebDriverWait wait = new WebDriverWait(driver, timeout);
element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(location)));
element.click();
}
public void clickLinkByHref(String href, WebDriver driver) {
List<WebElement> anchors = driver.findElements(By.tagName("a"));
Iterator<WebElement> i = anchors.iterator();
while (i.hasNext()) {
WebElement anchor = i.next();
if (anchor.getAttribute("href").contains(href)) {
anchor.click();
break;
}
}
}
}
public class Personal_Details {
WebElement amw_radio;
WebElement service_provider;
WebElement Service_Provider_DD;
//WebElement Employee_Code_Enter;
WebElement Click_Salutation;
WebElement Salutation_DD;
WebElement empname;
WebElement plant_code;
//WebElement
public void Radio_Button_AMW(WebDriver driver) {
amw_radio = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[1]/div/div/label[1]")));
amw_radio.click();
}
public void Radio_Button_service_provider(WebDriver driver) {
service_provider = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[2]/div/div/label[1]")));
service_provider.click();
}
public void Service_Provider_Name_select(WebDriver driver) {
Service_Provider_DD = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[3]/div/div/a")));
Service_Provider_DD.click();
driver.findElement(By.cssSelector("ul > li:nth-child(2)")).click();
}
public void Employee_Code_Enter(WebDriver driver) {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[5]/div/input"))
.sendKeys("01112");
}
public void Click_Salutation(WebDriver driver) {
Salutation_DD = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[6]/div/div/a")));
Salutation_DD.click();
}
public void Salutation_Click(WebDriver driver) {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[6]/div/div/div/ul/li[5]"))
.click();
}
public void employee_name(WebDriver driver) {
empname = driver
.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[7]/div/input"));
empname.sendKeys("Test2");
}
public void Sap_plant_code(WebDriver driver) {
plant_code = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[8]/div/div/a")));
plant_code.click();
}
public void sap_code_set(WebDriver driver) {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[8]/div/div/div/ul/li[3]"))
.click();
}
public void sap_vendor_code(WebDriver driver) {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[9]/div/input"))
.sendKeys("test_2");
}
public void employee_role_select(WebDriver driver) {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[10]/div/div/ul")).click();
}
public void select_Technician_role(WebDriver driver) {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[10]/div/div/div/ul/li"))
.click();
}
public void select_status(WebDriver driver) {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[11]/div/div/a")).click();
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[11]/div/div/div/ul/li[1]"))
.click();
}
public void click_save_button(WebDriver driver) {
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[2]/div/div/button[1]")).click();
}
public void Record_add_notification_Check(WebDriver driver) {
if ((new WebDriverWait(driver, 10)).until(ExpectedConditions
.presenceOfElementLocated(By.xpath("/html/body/div[2]/div[3]/div/div/button"))) != null) {
driver.findElement(By.xpath("/html/body/div[2]/div[3]/div/div/button")).click();
} else {
infoBox("not Added", "Not Added");
}
}
public static void infoBox(String infoMessage, String titleBar) {
JOptionPane.showMessageDialog(null, infoMessage, "InfoBox: " + titleBar, JOptionPane.INFORMATION_MESSAGE);
}
}
public class Personal_list {
WebElement add_btn;
public void find_add_btn(WebDriver driver) {
String add_btn_path = "/html/body/div[2]/div[2]/div/div[2]/form/div[2]/div/div/a";
detect_element_click(driver, add_btn_path);
}
public void detect_element_click(WebDriver webDriver, String xp) {
WebDriverWait wait = new WebDriverWait(webDriver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xp))).click();
}
}
This is the TestCaseClass Which executes all test_cases
public class TestCases {
public WebDriver driver = Driver_class.getDriver();
#Test(priority = 0)
public void newCustomerLogin() {
Login rsaLogin = PageFactory.initElements(driver, Login.class);
rsaLogin.get_elements(driver);
rsaLogin.customerLogin();
}
#Test(priority = 1)
public void click_Personal_tab() {
Navigation n = PageFactory.initElements(driver, Navigation.class);
n.navigate_personal_button(driver);
n.navigate_personal_add_button(driver);
}
#Test(priority=2)
public void click_add_tab() {
Personal_list ps= PageFactory.initElements(driver,Personal_list.class);
ps.find_add_btn(driver);
}
#Test(priority=3)
public void Enter_personal_details(){
Personal_Details d= new Personal_Details();
d.Radio_Button_AMW(driver);
d.Radio_Button_service_provider(driver);
d.Service_Provider_Name_select(driver);
d.Employee_Code_Enter(driver);
d.Click_Salutation(driver);
d.Salutation_Click(driver);
d.employee_name(driver);
d.Sap_plant_code(driver);
d.sap_code_set(driver);
d.sap_vendor_code(driver);
d.employee_role_select(driver);
d.select_Technician_role(driver);
d.select_status(driver);
d.click_save_button(driver);
d.Record_add_notification_Check(driver);
}
}

FindBy in pageFactory (webdriver) doesn't work correctly

I want to write tests in selenium WebDriver with PageFactory, but if I add annotations in PageFactory form in class
#FindBy(id="email")
public WebElement mailLink;
and usage:
mailLink.sendKeys("mail#mail.com");
I get a NullPointerException every time. Another way:
driver.findElement(By.id("email")).sendKeys("mail#mail.com");
returns correct value. Where is the problem with first method?
My code:
I have got driver initialization in FaceClass:
public class FaceClass {
protected WebDriver driver;
public FaceClass(WebDriver driver){
this.driver = driver;
}
public HomePage navigateToApp(){
driver.navigate().to("https://facebook.pl");
return PageFactory.initElements(driver, HomePage.class);
}
}
and class with business logic:
public class HomePage extends FaceClass{
public HomePage(WebDriver driver) {
super(driver);
// TODO Auto-generated constructor stub
}
#FindBy(id="email")
public WebElement mailLink;
#FindBy(id="pass")
public WebElement passLink;
#FindBy(how = How.ID, using="u_0_n")
public WebElement loginButton;
public ProfilePage navigateToProfile(){
try{
if(driver.findElement(By.id("pass")).isEnabled() || driver.findElement(By.id("pass")).isDisplayed()){
System.out.println("ok!");
}
//driver.findElement(By.id("pass")).sendKeys("pass_to_account");
//driver.findElement(By.id("email")).sendKeys("mail#mail.com");
//driver.findElement(By.id("u_0_n")).click();
mailLink.sendKeys("mail#mail.com");
passLink.sendKeys("pass_to_account");
loginButton.click();
} catch (Exception e) {
e.printStackTrace();
}
return PageFactory.initElements(driver, ProfilePage.class);
}
}
and test:
public class ExampleTest {
WebDriver driver;
#Before
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");
DesiredCapabilities capabilities=DesiredCapabilities.chrome();
capabilities.setCapability("marionette", true);
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.navigate().to("https://facebook.pl");
}
#After
public void tearDown() throws Exception {
driver.quit();
}
#Test
public void test() {
//fail("Not yet implemented");
HomePage homepage = new HomePage(driver);
homepage.navigateToProfile();
}
}
All elements are enabled and visible
You did not initialize your elements before using. To initialize your page elements PageFactory method initElements. It's better if you call it in your constructor like this:
public HomePage(WebDriver driver) {
super(driver);
PageFactory.initElements(driver, this);
}
Hope it works.