【问题标题】:My Java Code Throws java.lang.NullPointerException [duplicate]我的 Java 代码抛出 java.lang.NullPointerException [重复]
【发布时间】:2017-08-03 11:08:30
【问题描述】:

我正在编写一个 Java 代码,它将在 Chrome 或 Firefox 中运行一个简单的自动化场景 - 取决于用户的输入。它开始运行(打开浏览器),但随后抛出 java.lang.NullPointerException。我以为我分配给驱动程序变量的 null 稍后会被覆盖,但事实并非如此。如何解决这个问题?谢谢!

package com.selenium;

import java.util.Scanner;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        // environment variable
        System.setProperty("webdriver.chrome.driver", "C:\\Automation\\libs\\Drivers\\chromedriver.exe");
        //WebDriver chromeDriver = new ChromeDriver();
        System.setProperty("webdriver.gecko.driver", "C:\\Automation\\libs\\Drivers\\geckodriver.exe");
        WebDriver driver = null;

        Scanner scanner = new Scanner(System.in);
        int option = scanner.nextInt();
        System.out.println("Please enter 1 for Chrome or 2 for Firefox " + option);
        if (option == 1)
        {
            WebDriver driver1= new FirefoxDriver();
        }
        else if 
        (option == 2)
        {
            WebDriver driver2 = new ChromeDriver();
        }
        else 
            System.out.println("Please enter a correct number " + option);

        String baseURL = "https://login.salesforce.com/?locale=eu";

        driver.get(baseURL);

        WebElement userName = driver.findElement(By.id("username"));
        userName.sendKeys("Yan");

        WebElement password = driver.findElement(By.id("password"));
        password.sendKeys("123456");

        WebElement rememberCheckbox = driver.findElement(By.id("rememberUn"));
        rememberCheckbox.click();

        WebElement bLogin = driver.findElement(By.id("Login"));
        bLogin.click();

        }

    }

【问题讨论】:

  • 你能显示堆栈跟踪吗
  • False: WebDriver driver1= new FirefoxDriver();右:driver = newFireFoxDriver(),
  • 您没有将变量 driver 设置为 null 以外的任何值。您如何期望它会被“覆盖”?请注意,您正在创建新变量 driver1driver2,但这些当然不会对变量 driver 产生任何影响。
  • 您只需在 if{} 中创建新驱动程序。只需像 if (option == 1) { driver1= new FirefoxDriver(); }

标签: java selenium exception null automation


【解决方案1】:

驱动程序永远不会分配,您只需创建新驱动程序。变化:

    if (option == 1)
    {
        WebDriver driver1= new FirefoxDriver();
    }
    else if 
    (option == 2)
    {
        WebDriver driver2 = new ChromeDriver();
    }

到:

    if (option == 1)
    {
        driver = new FirefoxDriver();
    }
    else if 
    (option == 2)
    {
        driver = new ChromeDriver();
    }

【讨论】:

    【解决方案2】:

    我猜driver.get(baseURL); 抛出。在条件语句的主体中,您正在创建新变量(驱动程序1、驱动程序2)并且从不使用它们。请为之前声明的driver 变量赋值。

    if (option == 1)
    {
       WebDriver driver1= new FirefoxDriver();
    }
    

    会变成

    if (option == 1)
    {
       driver = new FirefoxDriver();
    }
    

    else if (option == 2)
    {
       WebDriver driver2 = new ChromeDriver();
    }
    

    会变成

    else if (option == 2)
    {
       driver = new ChromeDriver();
    }
    

    【讨论】:

    • 成功了!谢谢一百万!
    【解决方案3】:

    driver.get(baseURL)这一行

    你在这个对象上调用了一个方法,但是这个对象此时仍然是null

    这就是发生 NullPointerException 的原因。

    【讨论】:

      【解决方案4】:

      这是您问题的答案:

      您必须注意代码中的许多事实,如下所示:

      1. 保持environment variable 的配置与System.setProperty 一样,特别是for() 循环。

      2. 在打印文本Please enter 1 for Chrome or 2 for Firefox后保留scanner.nextInt()这一行。

      3. 使用完扫描仪实例后,将其关闭以防止将来出现Resource Leakage

      4. 在整个Automation Framework 范围内将WebDriver 实例的名称保持为driver

      5. 在您的代码中,您在开始时已将WebDriver 实例声明为null,然后您尝试再次启动driver1driver2。因此,您面临 java.lang.NullPointerException
      6. 这是根据您的要求的示例代码块,它将使用 Mozilla Firefox,浏览到 url https://login.salesforce.com/,提供用户名和密码,最后点击 Log In 按钮:

        package demo;
        
        import java.util.Scanner;
        
        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.firefox.FirefoxDriver;
        
        public class Q45482474 {
        
            public static void main(String[] args) {
        
        
            WebDriver driver = null;
        
            Scanner scanner = new Scanner(System.in);
            System.out.println("Please enter 1 for Chrome or 2 for Firefox : ");
            int option = scanner.nextInt();
            scanner.close();
            if (option == 1)
            {
                System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
                driver= new FirefoxDriver();
            }
            else if 
            (option == 2)
            {
                System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
                driver = new ChromeDriver();
            }
            else 
                System.out.println("Please enter a correct number.");
        
            String baseURL = "https://login.salesforce.com/?locale=eu";
        
            driver.get(baseURL);
        
            WebElement userName = driver.findElement(By.id("username"));
            userName.sendKeys("Yan");
        
            WebElement password = driver.findElement(By.id("password"));
            password.sendKeys("123456");
        
            WebElement rememberCheckbox = driver.findElement(By.id("rememberUn"));
            rememberCheckbox.click();
        
            WebElement bLogin = driver.findElement(By.id("Login"));
            bLogin.click();
        
            }
        
        }
        
      7. 执行此程序时,您将在控制台上观察到以下输出:

        Please enter 1 for Chrome or 2 for Firefox : 
        1
        1501764400779   geckodriver INFO    geckodriver 0.18.0
        1501764400792   geckodriver INFO    Listening on 127.0.0.1:35604
        1501764401293   geckodriver::marionette INFO    Starting browser C:\Program Files\Mozilla Firefox\firefox.exe with args ["-marionette"]
        1501764421881   Marionette  INFO    Listening on port 48303
        Aug 03, 2017 6:17:02 PM org.openqa.selenium.remote.ProtocolHandshake createSession
        INFO: Detected dialect: W3C
        

      如果这能回答您的问题,请告诉我。

      【讨论】:

        猜你喜欢
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 2023-01-09
        • 1970-01-01
        • 2020-04-15
        相关资源
        最近更新 更多