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

Nullpointer Exception in webdriver, driver is null

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

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 class 调用方法时,NPE 来自第二个实例的驱动程序的上述代码行。 driver.findElement(loc).sendKeys(值);

第二个 class 是:

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 用于 ad.

的上述代码行

测试用例:

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

    }

上面代码中的wa元素出现NPE。

错误如下:

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[=13=]0(SuiteRunner.java:37)
    at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:368)
    at org.testng.internal.thread.ThreadUtil.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();
    }

}

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

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

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

我的测试中通常有一个全局驱动程序变量class,我像这样实例化它,所以它可用于每个测试。

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

只需将此添加到您的测试中 class(调整驱动程序路径),驱动程序将在测试前实例化。