2017-08-03 58 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 
    

讓我知道這個答案是否是您的問題。

相關問題