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