1

我正在關注Selenium - 關鍵字驅動框架here的教程。我對Reflection API不是很熟悉。 (我也是Java的初學者)使用反射時出現空指針異常

當我執行我的主類時,我收到一個空指針異常。我不確定我做錯了什麼。可能是一個愚蠢的錯誤。請幫助我瞭解我在這裏錯過了什麼。 (另外,如果有人可以指導我在哪裏可以瞭解關鍵字驅動的框架,並從一個初學者的角度來看,反射API更好,這將是非常有益的。)

DriverScript:

package testdev; 

import java.lang.reflect.Method; 
import config.ActionKeywords; 
import utility.ExcelUtils; 

public class DriverScript { 

public static ActionKeywords actionKeywords; 
public static String sActionKeyword; 
public static Method method[]; 

public DriverScript() throws NoSuchMethodException, SecurityException{ 
    actionKeywords = new ActionKeywords(); 
    method = actionKeywords.getClass().getMethods(); 
} 

public static void main(String args[]) throws Exception{ 

    String sPath = "C://Users//testusr//workspace//src//datasource//datasource.xlsx"; 
    ExcelUtils.setExcelFile(sPath, "sheet"); 

    for(int i=1; i<=7; i++){ 
     sActionKeyword = ExcelUtils.getCellData(i, 3); 
     execute_Actions(); 
    } 
} 

private static void execute_Actions() throws Exception{ 

    for(int j=0;j < method.length;j++){ 
     if(method[j].getName().equals(sActionKeyword)){ 
      method[j].invoke(actionKeywords); 
      break; 
     } 
    } 

} 
} 

ActionKeywords:

package config; 

import java.util.concurrent.TimeUnit; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 

public class ActionKeywords { 

public static WebDriver driver; 

public static void openbrowser(){ 
    System.setProperty("webdriver.chrome.driver", "G:\\Ram\\MAC\\Se\\chromedriver.exe"); 
    driver = new ChromeDriver(); 
} 

public static void navigate(){ 
    driver.get("https://jira-dev.emdeon.net/secure/Dashboard.jspa"); 
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
    driver.manage().window().maximize(); 
} 

public static void enter_credentials(){ 
    driver.findElement(By.id("login-form-username")).sendKeys("RMuruganandam"); 
    driver.findElement(By.id("login-form-password")).sendKeys("[email protected]"); 
} 

public static void click_login(){ 
    driver.findElement(By.id("login")).click(); 
} 

public static void wait_for(){ 
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
} 

public static void click_logout() throws InterruptedException{ 
    driver.findElement(By.id("header-details-user-fullname")).click(); 
    Thread.sleep(30); 
    driver.findElement(By.id("log_out")).click(); 
} 

public static void closebrowser(){ 
    driver.quit(); 
} 

} 

ExcelUtils:

package utility; 

import java.io.FileInputStream; 
import org.apache.poi.xssf.usermodel.XSSFCell; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class ExcelUtils { 

public static XSSFWorkbook ExcelWBook; 
public static XSSFSheet ExcelWSheet; 
public static XSSFCell Cell; 
public static FileInputStream ExcelFile; 

public static void setExcelFile (String Path, String SheetName) throws Exception{ 
    FileInputStream ExcelFile = new FileInputStream(Path); 
    ExcelWBook = new XSSFWorkbook(ExcelFile); 
    ExcelWSheet = ExcelWBook.getSheetAt(0); 
} 

public static String getCellData (int rowNum, int colNum) { 
    String CellData =""; 
    Cell = ExcelWSheet.getRow(rowNum).getCell(colNum); 
    CellData= Cell.getStringCellValue();   
    return CellData; 
} 
} 

例外:

java.lang.NullPointerException 
at testdev.DriverScript.execute_Actions(DriverScript.java:37) 
at testdev.DriverScript.main(DriverScript.java:28) 

Excel表:

datasource.xlsx

+0

請附上堆棧跟蹤 – Alexey

+0

你在哪裏得到的異常? – Guy

回答

1

如上所述異常:在第37行;

for (int j = 0; j < method.length; j++) { 

method爲空。因爲你永遠不會調用構造函數來創建一個新的Driverscript對象等

method = actionKeywords.getClass().getMethods(); 

線的值永遠不會分配給method

所有字段都是static,但您正試圖在構造函數中指定其值。

這不是一個好辦法,但我認爲上面的代碼工作預期爲你

public static void main(String args[]) throws Exception{ 

    String sPath = "C://Users//testusr//workspace//src//datasource//datasource.xlsx"; 
    ExcelUtils.setExcelFile(sPath, "sheet"); 

    for(int i=1; i<=7; i++){ 
     sActionKeyword = ExcelUtils.getCellData(i, 3); 
     actionKeywords = new ActionKeywords(); 
     method = actionKeywords.getClass().getMethods(); 
     execute_Actions(); 
    } 
}