Selenium 中的 NullPointerException java

NullPointerException in Selenium with java

谁能帮我解决以下错误:

java.lang.NullPointerException
    at gurubank.Test_Bank.test(Test_Bank.java:24)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:132)
    at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:599)
    at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:174)
    at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
    at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:822)
    at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at org.testng.TestRunner.privateRun(TestRunner.java:764)
    at org.testng.TestRunner.run(TestRunner.java:585)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
    at org.testng.SuiteRunner.run(SuiteRunner.java:286)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
    at org.testng.TestNG.runSuites(TestNG.java:1069)
    at org.testng.TestNG.run(TestNG.java:1037)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

这是我使用的基础文件:

public class Base1 {
    public static WebDriver driver;
    @BeforeMethod
    public void before(){
        System.setProperty("webdriver.chrome.driver", "C:\formation_Selenium\navigateur\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://www.demo.guru99.com/V4/");
        driver.manage().window().maximize();
        
        
    }
    

}

这是我正在尝试的测试 运行:

public class Test_Bank extends Base1 {


    public static Logger log =LogManager.getLogger(Test_Bank.class.getName());
    
    @Test(dataProvider = "getdata")
    public void test(String username,String mdp) throws InterruptedException {
        
        log.info("start");
        Thread.sleep(3000);
        WebElement login = driver.findElement(By.xpath("//input[@name='uid']"));
        Thread.sleep(3000);
        log.info("found");
        login.sendKeys(username);
        log.info("ok for logging");
    
                
        login.sendKeys(Keys.TAB);
        WebElement password= driver.findElement(By.cssSelector(":focus"));
        password.sendKeys(mdp);
        
        WebElement submit= driver.findElement(By.name("btnLogin"));
        submit.click();
        
        String titre= driver.getTitle();
        System.out.println(titre);
        if (titre.equals ("Guru99 Bank Manager HomePage")) {
            System.out.println("Logged OK");
        }
        else {
            System.out.println("Loggin Failed");
        }

    }
    @DataProvider
    public Object[][] getdata(){
        Object[][] data = new Object[2][2];
        // combinaison1
        data[0][0] = "loggin1";
        data[0][1] = "mdp1";
        // combinaison2
        data[1][0] = "loggin2";
        data[1][1] = "mdp2";
        
    }   
    
}

此行发生错误:WebElement login = driver.findElement(By.xpath("//input[@name='uid']"))

尽管我已经在Base1.java中声明了驱动程序。

谢谢你

您在 class Base1 中有一个静态字段 WebDriver driver,它没有像您假设的那样被初始化,因为 instance 方法 before() 初始化本地同名变量 WebDriver driver = new ChromeDriver();。当代码流退出此方法时,有关局部变量的信息将丢失。

可能您应该使用静态初始化块来初始化静态字段,而不是 before 方法:

public static WebDriver driver;

static {
    System.setProperty("webdriver.chrome.driver", "C:\formation_Selenium\navigateur\chromedriver.exe");
    driver = new ChromeDriver();
        //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.get("http://www.demo.guru99.com/V4/");
    driver.manage().window().maximize();
}

您的代码看起来不错,只有一处更改。如果您更改了它,那么您的代码应该 运行 完美。只需删除之前方法中的 Webdriver 引用即可。如果您在方法级别给出引用,那么 java 会将其视为方法级别变量。

    public class Base1 {
    public static WebDriver driver;
    @BeforeMethod
    public void before(){
        System.setProperty("webdriver.chrome.driver", "C:\formation_Selenium\navigateur\chromedriver.exe");
        **WebDriver** driver = new ChromeDriver();
        //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://www.demo.guru99.com/V4/");
        driver.manage().window().maximize();
        
        
    }
    

}