But I am getting below error. what needs to be done?
java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.WebElement.getTagName()" because "element" is null
package com.privacyshieldtestcases;
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.privacyshieldpageobjects.PrivacyshieldForm;
public class TC_PS_001 extends BaseClass
{
#Test
public void psForm() throws InterruptedException
{
driver.get(url);
WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(30));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("pt1:r1:0:it9::content")));
PrivacyshieldForm ps = new PrivacyshieldForm(driver);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));
ps.setOrgName(Organizationname);
ps.setein(einnumber);
ps.setunsNum(DbunsNumber);
ps.setadd1(addr1);
ps.setCityName(cityname);
ps.setStateName(statename);
ps.setZipName(zipnum);
ps.setFirstName(fname);
ps.setLastName(lname);
ps.setemailname(emailid);
ps.setemailname(Confirmemailid);
ps.setPhonenum(Pnum);
ps.setSelectpay();
ps.setpaynowbutton();
if(driver.findElement(By.id("pt1:r1:1:s1:it1::content")).isDisplayed())
{
Assert.assertTrue(true);
}
else
{
Assert.assertTrue(false);
}
}}
Related
I am using TestNG and Page Object Model.
I have created some test cases. I see that the first two test cases are working. But, the third test case starts on a new page which is opened by the second test case. I am unable to interact with the new page, and getting a Null Pointer Exception error. Not sure what went wrong.
I have three Java classes Here.
This is my base class:
package MYQC_Reusable_Classes;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import com.relevantcodes.extentreports.ExtentReports;
import com.relevantcodes.extentreports.ExtentTest;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
public class MYQC_Base_Class {
public static WebDriver driver = null;
// public static ExtentTest Logger = null;
// public static ExtentReports report = null;
#BeforeSuite
public void initialize() throws IOException {
// report = new ExtentReports("C:\\Users\\fhasan\\Desktop\\ExtentReport"+".html");
System.setProperty("webdriver.chrome.driver", "C:\\Users\\fhasan\\Desktop\\driver\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();`enter code here`
// add the precondition arguments
options.addArguments("start-maximized", "incognito");
driver = new ChromeDriver(options);
// To maximize browser
driver.manage().window().maximize();
// Implicit wait
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
#BeforeMethod
public void timer(){
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
#AfterSuite
// Test cleanup
public void TeardownTest() throws InterruptedException {
Thread.sleep(4000);
MYQC_Base_Class.driver.quit();
}
}
This is my page class:
package MYQC_Browser_Pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
public class MYQC_Login_Page {
WebDriver driver;
// constructor that will be automatically called as soon as the object of the
// class is created
public MYQC_Login_Page(WebDriver driver) {
this.driver = driver;
}
#FindBy(how = How.ID, using = "loginName")
public static WebElement userNameField;
#FindBy(how = How.ID, using = "loginPassword")
public static WebElement passwordField;
#FindBy(how = How.ID, using = "loginButton")
public static WebElement clickLogin;
//Method to enter username
public void clickUserName() {
userNameField.click();
}
public void enterUserName(String user) {
userNameField.sendKeys(user);
}
public void clickPass() {
passwordField.click();
}
public void enterPassword(String pass) {
passwordField.sendKeys(pass);
}
//Method to click on Login button
public void clickLoginButton() {
clickLogin.click();
}
}
This is my first test case which works fine:
package MYQC_TestCase_Classes;
import MYQC_Browser_Pages.CUST4_MYQC_Login_Selection_Page;
import MYQC_Reusable_Classes.MYQC_Base_Class;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.support.PageFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
import java.util.PriorityQueue;
public class TC001_MYQC_Login_Selection_Button_Text extends MYQC_Base_Class {
#Test()
public void MYQC_Login_Button_Text() throws InterruptedException, IOException {
//creating anb object of the CUST4_MYQC_Login_Selection_Page
CUST4_MYQC_Login_Selection_Page go_To_MYQC_Page = PageFactory.initElements(driver, CUST4_MYQC_Login_Selection_Page.class);
// going to the cust4 myqc link
driver.get("https://mmhcustfour.com");
Thread.sleep(3000);
Assert.assertEquals(go_To_MYQC_Page.buttonText(), "Login with Quickcharge Authentication");
//System.out.print( go_To_MYQC_Page.buttonText());
}
}
This is my second test case (on the same page) which also works fine:
package MYQC_TestCase_Classes;
import MYQC_Browser_Pages.CUST4_MYQC_Login_Selection_Page;
import MYQC_Browser_Pages.MYQC_Login_Page;
import MYQC_Reusable_Classes.MYQC_Base_Class;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
public class TC002_MYQC_Login_Selection_Test extends MYQC_Base_Class {
#Test
public void Go_To_MYQC_Login_Page_Test() throws InterruptedException, IOException {
//creating anb object of the CUST4_MYQC_Login_Selection_Page
CUST4_MYQC_Login_Selection_Page go_To_MYQC_Page = PageFactory.initElements(driver, CUST4_MYQC_Login_Selection_Page.class);
//Clicking on the button to go to the MYQC login page
go_To_MYQC_Page.preClickLogin();
// waiting few seconds to get a screenshot of the page
Thread.sleep(2000);
File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(src, new File("C:\\Users\\fhasan\\Desktop\\Selenium Screenshots\\MYQCLogin_Page.png"));
Thread.sleep(2000);
}
}
This is my third test case class: (which creates the error)
package MYQC_TestCase_Classes;
import MYQC_Browser_Pages.MYQC_Login_Page;
import MYQC_Reusable_Classes.MYQC_Base_Class;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TC003_MYQC_Prepaid_Login_Test extends MYQC_Base_Class {
//creating an object of the page
MYQC_Login_Page login_page = PageFactory.initElements(driver,MYQC_Login_Page.class);
#Test
public void MYQC_Login() throws InterruptedException {
Thread.sleep(2000);
login_page.clickUserName();
login_page.enterUserName("***");
Thread.sleep(2000);
login_page.clickPass();
login_page.enterPassword("***");
login_page.clickLoginButton();
}
}
After running the code, I am getting the following error:
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.$Proxy9.click(Unknown Source)
at MYQC_Browser_Pages.MYQC_Login_Page.clickUserName(MYQC_Login_Page.java:30)
at MYQC_TestCase_Classes.TC003_MYQC_Prepaid_Login_Test.MYQC_Login(TC003_MYQC_Prepaid_Login_Test.java:20)
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:498)
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 com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
your username element is not found on your 3rd test, please do following actions
at MYQC_Browser_Pages.MYQC_Login_Page.clickUserName(MYQC_Login_Page.java:30)
Please add screenshot just before entering username,
Add wait time to load website completely.
still not helpful,
better you should isolate all your test methods.
no static properties
login and logout should be in before method and after method - test method should be independent
use common method for assertions so whenever get failed, automatically add screenshot
I am getting java.lang.NullPointerException while following Page Object Model with Cucumber. I am not sure what I am doing wrong here, please help me on this
Below is my Test Base Class:
package com.qa.util;
import java.io.FileInputStream;
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.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
public class TestBase {
public static WebDriver driver;
public static Properties prop;
//public WebDriver initializeWebDriver() throws IOException
public static void initializeWebDriver() throws IOException
{
prop = new Properties();
FileInputStream fis = new FileInputStream("D:\\Automation\\WebAutomation\\src\\main\\java\\com\\qa\\config\\config.properties");
prop.load(fis);
String browserName = prop.getProperty("browser");
//Execute in Chrome
if(browserName.equals("Chrome"))
{
System.setProperty("webdriver.chrome.driver","D:\\Drivers\\chromedriver.exe");
driver=new ChromeDriver();
//driver.manage().window().maximize();
}
//Execute in FireFox
else if(browserName.equals("Firefox"))
{
System.setProperty("webdriver.gecko.driver","D:\\Drivers\\geckodriver-v0.19.1-win64(1)");
driver = new FirefoxDriver();
}
driver.manage().window().maximize();
driver.get(prop.getProperty("appURL"));
driver.manage().timeouts().pageLoadTimeout(TestUtil.PAGE_LOAD_TIMEOUT,TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(TestUtil.IMPLICIT_WAIT, TimeUnit.SECONDS);
return driver;
}
}
Below is my login page Objects Class
package com.qa.pages;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import com.qa.util.TestBase;
public class LoginPage extends TestBase {
public LoginPage() {
/*super(driver);
this.driver=driver;*/
PageFactory.initElements(driver, this);
}
// Login Page Title
public String validateLoginPageTitle() {
return driver.getTitle();
}
// Welcome text
#FindBy(css=".login-form > h2:nth-child(1)")
WebElement header;
public String loginPageHeaderText() {
return header.getText();
}
}
Below is my Step Def
package com.qa.stepdefinations;
import java.io.IOException;
import org.testng.Assert;
import com.qa.pages.LoginPage;
import com.qa.util.TestBase;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
public class LoginStepDef extends TestBase {
LoginPage LoginPage = new LoginPage();
#Given("^I launch browser and access the GE URL$")
public void i_launch_browser() throws IOException {
TestBase.initializeWebDriver();
}
#Then("^I am on Login Page$")
public void i_am_on_login_page() {
String expectedLoginPageTile = prop.getProperty("LoginPage_Title");
String actualLoginPageTitle = LoginPage.validateLoginPageTitle();
Assert.assertEquals(actualLoginPageTitle, expectedLoginPageTile);
}
#Then("^I verify header text is displaying$")
public void i_verify_header_text_is_displaying() {
String expectedHeaderText = prop.getProperty("LoginPage_Expected_Header");
String actualdHeaderText = LoginPage.loginPageHeaderText();
Assert.assertEquals(actualdHeaderText, expectedHeaderText);
}
}
The script is working fine for LoginPage.validateLoginPageTitle(); however, I am not sure why it is not working for the next step i.e. LoginPage.loginPageHeaderText();
It seems issue is with your locator, check if it is correct.
#FindBy(css="<b><em>.login-form > h2:nth-child(1)</em></b>")
WebElement header;
I can't find a button using id or xpath using pagefactory on expedia.com website. It says no such element: Unable to locate element "tab-flight-tab-flp".
I tried using id and xpath. It gives same error. I wonder this is happening?
It says no such element: Unable to locate element "tab-flight-tab-flp".
I tried using id and xpath. It gives same error. I wonder this is happening?
It says no such element: Unable to locate element "tab-flight-tab-flp".
I tried using id and xpath. It gives same error. I wonder this is happening?
package UsefulPackages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class SearchPageFactory {
WebDriver adriver;
#FindBy(id="tab-flight-tab-flp")
WebElement flightTab;
//constructor
public SearchPageFactory(WebDriver driver) {
this.adriver = driver;
PageFactory.initElements(driver, this);
}
public void clickFlightTab(){
flightTab.click();
}
}
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.Alert;
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.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import UsefulPackages.SearchPageFactory;
public class FrameworkTestCase {
WebDriver achromeDriver;
String abaseUrl;
SearchPageFactory apagefactory;
#Before
public void setUp() throws Exception {
abaseUrl = "http://www.expedia.com";
System.setProperty("webdriver.chrome.driver", "C:\\Selenium\\ChromeDirver\\chromedriver.exe");
achromeDriver = new ChromeDriver();
apagefactory = new SearchPageFactory(achromeDriver);
chromeDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
achromeDriver.manage().window().maximize();
System.out.println("setup completed");
}
#Test
public void test() {
achromeDriver.get(abaseUrl);
WebDriverWait awaittime = new WebDriverWait(achromeDriver, 10);
System.out.println("page factory created");
apagefactory.clickFlightTab();
}
}
Is you want get Flights button ?
It will achieve with :
Find by id :
#FindBy(id="tab-flight-tab-hp")
Find by xpath :
#FindBy(xpath="//button[#id='tab-flight-tab-hp']")
I have created the base class in page package which is under src/test/java/Stepdefinations/pages. Created the Account class(page object) in page package. Created Account steps class(step defination file), Runner class in stepdefination package.
When I executed the runner class, I'm able to open the browser but the click method is selenium base class is not happening.
//Selenium base class:
package Stepdfinations.pages;
import java.io.File;
import java.net.URL;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
import org.apache.log4j.Logger;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
public class SeleniumBaseclass
{
Properties prop;
public HttpURLConnection connection = null;
String currenturl;
protected WebDriver driver;
public SeleniumBaseclass (WebDriver driver)
{
this.driver=driver;
}
public void Property() throws Exception
{
File f= new File("C:\\Users\\watareuman9\\workspace\\Cucumberproject\\src\\test\\resources\\data\\config.property");
FileInputStream fis = new FileInputStream(f);
prop=new Properties();
prop.load(fis);
System.setProperty("webdriver.chrome.driver", getChromespath());
driver=new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.get(getAppurl());
Thread.sleep(500);
}
public String getChromespath()
{
return prop.getProperty("ChromePath");
}
public String getAppurl()
{
return prop.getProperty("URL");
}
//click method
public void click(String objstr,WebElement objname)
{try
{
Thread.sleep(5000);
objname.click();
System.out.println("'"+objstr+"'"+"is clickde");
}
catch(Exception e)
{
getHttpResponse();
}
}
public void getCurrenturl()
{
String currenturl=driver.getCurrentUrl();
}
public void getHttpResponse()
{
try
{
getCurrenturl();
URL url=new URL(currenturl);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setConnectTimeout(3000);
connection.connect();
if(connection.getResponseCode()==200)
{
System.out.println(currenturl +"-"+connection.getResponseMessage());
}
else if(connection.getResponseCode()==connection.HTTP_NOT_FOUND)
{
System.out.println(currenturl +"-"+connection.getResponseMessage());
}
}
catch(Exception e)
{
e.getMessage();
}
}
public void getQuitdriver()
{
driver.close();
}
}
//Account class(page objects)
package Stepdfinations.pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
public class Account extends SeleniumBaseclass
{
public Account(WebDriver driver)
{
super(driver);
this.driver=driver;
}
#FindBy(how = How.XPATH, using = "//*[#id='bodyContent']/div/div[1]/a[1]/u")
private WebElement login_button;
public void clickLoginButton()
{
click("login_button",login_button);
}
}
//Accountsteps(Step defination file)
package Stepdfinations;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.By;
import Stepdfinations.pages.Account;
import Stepdfinations.pages.SeleniumBaseclass;
public class Acoountsteps
{
WebDriver driver;
Account act;
#Given("^I navigated to the Login page$")
public void i_navigated_to_the_Login_page() throws Throwable
{
act=new Account(driver);
act.Property();
}
#When("^I click on the New Account link$")
public void i_click_on_the_New_Account_link() throws Throwable
{
act.clickLoginButton();
}
}
//Runner class
package Stepdfinations;
import org.junit.runner.RunWith;
import cucumber.api.junit.Cucumber;
import cucumber.api.CucumberOptions;
#RunWith(Cucumber.class)
#CucumberOptions(features="src/test/resources/features")
public class Runner
{
}
Few things you can look into:
Check your x-path (you can use FireBug for it)
Try debug your code - Is debugger landing to you Test or not.
Possibly you need to mention the Test Class or Test Method into your runner class (For example in testNG, if code is run through testNG runner, you need to mention the Test or class into the xml file that testNG use what to execute and what to not).
I downloaded the code below and used it for some tests and u=it ran yesterday but since today the code stopped working. My tests are failing now which was not happening before. It throws up an error saying org.openqa.selenium.ElementNotVisibleException: element is not currently visible so cannot interact with element.
package org.openqa.selenium.example;
//import org.openqa.selenium.browserlaunchers.locators.GoogleChromeLocator;
//import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
//import org.openqa.selenium.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
//import org.openqa.selenium.chrome.*;
import org.openqa.selenium.firefox.*;
import org.openqa.selenium.firefox.FirefoxDriver;
//import org.openqa.selenium.support.ui.Select;
//import org.openqa.selenium.net.UrlChecker;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class KongaUrlTest
{
private WebDriver driver;
private String baseUrl;
//private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
#Before
public void setUp() throws Exception
{
driver = new FirefoxDriver();
baseUrl = "http://www.konga.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
#Test
public void testFirefoxWebdriver() throws Exception
{
driver.get(baseUrl);
driver.findElement(By.cssSelector("a.vertnavlink > span")).click();
try
{
assertEquals("Phones & Tablets | Konga Nigeria", driver.getTitle());
System.out.println(driver.getTitle());
}
catch (Error e)
{
verificationErrors.append(e.toString());
}
}
#After
public void tearDown() throws Exception
{
System.out.println(driver.getCurrentUrl());
driver.quit();
}
}
There's a blocking dialog being displayed. It's probably displayed each time Selenium opens a new browser and navigates to that site. Close that dialog first:
driver.get(baseUrl);
try
{
driver.findElement(By.cssSelector(".fancybox-close")).click();
}
catch { }
driver.findElement(By.cssSelector("a.vertnavlink > span")).click();