2017-08-03 31 views
-2

我正在编写一个Java代码,它将在Chrome或Firefox中运行一个简单的自动化场景 - 取决于用户的输入。它开始运行(打开浏览器),但然后抛出java.lang.NullPointerException。我以为然后我分配的驱动程序变量的空值将被覆盖,但它不是。这怎么解决?谢谢!我的Java代码抛出java.lang.NullPointerException

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(); 

     } 

    } 
+3

可以显示堆栈跟踪 – sForSujit

+0

False:WebDriver driver1 = new FirefoxDriver();右:driver = newFireFoxDriver(), – tomas

+3

你没有将变量'driver'设置为'null'。你如何期待它会被“覆盖”?请注意,您正在创建新的变量'driver1'和'driver2',但这些当然对变量'driver'没有任何影响。 – Jesper

回答

4

驱动程序从不分配,您只需创建新的驱动程序。变化:

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(); 
    } 
0

我猜driver.get(baseURL);抛出。在您的条件语句的主体中,您正在创建新变量(driver1,driver2)并且从不使用它们。请为先前声明的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(); 
} 
+0

这工作!太感谢了! – Yan

0

看行driver.get(baseURL)

您可以在此对象上调用方法,但此时此对象仍为null

这就是发生NullPointerException的原因。

0

这里是回答你的问题:

你要照顾很多事实在你的代码如下:

  1. 保持environment variable配置为System.setProperty与特别for()循环。

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

  3. 一旦您完成使用扫描器实例关闭它,以防止将来Resource Leakage

  4. 保持WebDriver实例作为driver的名字在整个Automation Framework范围。

  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 
    

让我知道这个答案是否是您的问题。

相关问题