【问题标题】:Getting java.lang.NullPointerException in Selenium WebDriver在 Selenium WebDriver 中获取 java.lang.NullPointerException
【发布时间】:2021-05-14 13:44:49
【问题描述】:

I am getting java.lang.NullPointerException when I run the testcase in Eclipse. Can somebody help me in pointing out the error I have made.

第 17 行错误:LoginPage.Java 中的 WebElement。 @ 第 12 行:TC_LoginTest_001.java 中的 LoginPage。

**LoginPage.Java**

package com.internetBanking.pageObjects;

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

public class LoginPage {
    
    WebDriver driver;
    
    public LoginPage (WebDriver driver) {
            
        this.driver = driver;
        
    }
    
    WebElement usrname = driver.findElement(By.name("uid"));
    WebElement pwd = driver.findElement(By.name("password"));
    WebElement login = driver.findElement(By.name("btnLogin"));
    
    public void setUsrname(String uname) {
        usrname.sendKeys(uname);
    }

    public void setPwd(String pswd) {
        pwd.sendKeys(pswd);
    }

    public void login() {
        
        login.click();
    }

}

**TC_LoginTest_001.java**

package com.internetBanking.testCases;
import org.testng.annotations.Test;
import com.internetBanking.pageObjects.LoginPage;
public class TC_LoginTest_001 extends BaseClass {
    
    @Test
    public void LoginTest() {
                
        driver.get(baseURL);
        logger.info("URL is opened");
        
        LoginPage loginPage = new LoginPage(driver);
        
        loginPage.setUsrname(username);
        logger.info("Username is entered");
        
        loginPage.setPwd(password);
        logger.info("Password is entered");
        
        loginPage.login();                                         
        logger.info("Login button is clicked");
        
    }
}

当我运行测试用例时,我收到以下错误:

java.lang.NullPointerException 在 com.internetBanking.pageObjects.LoginPage.(LoginPage.java:17) 在 com.internetBanking.testCases.TC_LoginTest_001.LoginTest(TC_LoginTest_001.java:12) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124) 在 org.testng.internal.Invoker.invokeMethod(Invoker.java:583) 在 org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719) 在 org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989) 在 org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 在 org.testng.TestRunner.privateRun(TestRunner.java:648) 在 org.testng.TestRunner.run(TestRunner.java:505) 在 org.testng.SuiteRunner.runTest(SuiteRunner.java:455) 在 org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450) 在 org.testng.SuiteRunner.privateRun(SuiteRunner.java:415) 在 org.testng.SuiteRunner.run(SuiteRunner.java:364) 在 org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 在 org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84) 在 org.testng.TestNG.runSuitesSequentially(TestNG.java:1208) 在 org.testng.TestNG.runSuitesLocally(TestNG.java:1137) 在 org.testng.TestNG.runSuites(TestNG.java:1049) 在 org.testng.TestNG.run(TestNG.java:1017) 在 org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115) 在 org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) 在 org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

【问题讨论】:

  • 你初始化你的网络驱动了吗?你有这样的东西吗:driver=new ChromeDriver(options);在你搜索元素之前?
  • Driver.get 工作正常吗?登录测试中?

标签: selenium webdriver


【解决方案1】:

考虑一下这段代码:

public class MainTest {
    public static void main(String[] args) {
        new Test(new Object());
    }
}

class Test {
    InitMe initMe = new InitMe();
    public Test(Object o){
        System.out.println("Test instance has been created");
    }
}

class InitMe{
    public InitMe(){
        System.out.println("Init me instance has been created");
    }
}

如果你运行它,你会看到以下输出:

Init me instance has been created
Test instance has been created

这意味着在执行构造函数之前初始化字段。因此,在您的情况下,您具有以下结构:

public class MainTest {
    public static void main(String[] args) {
        new Test(new Object());
    }
}

class Test {
    Object o;
    String oStr = o.toString();
    public Test(Object o){
        this.o = o;
    }
}

您的字段通过自己尚未初始化的引用进行初始化(因为尚未调用构造函数)。

您的特殊解决方案是来改变这一点:

    WebDriver driver;
    
    public LoginPage (WebDriver driver) {
            
        this.driver = driver;
        
    }
    
    WebElement usrname = driver.findElement(By.name("uid"));
    WebElement pwd = driver.findElement(By.name("password"));
    WebElement login = driver.findElement(By.name("btnLogin"));

到这里:

    WebDriver driver;
    WebElement usrname;
    WebElement pwd;
    WebElement login;
    
    public LoginPage (WebDriver driver) {
        this.driver = driver;
        usrname = driver.findElement(By.name("uid"));
        pwd = driver.findElement(By.name("password"));
        login = driver.findElement(By.name("btnLogin"));}
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 2013-07-17
    • 2014-03-01
    • 2012-05-24
    • 2012-06-24
    • 2018-09-04
    • 2019-05-20
    • 2016-06-13
    相关资源
    最近更新 更多