FAILED CONFIGURATION: #BeforeClass beforeClass - selenium-webdriver

I am a beginner to Selenium and I am now using #DataProvider in TestNG framework to pass some values in a webpage (learning purpose). Below is my code:
package Framework;
import org.testng.annotations.Test;
import org.testng.annotations.DataProvider;
import org.testng.annotations.BeforeClass;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
public class DataProv {
WebDriver d;
#Test(dataProvider = "dp", priority=0)
public void signin(String uname, String pwd) throws InterruptedException {
d.findElement(By.linkText("SIGN-ON")).click();
d.findElement(By.name("userName")).sendKeys(uname);
d.findElement(By.name("password")).sendKeys(pwd);
Thread.sleep(3000);
}
#Test(dataProvider = "dp1", priority=1)
public void reg(String fname) throws InterruptedException {
d.findElement(By.linkText("REGISTER")).click();
d.findElement(By.name("firstName")).sendKeys("fname");
d.findElement(By.name("register")).click();
Thread.sleep(3000);
}
#DataProvider
public Object[][] dp() {
return new Object[][] {
new Object[] { "Rachel", "India123" },
new Object[] { "Rita", "pass123" },
};
}
#DataProvider
public Object[][] dp1() {
return new Object[][] {
new Object[] { "Rachel"},
new Object[] { "Rita"},
};
}
#BeforeClass
public void beforeClass() {
d.manage().window().maximize();
d = new FirefoxDriver();
d.get("http://newtours.demoaut.com/");
}
#AfterClass
public void afterClass() {
d.close();
}
}
No, I am getting the following error
FAILED CONFIGURATION: #BeforeClass beforeClass
java.lang.NullPointerException
Can somebody help me in resolving this issue.
Thanks in advance

What is Null Pointer Exception?
This issue is coming because you are trying to maximise the browser without it being initialized.
You just have to reverse the order of launching the browser and then maximising it in your #BeforeClass method.
So when you say WebDriver d, reference d is NULL, so when you are trying to call the method manage() on d you basically are trying to call this method using null object i.e. null.manage() thats why Null Pointer Exception so you first have to intantiate it using d = new FirefoxDriver();
d = new FirefoxDriver();
d.manage().window().maximize();

Check your browser invoking method. I think your driver (d) is not able to find the driver under test . you need to point the driver path before invoking driver == new driver. below is the chrome driver code for your reference.
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+ "\\src\\test\\resources\\executables\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();

Related

Type mismatch: cannot convert from ChromeDriver to WebDriver

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class Sanclass {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.getProperty("webdriver.chrome.driver", "C:\\Users\\SANIKA K\\Downloads\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("https://www.facebook.com/");
}
}
Type mismatch: cannot convert from ChromeDriver to WebDriver
It seems like you cant convert a WebDriver to a ChromeDriver like that. Try to start your driver like this instead:
public static void main(String[] args) {
service = new ChromeDriverService.Builder()
.usingDriverExecutable(new File("path/to/my/chromedriver.exe"))
.usingAnyFreePort()
.build();
service.start();
}
Reference:
https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/chrome/ChromeDriver.html

unable to locate the password field in gmail .getting the error "webdriver exception"

import java.util.concurrent.TimeUnit;
import org.testng.annotations.*;
import static org.testng.Assert.*;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
public class Withtestng {
private WebDriver driver;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
#BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
System.setProperty("webdriver.gecko.driver", "/usr/bin/geckodriver");
System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
#Test
public void testGmailLogInHtml() throws Exception {
driver.get("https://www.google.com/");
driver.findElement(By.linkText("Gmail")).click();
driver.findElement(By.xpath("/html/body/nav/div/a[2]")).click();
driver.findElement(By.id("identifierId")).click();
driver.findElement(By.id("identifierId")).clear();
driver.findElement(By.id("identifierId")).sendKeys("xyz#gmail.com");
driver.findElement(By.xpath("//div[#id='identifierNext']/content")).click();
driver.findElement(By.xpath("//input[#class='whsOnd zHQkBf']")).click();
driver.findElement(By.xpath("//input[#class='whsOnd zHQkBf']")).clear();
driver.findElement(By.xpath("//input[#class='whsOndzHQkBf']")).sendKeys("xyz");***
driver.findElement(By.xpath("//div[#id='passwordNext']/content/span"))click();
driver.findElement(By.xpath("//div[#id='gb']/div/div/div[2]/div[5]/div/a/span")).click();
driver.findElement(By.id("gb_71")).click();
}
Your script execution speed and page load time is not in sync, try to use
pageLoadTimeout.
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);//
Or
You can wait for particular condition becomes true(ie. wait until element present using wait.until) and then perform operation on it.

