I tried to automate the search of expedia website. If i run the same code in selenium java version, it works perfect. But in the TestNG mode. I am getting the error message.
package testNGbasics;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import java.util.concurrent.TimeUnit;
import org.testng.annotations.Test;
public class Expediaassignment {
public String baseUrl = "https://www.expedia.com/";
public WebDriver driver;
//Flying From class variables
public WebElement flyingfrom = driver.findElement(By.xpath("//input[#id='flight-origin-hp-flight']"));
public String DepatureFrom = "Mumbai";
public String FF = flyingfrom.getAttribute("value");
//Flying To class variables
public WebElement flyingTo = driver.findElement(By.xpath("//input[#id='flight-destination-hp-flight']"));
public String DD = flyingTo.getAttribute("value");
//Declaring departure and return date
public String departureDate = "22/06/2020";
public String returnDate = "21/08/2020";
#Test
public void setBaseURL()
{
System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Java\\chromedriver_win32\\chromedriver.exe");
System.setProperty(ChromeDriverService.CHROME_DRIVER_SILENT_OUTPUT_PROPERTY,"True");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().deleteAllCookies();
driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
//Navigating to expedia website
driver.get(baseUrl);
System.out.println(driver.getCurrentUrl());
}
#Test
public void closepopup()
{
driver.findElement(By.xpath("//button[#id='travel-advisory-close-button']//span[1]")).click();
}
#Test
public void FlyingFrom() throws InterruptedException
{
flyingfrom.click();
flyingfrom.sendKeys(DepatureFrom);
Thread.sleep(2000);
flyingfrom.sendKeys(Keys.ARROW_DOWN);
Thread.sleep(2000);
flyingfrom.sendKeys(Keys.ENTER);
System.out.println("Your departure is"+FF);
}
#Test
public void FlyingTo() throws InterruptedException
{
flyingTo.click();
Thread.sleep(2000);
flyingTo.sendKeys("MAA");
Thread.sleep(2000);
flyingTo.sendKeys(Keys.ARROW_DOWN);
Thread.sleep(2000);
flyingTo.sendKeys(Keys.ENTER);
System.out.println("Your destination is"+DD);
}
#Test
public void departureDate() throws InterruptedException
{
WebElement DepartureDate = driver.findElement(By.xpath("//input[#id='flight-departing-hp-flight']"));
DepartureDate.click();
DepartureDate.sendKeys(departureDate);
//Thread.sleep(2000);
//driver.findElement(By.xpath("//*[#id=\"flight-departing-wrapper-hp-flight\"]/div/div/div[2]/table/tbody/tr[3]/td[3]/button")).click();
String DepartDate =DepartureDate.getAttribute("value");
System.out.println("Your depature date is"+DepartDate);
}
#Test
public void returnDate() throws InterruptedException
{
WebElement ReturnDate = driver.findElement(By.xpath("//input[#id='flight-returning-hp-flight']"));
ReturnDate.click();
ReturnDate.sendKeys(returnDate);
//Thread.sleep(2000);
String ReturDate =ReturnDate.getAttribute("value");
System.out.println("Your Return date is"+ReturDate);
}
}
i am getting below error message
[RemoteTestNG] detected TestNG version 7.0.1
org.testng.TestNGException:
Cannot instantiate class testNGbasics.Expediaassignment
at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:30)
at org.testng.internal.InstanceCreator.instantiateUsingDefaultConstructor(InstanceCreator.java:193)
at org.testng.internal.InstanceCreator.createInstanceUsingObjectFactory(InstanceCreator.java:113)
at org.testng.internal.InstanceCreator.createInstance(InstanceCreator.java:79)
at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:109)
at org.testng.internal.ClassImpl.getInstances(ClassImpl.java:167)
at org.testng.TestClass.getInstances(TestClass.java:102)
at org.testng.TestClass.initTestClassesAndInstances(TestClass.java:82)
at org.testng.TestClass.init(TestClass.java:74)
at org.testng.TestClass.<init>(TestClass.java:39)
at org.testng.TestRunner.initMethods(TestRunner.java:459)
at org.testng.TestRunner.init(TestRunner.java:338)
at org.testng.TestRunner.init(TestRunner.java:291)
at org.testng.TestRunner.<init>(TestRunner.java:222)
at org.testng.remote.support.RemoteTestNG6_12$1.newTestRunner(RemoteTestNG6_12.java:33)
at org.testng.remote.support.RemoteTestNG6_12$DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_12.java:66)
at org.testng.ITestRunnerFactory.newTestRunner(ITestRunnerFactory.java:55)
at org.testng.SuiteRunner$ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:676)
at org.testng.SuiteRunner.init(SuiteRunner.java:178)
at org.testng.SuiteRunner.<init>(SuiteRunner.java:112)
at org.testng.TestNG.createSuiteRunner(TestNG.java:1275)
at org.testng.TestNG.createSuiteRunners(TestNG.java:1251)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1100)
at org.testng.TestNG.runSuites(TestNG.java:1039)
at org.testng.TestNG.run(TestNG.java:1007)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
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.Constructor.newInstance(Constructor.java:481)
at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:23)
... 27 more
Caused by: java.lang.NullPointerException
at testNGbasics.Expediaassignment.<init>(Expediaassignment.java:17)
... 33 more
what went wrong. and what needs to be changed?
Root cause:
Caused by: java.lang.NullPointerException
at testNGbasics.Expediaassignment.<init>(Expediaassignment.java:17)
Problem: WebDriver does not initialize and you have used it
public WebDriver driver;
// Flying From class variables
public WebElement flyingfrom = driver.findElement(By.xpath("//input[#id='flight-origin-hp-flight']"));
Thrown:
Cannot instantiate class testNGbasics.Expediaassignment
Because: While creating the instance of Expediaassignment this code will execute and due to driver is null it is unable to create an instance of Expediaassignment .
You can use #BeforeSuite to execute code before all tests execute.
Like,
public WebDriver driver;
// Flying From class variables
public WebElement flyingfrom /*= driver.findElement(By.xpath("//input[#id='flight-origin-hp-flight']"))*/;
public String DepatureFrom = "Mumbai";
public String FF /*= flyingfrom.getAttribute("value")*/;
// Flying To class variables
public WebElement flyingTo /*= driver.findElement(By.xpath("//input[#id='flight-destination-hp-flight']"))*/;
public String DD /*= flyingTo.getAttribute("value")*/;
// Declaring departure and return date
public String departureDate = "22/06/2020";
public String returnDate = "21/08/2020";
#BeforeSuite
void setBaseURL() {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Java\\chromedriver.exe");
System.setProperty(ChromeDriverService.CHROME_DRIVER_SILENT_OUTPUT_PROPERTY, "True");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().deleteAllCookies();
driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
// Navigating to expedia website
driver.get(baseUrl);
System.out.println(driver.getCurrentUrl());
flyingfrom = driver.findElement(By.xpath("//input[#id='flight-origin-hp-flight']"));
FF = flyingfrom.getAttribute("value");
flyingTo = driver.findElement(By.xpath("//input[#id='flight-destination-hp-flight']"));
DD = flyingTo.getAttribute("value");
}
Related
I used these two classes to execute my program. In one class i have kept all my variables, in another class i have kept the code to be executed. But I am unable to execute the code. I am getting error message stating that Cannot instantiate class
package BalajiSanthanamAcademy.MavenJava;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public class CommonVariableTest {
public static WebDriver driver=null;
public String key="webdriver.chrome.driver";
public String path="C:\\Program Files\\Java\\chromedriver_win32\\chromedriver.exe";
public String baseUrl = "https://www.expedia.co.in/";
public String expUrl = "https://www.expedia.co.in/";
public String Yatra = "https://www.yatra.com/";
public String expYatra = "https://www.yatra.com/";
//yatra search
WebElement departFrom =driver.findElement(By.xpath("//input[#id='BE_flight_origin_city']"));
//Flying From class variables
public String Depature = "CJB";
public String goingTo = "MAA";
//Flying To class variables
//Declaring departure and return date
public String departureDate = "07/22/2020";
public String returnDate = "10/15/2020";
}
and below class is the one which i used to execute
package BalajiSanthanamAcademy.MavenJava;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.concurrent.TimeUnit;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class YatraLoginTest extends CommonVariableTest {
WebDriver driver;
#BeforeClass
public void setup()
{
System.setProperty(key,path);
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().deleteAllCookies();
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
}
#Test (priority=1)
public void setBaseURL()
{
driver.get(Yatra);
System.out.println(driver.getCurrentUrl());
try{
Assert.assertEquals(expYatra, driver.getCurrentUrl());
System.out.println("Navigated to correct webpage");
}
catch(Throwable pageNavigationError)
{
System.out.println("Didn't navigate to correct webpage");
}
}
#Test (priority=2)
public void Login() throws InterruptedException
{
driver.findElement(By.cssSelector("body.wrapper-snipe.wrapper-toucan.tenantwrapper-dom.catwrapper-home:nth-child(2) div.theme-snipe:nth-child(2) div.yatra-header.headerGrp div.wrapper div.header-container.desktop-only div.header-right-menu.menu.ftL div.settings ul.justified-menu.desktop-navs.settings-content.responsivetabshow li.list-dropdown:nth-child(1) > a.dropdown-toggle")).click();
driver.findElement(By.cssSelector("#signInBtn")).click();
WebDriverWait w =new WebDriverWait(driver,10);
w.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[#id='login-input']")));
driver.findElement(By.xpath("//input[#id='login-input']")).click();
driver.findElement(By.xpath("//input[#id='login-input']")).sendKeys("balajimscit09#gmail.com");
Thread.sleep(2000L);
driver.findElement(By.cssSelector("#login-continue-btn")).click();
WebDriverWait x =new WebDriverWait(driver,10);
x.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#login-password")));
driver.findElement(By.cssSelector("#login-password")).click();
driver.findElement(By.cssSelector("#login-password")).sendKeys("Welcome-1");
driver.findElement(By.cssSelector("#login-submit-btn")).click();
}
#Test (priority=3)
public void HomepageValidation() throws InterruptedException
{
WebDriverWait Y =new WebDriverWait(driver,15);
Y.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[#class='dropdown-toggle loginUserName']")));
String Wel = driver.findElement(By.xpath("//a[#class='dropdown-toggle loginUserName']")).getText();
Assert.assertEquals(Wel,"Hi Balaji");
System.out.println(Wel+" = Login details Sucessfully validated");
}
#Test (priority=4)
public void yatraSearch() throws InterruptedException
{
//Round trip tab
driver.findElement(By.xpath("//a[#class='blur_class']")).click();
Thread.sleep(3000L);
//Depart from
departFrom.click();
Thread.sleep(3000L);
departFrom.sendKeys("CJB");
Thread.sleep(3000L);
departFrom.sendKeys(Keys.ENTER);
Thread.sleep(3000L);
departFrom.getAttribute("value");
//Going To
WebElement goinTo =driver.findElement(By.xpath("//input[#id='BE_flight_arrival_city']"));
Thread.sleep(3000L);
goinTo.sendKeys(goingTo);
Thread.sleep(3000L);
goinTo.sendKeys(Keys.ENTER);
driver.findElement(By.cssSelector("#BE_flight_origin_date")).click();
Thread.sleep(3000L);
WebElement element = driver.findElement(By.xpath("/html[1]/body[1]/div[2]/div[1]/section[1]/div[1]/div[1]/div[1]/section[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/ul[1]/li[2]/ul[1]/li[1]/section[1]/div[1]/div[2]/div[2]/div[2]/div[1]/div[1]/div[1]/table[1]/tbody[1]/tr[2]/td[4]"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
Thread.sleep(3000L);
WebElement element1 = driver.findElement(By.xpath("//div[#class='month-box BE_flight_arrival_date']//div[1]//table[1]//tbody[1]//tr[2]//td[7]"));
Actions actions1 = new Actions(driver);
actions1.moveToElement(element1).click().build().perform();
driver.findElement(By.xpath("//span[#class='txt-ellipses flight_passengerBox travellerPaxBox']")).click();
for(int i=0;i<2;i++)
{
driver.findElement(By.xpath("//div[#class='iePasenger dflex']//div[1]//div[1]//div[1]//span[2]")).click();
driver.findElement(By.xpath("//div[#class='vertical_search_engine']//div[2]//div[1]//div[1]//span[2]")).click();
}
driver.findElement(By.cssSelector("#BE_flight_flsearch_btn")).click();
}
#Test (priority=5)
public void SearchValid() throws InterruptedException
{
System.out.println(driver.findElement(By.xpath("//input[#placeholder='Select Origin']")).getAttribute("value"));
System.out.println(driver.findElement(By.xpath("//input[#placeholder='Select Destination']")).getAttribute("value"));
System.out.println(driver.findElement(By.xpath("//input[#placeholder='Depart']")).getAttribute("value"));
System.out.println(driver.findElement(By.xpath("//input[#placeholder='Return']")).getAttribute("value"));
System.out.println(driver.findElement(By.xpath("//body/section[#id='flightSRP']/section/div/div/form[#id='modifySearch']/ul/li[5]/div[1]")).getAttribute("value"));
driver.findElement(By.xpath("//div[contains(#class,'result-set pr grid')]//div[2]//div[1]//div[1]//div[1]//div[4]//div[1]//div[1]//div[1]//label[1]//div[2]//i[1]")).getText();
driver.findElement(By.xpath("//section[#id='Flight-APP']//section//section//div//div//div//button")).click();
}
}
I am getting the below error message.
[RemoteTestNG] detected TestNG version 7.0.1
org.testng.TestNGException:
Cannot instantiate class BalajiSanthanamAcademy.MavenJava.YatraLoginTest
at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:30)
at org.testng.internal.InstanceCreator.instantiateUsingDefaultConstructor(InstanceCreator.java:193)
at org.testng.internal.InstanceCreator.createInstanceUsingObjectFactory(InstanceCreator.java:113)
at org.testng.internal.InstanceCreator.createInstance(InstanceCreator.java:79)
at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:109)
at org.testng.internal.ClassImpl.getInstances(ClassImpl.java:167)
at org.testng.TestClass.getInstances(TestClass.java:102)
at org.testng.TestClass.initTestClassesAndInstances(TestClass.java:82)
at org.testng.TestClass.init(TestClass.java:74)
at org.testng.TestClass.<init>(TestClass.java:39)
at org.testng.TestRunner.initMethods(TestRunner.java:459)
at org.testng.TestRunner.init(TestRunner.java:338)
at org.testng.TestRunner.init(TestRunner.java:291)
at org.testng.TestRunner.<init>(TestRunner.java:222)
at org.testng.remote.support.RemoteTestNG6_12$1.newTestRunner(RemoteTestNG6_12.java:33)
at org.testng.remote.support.RemoteTestNG6_12$DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_12.java:66)
at org.testng.ITestRunnerFactory.newTestRunner(ITestRunnerFactory.java:55)
at org.testng.SuiteRunner$ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:676)
at org.testng.SuiteRunner.init(SuiteRunner.java:178)
at org.testng.SuiteRunner.<init>(SuiteRunner.java:112)
at org.testng.TestNG.createSuiteRunner(TestNG.java:1275)
at org.testng.TestNG.createSuiteRunners(TestNG.java:1251)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1100)
at org.testng.TestNG.runSuites(TestNG.java:1039)
at org.testng.TestNG.run(TestNG.java:1007)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
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.Constructor.newInstance(Constructor.java:481)
at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:23)
... 27 more
Caused by: java.lang.NullPointerException
at BalajiSanthanamAcademy.MavenJava.CommonVariableTest.<init>(CommonVariableTest.java:20)
at BalajiSanthanamAcademy.MavenJava.YatraLoginTest.<init>(YatraLoginTest.java:19)
... 33 more
Can you please help me how to resolve
The Root Cause is NullPointerException as shown in last few lines in your logs. The reason is this line -
public static WebDriver driver=null;
You need to create a new instance of WebDriver and assign it to the variable driver
Thank you for the co-ordination. I found the answer at last. The mistake is i have placed an web element in CommonVariableTest class, and tried to access the WebElement from YatraLoginTest class. Hence the error message wasthrown. when i removed the WebElement it is working fine.
Nullpointexception showing here that means url launched but driver instance not created to interact so to initially you have define driver driver as null
I am creating Page Object Model for the first time using selenium and I came across the below error, while executing the code give below. Need help in figuring out what am I missing...
java.lang.NullPointerException at org.openqa.selenium.support.pagefactory.DefaultElementLocator.find
My Code for reference:
package Pages;
import org.openqa.selenium.*;
public class BaseClass {
public static WebDriver driver;
public static String URL1 = "https://math-dad.com";
public void setupWebDriver(String drivername)
{
if (drivername.equalsIgnoreCase("Chrome"))
{
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-notifications");
System.setProperty("webdriver.chrome.driver", "C:\\Drivers\\chromedriver.exe");
driver =new ChromeDriver(options);
}
else if (drivername.equalsIgnoreCase("Fire Fox"))
{
FirefoxOptions options = new FirefoxOptions();
options.addArguments("--disable-notifications");
System.setProperty("webdriver.gecko.driver", "C:\\Drivers\\geckodriver.exe");
driver =new FirefoxDriver(options);
}
}
public BaseClass()
{
System.out.println("Base Class Initiate");
}
}
package Pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class HeaderPage extends BaseClass{
#CacheLookup
#FindBy(xpath = "//div[#class='navbar-header']")
public static WebElement LOGO;
public displayHeader()
{
System.out.println(driver.findElement(By.xpath("//div[#class='navbar-header']")).getText());
}
public HeaderPage()
{
PageFactory.initElements(driver,this);
}
}
public class testHeaderPage extends HeaderPage{
#BeforeTest
public void beforeTest()
{
System.out.println("Before Test");
setupWebDriver("Chrome");
driver.get(URL1);
driver.manage().window().maximize();
driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
}
#Test
public void test1HeaderLOGO()
{
displayHeader(); // this is succesful
String Actual = LOGO.getText(); // Fails from this statement
System.out.println("Header LOGO: "+Actual);
String expected = "Math Dad";
Assert.assertEquals(Actual, expected, "Invalid Header");
}
#AfterTest
public void afterTest() {
drive.close();
}
}
In HeaderPage Classs, I am able to use 'driver' directly, but declaration of Page Factory element is failing. Any help on this please?
Use #BeforeClass annotation with this method so that Before Test driver can be initialized. This method will then execute Before every test.
#BeforeClass
public void setupWebDriver(String drivername) {
if (drivername.equalsIgnoreCase("Chrome"))
{
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-notifications");
System.setProperty("webdriver.chrome.driver", "C:\\Drivers\\chromedriver.exe");
driver =new ChromeDriver(options);
}
else if (drivername.equalsIgnoreCase("Fire Fox"))
{
FirefoxOptions options = new FirefoxOptions();
options.addArguments("--disable-notifications");
System.setProperty("webdriver.gecko.driver", "C:\\Drivers\\geckodriver.exe");
driver =new FirefoxDriver(options);
}
}
I want to use: Login_Page Login = PageFactory.initElements(driver, Login_Page.class); in a unique way in all steps.
When I use it for each step I have no problems, but on the contrary Java shows me the error: " Value driver is always 'null'".
I would also like to replace Thread.sleep (2000); for a better solution.
Here is my Code:
package stepdefs;
import Pages.Login_Page;
import cucumber.api.java.pt.Dado;
import cucumber.api.java.pt.Entao;
import cucumber.api.java.pt.Quando;
import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import java.util.concurrent.TimeUnit;
public class StepDefinitions {
WebDriver driver;
Login_Page Login = PageFactory.initElements(driver, Login_Page.class);
#Dado("^que que estou na pagina principal do Gmail\\.$")
public void que_que_estou_na_pagina_principal_do_Gmail () throws Exception
{
System.setProperty("webdriver.chrome.driver", "C:\\browsers\\chromedriver.exe");
driver = new ChromeDriver();
driver.navigate().to("https://www.gmail.com");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
#Quando("^forneco as credenciais validas\\.$")
public void forneco_as_credenciais_validas () throws Exception {
// Login_Page Login = PageFactory.initElements(driver, Login_Page.class);
Login.setEmail("rbkamontana#gmail.com");
Login.ClickOnNextButton();
Thread.sleep(2000);
Login.setSenha("automation10");
Thread.sleep(3000);
Login.ClickOnEnterButton();
driver.manage().window().maximize();
Thread.sleep(3000);
}
#Entao("^posso ver que estou logado\\.$")
public void posso_ver_que_estou_logado () throws Exception {
driver.findElement(By.xpath("//*[#id=\"gb\"]/div[2]/div[3]/div[1]/div[2]/div/a/span")).click();
String stringAtual = driver.findElement(By.xpath("//*[#id=\"gb\"]/div[2]/div[4]/div[1]/div[2]/div[1]")).getText();
String StringEsperada = "Rebeka Montana";
Assert.assertTrue(stringAtual.contains(StringEsperada));
//driver.quit();
}
}
Instead of Thread.sleep you can use selenium WebDriverWait function by a Locator.
Ref:
https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/WebDriverWait.html
void waitForElement(By Locator){
WebDriverWait myWait = new WebDriverWait(myDriver, 20);
myWait.until(ExpectedConditions.visibilityOfElementLocated(Locator));
}
Try initiating this inside of a constructor instead:
public StepDefinitions(){
driver = new ChromeDriver();
Login = PageFactory.initElements(driver, Login_Page.class);
}
An instance method is initializing the driver field at runtime, which explains why things work inside the step definition method. The solution is deceptively simple: create a getter method for the page model:
public class StepDefinitions {
WebDriver driver;
Login_Page login;
private Login_Page getLoginPage() {
if (login == null) {
login = PageFactory.initElements(driver, Login_Page.class);
}
return login;
}
#Quando("^forneco as credenciais validas\\.$")
public void forneco_as_credenciais_validas () throws Exception {
Login_Page login = getLoginPage();
login.setEmail("rbkamontana#gmail.com");
login.ClickOnNextButton();
Thread.sleep(2000);
login.setSenha("automation10");
Thread.sleep(3000);
login.ClickOnEnterButton();
driver.manage().window().maximize();
Thread.sleep(3000);
}
I had tried to create method and call it from another file to the main class but It won't work the error message said "java.lang.NullPointerException"
Main.class
Keywords kw = new Keywords();
#When("^gmailDD$")
public void gmailDD() throws Throwable{
WebDriverWait wait5s = new WebDriverWait(driver, 5);
String regis = "/html/body/div[2]/div[1]/div[5]/ul[1]/li[3]/a";
String dd = "/html/body/div[1]/div/footer/div/div/div[1]";
String empty = "/html/body/div[1]/div/footer";
kw.clickbyxpath(regis);
String handle= driver.getWindowHandle();
System.out.println(handle);
// Store and Print the name of all the windows open
Set handles = driver.getWindowHandles();
System.out.println("Log window id: "+handles);
driver.switchTo().window("6442450949");
kw.clickbyxpath(empty);
kw.clickbyxpath(dd);
}`
Method.class
WebDriver saddriver;
public void clickbyxpath (String xpathvalue) throws InterruptedException, IOException
{
WebDriverWait sad = new WebDriverWait(saddriver, 10);
//To wait for element visible
System.out.println(xpathvalue);
String x = xpathvalue;
sad.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(x)));
wowdriver.findElement(By.xpath(x)).click();
}
I had tried to do the same coding in the same file, It has no problem but when I move Method.class to the new file, error message said "java.lang.NullPointerException" but I can get "xpathvalue" value.
This Error occur because of it will not able to find your driver instance.
refer below code snippet. this is not cucumber example but you can get idea by this.
Method.class
package testing.framework;
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;
public class Method {
public WebDriver driver;
WebElement _clickForSearch;
public Method(WebDriver driver) {
this.driver = driver;
}
public Method clickByXpath(String xpathValues) {
WebDriverWait wait = new WebDriverWait(driver, 10);
_clickForSearch = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xpathValues)));
_clickForSearch.click();
return this;
}
}
Testing.class
package testing.framework;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class Testing {
public static WebDriver driver;
public static void main(String[] args) {
getWebDriver();
String xpathValues= "//div[#class='FPdoLc VlcLAe']//input[#name='btnK']";
Method m1 = new Method(driver);
m1.clickByXpath(xpathValues);
}
public static void getWebDriver() {
System.setProperty("webdriver.chrome.driver", "Your chrome driver path");
driver = new ChromeDriver();
driver.get("https://www.google.com");
}
}
You need to pass your driver instance to another.
So I would suggest you take the webdriver wait out of your method and instantiate it when instantiating your webdriver. I would then create methods like so:
Driver class
private final String USER_DIRECTORY = System.getProperty("user.dir");
private final int GLOBAL_TIMEOUT = 30;
private WebDriver webDriver;
private WebDriverWait webDriverWait;
public Driver(String browserName) {
this.browserName = browserName;
System.out.println(browserName);
switch (this.browserName.toUpperCase()) {
case "CHROME":
initializeChromeDriver();
break;
}
}
private void initializeChromeDriver() {
System.setProperty("webdriver.chrome.driver", USER_DIRECTORY.concat("\\drivers\\chromedriver.exe"));
webDriver = new ChromeDriver();
webDriver.manage().window().maximize();
webDriverWait = new WebDriverWait(webDriver, GLOBAL_TIMEOUT);
}
Click method
public void buttonClickByXpath(String xpath) {
try {
WaitForPreseneOfElement(xpath);
webDriver.findElement(By.xpath(xpath)).click();
} catch (Exception e) {
takeScreenshot();
AllureLog("Failed to click on the button object. Please check your xpath. | xpath used = " + xpath + "");
Assert.fail();
}
}
Test Class
Import your driver class
import Base.Driver;
Then you would need declair your driver class like so:
Driver driver;
Now you will have access to your method using
driver.buttonClickByXpath(//YourXpathHere)
The problem is "Method m1 = new Method(driver);" keyword,
I had coded this line outside the main method.
thank you very much, Sir
I am quite new to Selenium WebDriver. A java.lang.NullPointerException has been troubling me for sometime now, and I cannot understand why. Following are my classes which are quite simple actually:
suiteBase.java
package utilities.suiteBase;
import org.openqa.selenium.WebDriver;
import actions.testPage1.testPage1Actions;
import ui_map.testPage1.TestPage1UI;
public class suiteBase {
public WebDriver driver;
protected static TestPage1UI tpui = new TestPage1UI();
protected static testPage1Actions tpa = new testPage1Actions();
}
testPage1Actions.java
package actions.testPage1;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriver.Timeouts;
import org.openqa.selenium.WebElement;
import utilities.suiteBase.suiteBase;
public class testPage1Actions extends suiteBase {
public WebDriver driver;
public void test(WebDriver driver){
WebElement loc1 = driver.findElement(By.xpath("id('email')"));
loc1.sendKeys("testing");
System.out.println("done...");
}
}
TestPage1.java
package testPage1;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import utilities.suiteBase.BrowserOpen;
import utilities.suiteBase.suiteBase;
public class TestPage1 extends suiteBase{
public WebDriver driver;
BrowserOpen browse = new BrowserOpen();
#Parameters({ "browserType", "appURL" })
#Test(priority = 1)
public void openBrowser(String browserType, String appURL){
browse.setUp(browserType, appURL);
System.out.println("Done....");
}
#Test(priority = 2)
public void testCase1() throws InterruptedException{
driver.wait(1000);
tpa.test(driver);
}
}
I run the TestPage1.java file using XML, where I encounter following error:
java.lang.NullPointerException at
testPage1.TestPage1.testCase1(TestPage1.java:28) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497) at
org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) at
org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) at
org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) at
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767) at
org.testng.TestRunner.run(TestRunner.java:617) at
org.testng.SuiteRunner.runTest(SuiteRunner.java:334) at
org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) at
org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) at
org.testng.SuiteRunner.run(SuiteRunner.java:240) at
org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at
org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at
org.testng.TestNG.runSuitesSequentially(TestNG.java:1198) at
org.testng.TestNG.runSuitesLocally(TestNG.java:1123) at
org.testng.TestNG.run(TestNG.java:1031) at
org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:137)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:58)
Also I have browserOpen class which I run before TestPage1, in which I declare the WebDriver
package utilities.suiteBase;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import utilities.suiteBase.BrowserOpen;
public class BrowserOpen {
public WebDriver driver;
static String driverPath = "E:\\Selenium\\";
public void setUp(String browserType, String appURL) {
try {
setDriver(browserType, appURL);
} catch (Exception e) {
System.out.println("Error....." + e.getStackTrace());
}
}
#AfterClass
public void tearDown() {
driver.quit();
}
private void setDriver(String browserType, String appURL) {
switch (browserType) {
case "chrome":
driver = initChromeDriver(appURL);
break;
case "firefox":
driver = initFirefoxDriver(appURL);
break;
default:
System.out.println("browser : " + browserType
+ " is invalid, Launching Firefox as browser of choice..");
driver = initFirefoxDriver(appURL);
}
}
private static WebDriver initChromeDriver(String appURL) {
System.out.println("Launching google chrome with new profile..");
System.setProperty("webdriver.chrome.driver", driverPath + "chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.navigate().to(appURL);
System.out.println("URL inserted");
// driver.get(appURL);
return driver;
}
private static WebDriver initFirefoxDriver(String appURL) {
System.out.println("Launching Firefox browser..");
WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.navigate().to(appURL);
return driver;
}
}
I never used this technology before, but I see not inited elements.
public WebDriver driver;
WebDriver was not initialized.
You need to initialize them before using.
Like:
WebDriver driver = new FirefoxDriver();
Or something else. Check this out: http://www.seleniumhq.org/docs/03_webdriver.jsp
-- UPD: Exception is probably throwing at testCase1() tpa.test(WebDriver). tpa is probably null.
you are using #Parameters({ "browserType", "appURL" }) in your TestPage1 class that will come from testng.xml file . Hope your using this xml file to run your test.
When I declared - public static WebDriver driver; before #BeforeSuite
and then inside the method if we again declared as
WebDriver driver = new FirefoxDriver();
and run the script then it shows me java.lang.NullPointerException error.
Please try below code to resolve :-
driver = new Firefoxdriver();
Example -
public class LearnCheckBox {
public static WebDriver driver;
#BeforeSuite
public static void verify_SetupBrowser() throws InterruptedException
{
driver = new FirefoxDriver(); //
driver.get("https://learn.letskodeit.com/p/practice");
driver.manage().window().maximize();
Thread.sleep(2000);
}
Ashish Bind