【问题标题】:i got an error - java.lang.NullPointerException while running the selenium web driver code block运行 selenium Web 驱动程序代码块时出现错误 - java.lang.NullPointerException
【发布时间】:2017-03-27 17:09:31
【问题描述】:

" 这是 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();    
                }
                }

【问题讨论】:

标签: java selenium webdriver testng


【解决方案1】:

您可能需要考虑在 java 中研究 scope 以了解此问题中发生的情况。这是对您的情况的解释。

在您的 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();    
    }

【讨论】:

    【解决方案2】:

    您正在通过在 verifyvalidlogin() 方法中使用“WebDriver driver = null”来删除对象引用。去掉这行试试,就可以了。

    【讨论】:

    • 不,删除该行后它可以工作。我们只需要在类内部但在方法外部定义 webDriver 驱动程序。
    【解决方案3】:

    您将实例变量“驱动程序”设为私有(“私有 WebDriver 驱动程序”)。

    使用“private”访问修饰符,您可以在类内访问驱动程序,但不能从外部访问,将其更改为 public 即可。

    【讨论】:

      【解决方案4】:

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

      之后,在 verifyvalidlogin() 方法中,您将驱动程序对象设为 null 并将此 null 对象传递给登录页面,这里您传递的是 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();
      }
      
      }
      

      试试这个解决方案,让我知道它是否适合你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-19
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        • 2022-01-28
        • 2018-06-12
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多