how to call function/method form one class to another class in selenium webdriver using java

I want to call login and search method from two different class into the main class. I have written the two diff classes for login and search but when I am calling both method in class containg main method .it gives me an error as below>>
Exception in thread "main" java.lang.NullPointerException
at Test_package_Ted_baker.search.search_1(search.java:14)
at Test_package_Ted_baker.SHopping.main(SHopping.java:16)
Can someone please help me to find out solution about how to call methods from one class to another class. My code is as below>>
Main class
package Test_package_Ted_baker;
import org.openqa.selenium.WebDriver;
public class SHopping {
static WebDriver driver;
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
login_Ted_Baker obj=new login_Ted_Baker();
obj.login_to_Ted_Baker("ss3777010#gmail.com", "google#123");
System.out.println("Login sucessfully");
search obj1=new search();
obj1.search_1();
obj.user_logout();
System.out.println("User log out sucessfully");
}
}
Login class
package Test_package_Ted_baker;
import java.util.HashMap;
import java.util.Map;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class login_Ted_Baker {
WebDriver driver;
public static void main (String [] args) throws InterruptedException
{
login_Ted_Baker obj=new login_Ted_Baker();
obj.login_to_Ted_Baker("ss3777010#gmail.com", "google#123");
System.out.println("Login Sucessfully");
obj.user_logout();
}
public void usename( String Username)
{
WebElement Username_TB=driver.findElement(By.name("j_username"));
Username_TB.sendKeys(Username);
}
public void password(String Password)
{
WebElement Password_TB=driver.findElement(By.name("j_password"));
Password_TB.sendKeys(Password);
}
public void submit()
{
driver.findElement(By.xpath(".//*[#id='command']/div/input ")).click();
}
public void login_Ted_Baker(WebDriver driver){
this.driver = driver;
}
public void user_logout() throws InterruptedException
{
Thread.sleep(1000);
WebElement Sign_in_link=driver.findElement(By.xpath(".//*[#id='page']/header/div/nav[1]/ul/li[3]/div/a"));
WebElement Sign_out_button=driver.findElement(By.xpath(".//*[#id='account']/ul/li[2]/a"));
Thread.sleep(1000);
Actions Act1=new Actions(driver);
Act1.moveToElement(Sign_in_link).click();
Act1.moveToElement(Sign_out_button).click().build().perform();
System.out.println("Logout sucessfully");
}
public void login_to_Ted_Baker(String Username,String Password) throws InterruptedException
{
System.setProperty("webdriver.chrome.driver","C:\\Chrome\\chromedriver_win32\\chromedriver.exe");
//System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.Jdk14Logger");
Thread.sleep(2000);
ChromeOptions options = new ChromeOptions();
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("credentials_enable_service", false);
prefs.put("password_manager_enabled", false);
options.setExperimentalOption("prefs", prefs);
options.addArguments("start-maximized");
options.addArguments("disable-infobars");
driver = new ChromeDriver(options);
try{
driver.get("http://www.tedbaker.com/");
WebDriverWait wait = new WebDriverWait(driver, 40);
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("html/body/div[3]/div[2]/div/div/ul/li[1]/a")));
if(driver.findElement(By.xpath("html/body/div[3]/div[2]/div/div/ul/li[1]/a")).isDisplayed())
{
driver.findElement(By.xpath("html/body/div[3]/div[2]/div/div/ul/li[1]/a")).click();
}
driver.findElement(By.xpath(".//*[#id='page']/header/div/nav[1]/ul/li[3]/div/a")).click();
Thread.sleep(2000);
this.usename(Username);
this.password(Password);
this.submit();
}catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
searching class
package Test_package_Ted_baker;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;
public class search {
WebDriver driver;
public void search_1() throws InterruptedException
{
WebElement Search_Item=driver.findElement(By.xpath("html/body/div[2]/header/div/nav[2]/section/ul[2]/li[1]/a/span[1]"));
Search_Item.click();
WebElement Seacrh_item_message=driver.findElement(By.id("search"));
WebElement Search_textbox=driver.findElement(By.xpath("html/body/div[2]/header/div/form/div[1]/ol/li[1]/input"));
Search_textbox.sendKeys("Watches");
driver.findElement(By.xpath("html/body/div[2]/header/div/form/div[1]/ol/li[2]/input")).click();
WebElement SearchResult_pagemessage=driver.findElement(By.xpath("html/body/div[2]/div/div/div[1]/div/h1"));
driver.findElement(By.xpath("html/body/div[2]/div/div/div[1]/div/div/div/span[1]")).click();
WebElement Item_Tobuy = driver.findElement(By.xpath("html/body/div[2]/div/div/div[2]/div[2]/div[1]/article/div[2]/header/div/h4/a"));
JavascriptExecutor jse1= (JavascriptExecutor)driver;
jse1.executeScript("window.scrollBy(0,400)", "");
Item_Tobuy.click();
driver.findElement(By.xpath("html/body/div[2]/div/div/div[2]/div[1]/section[2]/form/ol/li[2]/span/span/select")).click();
Select dropdown1=new Select(driver.findElement(By.id("qty")));
dropdown1.selectByVisibleText("1");
driver.findElement(By.id("qty")).click();
// driver.findElement(By.xpath("*[#classname='button add_to_cart major full_mobile colour_dark']/div[2]/div[1]/div/input[1]")).click();
// driver.findElement(By.xpath("//*[#id='add_to_cart_form']/div[2]/div[2]/a/span[1]/span[1]")).click();
driver.findElement(By.xpath("//input[contains(#class,'add_to_cart')]")).click();
Thread.sleep(1000);
Actions act=new Actions(driver);
WebElement My_cart_button=driver.findElement(By.xpath("html/body/div[2]/header/div/nav[2]/section/ul[2]/li[3]/a/span[2]"));
//WebElement My_cart_button=driver.findElement(By.xpath("//input[contains(#class,'My bag')]"));
WebElement View_bag_checkout_button=driver.findElement(By.xpath("html/body/div[2]/header/div/nav[2]/section/ul[2]/li[3]/div/ul/li/a"));
act.moveToElement(My_cart_button).moveToElement(View_bag_checkout_button).click().build().perform();
driver.findElement(By.xpath("html/body/div[2]/div/div/div/section/table/tbody/tr/td[2]/form/ul/li[2]/a")).click();
String Cart_empty_mesg=driver.findElement(By.xpath("html/body/div[1]/div/div/div/header/h1")).getText();
System.out.println(Cart_empty_mesg);
String Actual_cart_empty_msg="Your shopping bag is empty";
if(Cart_empty_mesg==Actual_cart_empty_msg)
{
System.out.println("Cart is empty, you can add product cart");
}
}
}
This might sound harsh, but first of all you should read about
Null Pointer Exception from this link.
How to debug from a StackTrace from this link.
Why using absolute xpath, or xpaths locators in general is a bad strategy from here.
From your stack trace,
Exception in thread "main" java.lang.NullPointerException at
Test_package_Ted_baker.search.search_1(search.java:14) at
Test_package_Ted_baker.SHopping.main(SHopping.java:16)
I see that your code in Search class
WebElement Search_Item=driver.findElement(By.xpath("html/body/div[2]/header/div/nav[2]/section/ul[2]/li[1]/a/span[1]"));
is not correct. I suspect your locator is not correct for this one. The element can easily be identified using an id attribute, as
driver.findElement(By.id("search"));
or , if you're using xpaths, then
driver.findElement(By.xpath("//*[#id="search"]"));
should do away the NPE - but not sure since you've used a lot of absolute xpaths - which is a horrible practise.

