webdriver中的Nullpointer异常,驱动程序为null

时间:2015-07-30 14:00:38

标签: selenium-webdriver webdriver

我是selenium java的新手,试图通过调用框架中另一个类的方法来运行测试用例。方法在不同的类中定义。问题是,首先,找到驱动程序(Firefox驱动程序)但是当调用另一个类的方法时,驱动程序为null。

Below is the code snippet:


    public class ActionDriver {

    WebDriver driver;

    public ActionDriver(WebDriver driver){
        this.driver = driver;
    }


    public void type(By loc, String value) {

        driver.findElement(loc).sendKeys(value);

    }
    }

当从WebAction类调用方法时,NPE来自用于第二个实例的驱动程序的上述代码行。 driver.findElement(LOC).sendKeys(值);

第二课是:

public class WebActions {

    WebDriver driver;
    ActionDriver ad = new ActionDriver(driver);
    SizeChartTemplate sct = new SizeChartTemplate();

    public void TypeTemplateName(){

        ad.type(jsct.Template_Name, "Men's Vest");
}

}

NPE适用于广告的上述代码行。

测试用例:

public class LoginToJcilory extends OpenAndCloseBrowser {


    @Test
    public void logintojcilory() throws BiffException, IOException, InterruptedException{

        WebActions wa = new WebActions();

        System.out.println("Entered login to jcilory block");

        ActionDriver actdrvr = new ActionDriver(driver);

        JciloryLoginPage jclp = new JciloryLoginPage();

        JcilorySizeChartTemplate jsct = new JcilorySizeChartTemplate();

        String username = actdrvr.readExcel(0, 1);

        String password = actdrvr.readExcel(1, 1);

        System.out.println(username);

        System.out.println(password);

        actdrvr.type(jclp.Username, username);

        actdrvr.type(jclp.Password, password);

        actdrvr.click(jclp.LoginButton);

        Thread.sleep(2000);

        driver.get("http://qacilory.dewsolutions.in/JCilory/createSizeChartTemplate.jc");

        wa.TypeTemplateName(); 

    }

NPE来自上面代码中的wa元素。

以下是错误:

FAILED: logintojcilory
java.lang.NullPointerException
    at Config.ActionDriver.type(ActionDriver.java:40)
    at Config.WebActions.TypeTemplateName(WebActions.java:17)
    at Test.LoginToJcilory.logintojcilory(LoginToJcilory.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.access$000(SuiteRunner.java:37)
    at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:368)
    at org.testng.internal.thread.ThreadUtil$2.call(ThreadUtil.java:64)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)


===============================================
    Test run on FIREFOX
    Tests run: 1, Failures: 1, Skips: 0
===============================================

OpenAndCloseBrowser:

public class OpenAndCloseBrowser {

    protected WebDriver driver;
    @Parameters({"browser","baseURL"})
    @BeforeClass
    public void openBrowser(String browser,String baseURL){
        if(browser.equalsIgnoreCase("firefox")){
            driver=new FirefoxDriver();
        }
        else if(browser.equalsIgnoreCase("chrome")){
            System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"\\driver\\chromedriver.exe");
            driver=new ChromeDriver();
        }
        else if(browser.equalsIgnoreCase("ie")){
            System.setProperty("webdriver.ie.driver", System.getProperty("user.dir")+"\\driver\\IEDriverServer.exe");
            DesiredCapabilities caps=new DesiredCapabilities();
            caps.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true);
            caps.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);

            driver=new InternetExplorerDriver(caps);
        }
        else{
            driver=new FirefoxDriver();

        }
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
        driver.get(baseURL);    
    }
    @AfterClass
    public void closeBrowser(){
        //driver.quit();
    }

}

我猜我在这些类中定义驱动程序的方式存在问题。感谢任何帮助解决问题。

2 个答案:

答案 0 :(得分:0)

您的驱动程序在ActionDriver.type()中为null,因为它从WebActions传递到构造函数时为null。 OpenAndCloseBrowser正在创建WebDriver实例,但是分配给DIFFERENT(本地)驱动程序变量。您应该了解有关Java中变量作用域的更多信息...这不是Selenium / Webdriver问题。

答案 1 :(得分:0)

你可能不再需要答案,但这个问题有很多观点,所以只是为了完整性。

我的测试类中通常有一个全局驱动变量,我会像这样实例化它,所以每次测试都可以使用它。

@Before 
public void setUp() throws Exception {
  System.setProperty("webdriver.gecko.driver", "path/to/geckodriver");
  DesiredCapabilities capabilities = DesiredCapabilities.firefox();
  capabilities.setCapability("marionette", true);
  driver = new FirefoxDriver(capabilities);
  driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

只需将其添加到测试类(调整驱动程序路径),然后在测试之前实例化驱动程序。