我在运行selenium web驱动程序代码块时遇到错误 - java.lang.NullPointerException

时间:2017-03-27 17:09:31

标签: java selenium webdriver testng

“这是selenium web驱动程序的代码,我在其中使用POM设计来定义网页的所有定位器。因此在运行代码后,我得到了关于空指针异常的错误。

     "
 {
  package Pages;
              import org.openqa.selenium.By;
              import org.openqa.selenium.WebDriver;
              public class LoginPage {
              WebDriver driver;
              By username = By.id("user_login");
              By password = By.id("user_pass");
              By login = By.id("wp-submit");
              By rememberme = By.id("rememberme");
              public LoginPage(WebDriver driver){
                this.driver = driver;
              }
              public void typeusername(){
                driver.findElement(username).sendKeys("admin"); 
              }
              public void typepassword(){
               driver.findElement(password).sendKeys("demo123");
              }
              public void clickrememberme(){
               driver.findElement(rememberme).click();
              }
              public void clicklogin(){
               driver.findElement(login).click();
              }
              }

“在这段代码中,我创建了一个登录页面的对象,并使用TestNG注释调用所有定位器。”

{
 package Test;
                import org.openqa.selenium.WebDriver;
                import org.openqa.selenium.chrome.ChromeDriver;
                import org.testng.annotations.BeforeTest;
                import org.testng.annotations.Test;
                import Pages.LoginPage;
                public class verifylogin {  
                @BeforeTest
                public void beforetest(){
                    System.setProperty("webdriver.chrome.driver","C:\\Users\\saniket.soni\\Desktop\\chrome\\chromedriver.exe");
                    WebDriver driver = new ChromeDriver();
                    driver.manage().window().maximize();
                    driver.get("http://demosite.center/wordpress/wp-login.php");
                }
                @Test   
                public void verifyvalidlogin(){
                    WebDriver driver = null;
                    LoginPage login_test = new LoginPage(driver);
                    login_test.typeusername();
                    login_test.typepassword();
                    login_test.clickrememberme();
                    login_test.clicklogin();    
                }
                }

4 个答案:

答案 0 :(得分:1)

您可能需要考虑在java中学习范围以了解此问题中发生的情况。以下是对您案件中发生的事情的解释。

public void beforetest()方法中,您正在创建驱动程序并使用它,但是当该方法完成时,driver变量超出范围,您无法再访问它。

稍后,在您的verifyValidLogin方法中,您正在创建一个新的driver变量,并将其设置为null:

WebDriver driver = null;

然后您将此null驱动程序传递到LoginPage此处:

LoginPage login_test = new LoginPage(driver);//driver is null here

所以当你在这里使用它时:

public LoginPage(WebDriver driver){
    this.driver = driver;
}
public void typeusername(){
    driver.findElement(username).sendKeys("admin"); 
}

它是空的

尝试进行这些更改:

首先,在初始化时将driver保存在某处:

public class verifylogin {

    //STORE YOUR DRIVER SOMEWHERE!!! Like here
    private WebDriver driver;  

    @BeforeTest
    public void beforetest(){
        System.setProperty("webdriver.chrome.driver","C:\\Users\\saniket.soni\\Desktop\\chrome\\chromedriver.exe");
        //Store the driver in the class variable
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("http://demosite.center/wordpress/wp-login.php");
    }

    @Test   
    public void verifyvalidlogin(){
        //Now you can use the driver you stored
        LoginPage login_test = new LoginPage(driver);
        login_test.typeusername();
        login_test.typepassword();
        login_test.clickrememberme();
        login_test.clicklogin();    
    }

答案 1 :(得分:0)

您正在使用" WebDriver driver = null"删除对象引用。在verifyvalidlogin()方法中。删除此行并尝试,它将起作用。

答案 2 :(得分:0)

您将变量'driver'实例化为私有('私有WebDriver驱动程序')。

使用“私人”访问修饰符,您可以访问班级内的驱动程序,但不能从外部访问,将其更改为公共,它将起作用。

答案 3 :(得分:0)

在beforetest()方法中,您将实例化浏览器对象并导航到演示URL。

在verifyvalidlogin()方法之后,您将驱动程序对象设为null并将此null对象传递给Login页面,此处传递的是null而不是驱动程序对象。

我们可以通过在类中声明驱动程序实例变量以及所有方法之外来解决此问题。

WebDriver驱动程序;

在beforetest()方法中实例化此驱动程序对象,并将相同的驱动程序对象传递给LoginPage,而不再如下所述再次声明它。(我在本地计算机上执行此脚本工作正常)

package Tests;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import Pages.LoginPage;
public class verifylogin {  

WebDriver driver;

@BeforeTest
public void beforetest(){
        System.setProperty("webdriver.chrome.driver","C:\\Users\\saniket.soni\\Desktop\\ chrome\\chromedriver.exe");
    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("http://demosite.center/wordpress/wp-login.php");
}
@Test   
public void verifyvalidlogin(){
    LoginPage login_test = new LoginPage(driver);
    login_test.typeusername();
    login_test.typepassword();
    login_test.clickrememberme();
    login_test.clicklogin();    
}
}
package Pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class LoginPage {

WebDriver driver;
By username = By.id("user_login");
By password = By.id("user_pass");
By login = By.id("wp-submit");
By rememberme = By.id("rememberme");
public LoginPage(WebDriver driver){
    this.driver = driver;
}
public void typeusername(){
    driver.findElement(username).sendKeys("admin"); 
}
public void typepassword(){
    driver.findElement(password).sendKeys("demo123");
}
public void clickrememberme(){
    driver.findElement(rememberme).click();
}
public void clicklogin(){
    driver.findElement(login).click();
}

}

尝试此解决方案并告诉我它是否适合您。