How to declare the driver (chrome/ie) globally which is used in both main and sub methods in cross Browser testing

While automating cross browser test, I used the driver in both main and sub method. It is showing syntax error in the line "System.setProperty("webdriver.chrome.driver","D:\chromedriver_win32"
Thanks
import org.openqa.selenium.chrome.ChromeDriver;
public class MyClass {
System.setProperty("webdriver.chrome.driver","D:\\chromedriver_win32\\chromedriver.exe");
static WebDriver driver = new ChromeDriver();
public static void main(String[] args) throws IO Exception {
driver.findElement(By.id("aaa")).clear();
-do-
String B = new MyClass().gettext("eeee");
}
driver.quit();
}
public String getIframe(String id) {
driver.findElement(By.id("ddd")).clear();
-do-
return A;
}
}
I resolved it by modifying the code as below:
import org.openqa.selenium.chrome.ChromeDriver;
public class MyClass {
static Webdriver driver;
public static void main(String[] args) throws IO Exception {
System.setProperty("webdriver.chrome.driver","D:\\chromedriver_win32\\chromedriver.exe");
driver = new ChromeDriver();
driver.findElement(By.id("aaa")).clear();
-do-
String B = new MyClass().gettext("eeee");
}
driver.quit();
}
public String getIframe(String id) {
driver.findElement(By.id("ddd")).clear();
-do-
return A;
}
}
So Simple!!!

