如何初始化驱动程序以避免NullPointerException错误

时间:2018-05-01 23:19:31

标签: java eclipse selenium testng

我遇到了这个类的问题,我收到一个空指针异常。我插入了System.out.println("driver=" + driver);以查看输出的内容,并为每个数据集指出driver=null,这让我觉得当我点击@Test下的方法时初始化存在问题。如何解决驱动程序的初始化以使我的测试通过testNG?

以下是代码:

package com.testng.practice;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

    public class LoginTest {

        WebDriver driver = null;

        @BeforeTest
        public void invokeApplication() {
            System.setProperty("webdriver.chrome.driver", "xxx\\chromedriver.exe");
            WebDriver driver = new ChromeDriver(); 
            driver.manage().window().maximize();
            driver.get("https://www.facebook.com");
        }   

        @Test (dataProvider = "getData")
        public void loginFaceBook(String email, String password) {

            System.out.println("driver=" + driver); 

            WebElement emailField = driver.findElement(By.name("email"));
            WebElement passwordField = driver.findElement(By.name("pass"));

            emailField.sendKeys(email);
            passwordField.sendKeys(password);

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @DataProvider
        public Object[][] getData(){

            //declared object of 4 rows and 2 columns

            Object[][] dataSet = new Object[4][2];

            dataSet[0][0] = "TimSmith@gmail.com";
            dataSet[0][1] = "Smith123";

            dataSet[1][0] = "JaneMcCormack@gmail.com";
            dataSet[1][1] = "McCormack123";

            dataSet[2][0] = "AnjaliPrakash@gmail.com";
            dataSet[2][1] = "Prakash123";

            dataSet[3][0] = "JamesBean@gmail.com";
            dataSet[3][1] = "Bean123";

            return dataSet;

        }
    }

3 个答案:

答案 0 :(得分:2)

driver变量的这个定义在invokeApplication()方法中有效,并且保留了类属性driver未初始化

WebDriver driver = new ChromeDriver();

初始化类属性use:

this.driver = new ChromeDriver();

答案 1 :(得分:0)

我认为问题应该在@BeforeTest注释中,如果你通过运行TestNG来运行它自己的类。 BeforeTest注释在xml runner文件中的标记之前工作。 以下是TestNG文档中BeforeTest的定义。 @BeforeTest:在运行属于标记内部类的任何测试方法之前,将运行带注释的方法。 如果你想在@Test之前运行,你需要使用@BeforeMethod。

请注意所有注释之间的差异。 您可以找到差异here

答案 2 :(得分:-1)

你声明WebDriver driver = null;在全球范围内。 然后在Method invokeApplication()中不需要声明一次; 只写  WebDriver driver = null;

    @BeforeTest
    public void invokeApplication() {
        System.setProperty("webdriver.chrome.driver", "xxx\\chromedriver.exe");
         driver = new ChromeDriver(); 
        driver.manage().window().maximize();
        driver.get("https://www.facebook.com");