Runing test cases in all browser one after another

I want to run selenium webdriver test cases in all multiple browser but not in parallel.Is it possible to run test cases in all multiple browser without using xml and selenium grid.Can we do it by using annotation and java classes.I wanted that my test cases should execute in firefox first and after completion of execution in firefox it should start execution in chrome and so on.
I have tried this code to execute my test cases from one browser to another but not simultaneously.but it throw exceptions.
ManyBrowsers.java
import java.io.File;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class ManyBrowsers implements MethodRule {
public static WebDriver driver;
#Override
public Statement apply(final Statement base, FrameworkMethod method, Object target) {
return new Statement() {
#Override
public void evaluate() throws Throwable {
//RUN FIREFOX
driver = new FirefoxDriver();
base.evaluate();
driver.quit();
//RUN CHROME
File f = new File("D:\\SeleniumTestCases\\Selenium_Drivers\\chromedriver" ) ;//PATH to CHROME DRIVER
System.setProperty("webdriver.chrome.driver", f.getAbsolutePath());
driver = new ChromeDriver();
base.evaluate();
driver.quit();
}
};
}
}
Example Test
import java.util.concurrent.TimeUnit;
import org.junit.Rule;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.testng.annotations.AfterClass;
import com.thoughtworks.selenium.webdriven.commands.WaitForPageToLoad;
public class TestClass1 {
protected static WebDriver driver;
protected static String result;
#Rule
public ManyBrowsers browsers = new ManyBrowsers();
#BeforeClass
public static void setup() {
ManyBrowsers.driver.navigate().to("http://www.floraindia.com");
}
#Test
void Testcase1() {
System.out.println("Testcase1");
driver.findElement(By.id("kwsch")).sendKeys("Red");
driver.findElement(By.xpath("//input[#src='image/go.gif']")).click();
}
#Test
public void testGmail() throws Exception {
driver.get("http://www.gmail.com");
driver.findElement(By.id("Email")).clear();
driver.findElement(By.id("Email")).sendKeys("testemail");
driver.findElement(By.id("Passwd")).clear();
driver.findElement(By.id("Passwd")).sendKeys("123456");
driver.findElement(By.id("signIn")).click();
}
#AfterClass
public static void teardown() {
driver.close();
driver.quit();
}
Create different classes for the different tests in different browsers. For example:
First class:
public class FirefoxTest
{
WebDriver driver;
#BeforeClass
public void beforeClass() {
this.driver = new FirefoxDriver();
}
#Test
public void test() {
this.driver.get("http://google.com");
}
#AfterClass
public void afterClass() {
this.driver.quit();
}
}
Second class:
public class ChromeTest
{
WebDriver driver;
#BeforeClass
public void beforeClass() {
this.driver = new ChromeDriver();
}
#Test
public void test() {
this.driver.get("http://google.com");
}
#AfterClass
public void afterClass() {
this.driver.quit();
}
}
If you run your project as a TestNG Test, it will create your xml file programatically which will include all of the classes, so in this case you don't have to create it manually.
You get NullPointerException because method evaluate from class ManyBrowsers is invoked only before #Test methods.
You should use class ManyBrowsers only in methods with #Test annotation.

Resources