Spring boot 使用Spring Boot、Selenium和JUnit运行Cucumber测试时获取NullPointerException

Spring boot 使用Spring Boot、Selenium和JUnit运行Cucumber测试时获取NullPointerException,spring-boot,selenium-webdriver,cucumber,cucumber-java,cucumber-junit,Spring Boot,Selenium Webdriver,Cucumber,Cucumber Java,Cucumber Junit,我有一个简单的基于的测试,在执行时抛出NullPointerException 我已经初始化了WebDriver(chrome),但由于某些原因,测试无法选择它 不确定为什么在ChromeDriver 错误 com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.example.TestRunner driver: null java.lang.NullPointerException at com.e

我有一个简单的基于
的测试,在执行时抛出
NullPointerException

我已经初始化了
WebDriver(chrome)
,但由于某些原因,测试无法选择它

不确定为什么在
ChromeDriver

错误

com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.example.TestRunner
driver: null

java.lang.NullPointerException
    at com.example.GoogleCalcStepDefinition.I_open_google(GoogleCalcStepDefinition.java:38)
    at ✽.I open Google(file:src/test/resources/features/calc.feature:7)

Feature: Check addition in Google calculatorcontent
  In order to verify that Google calculator work correctly
  As a user of Google
  I should be able to get correct addition result

  Scenario: Addition                     # src/test/resources/features/calc.feature:6
    Given I open Google                  # GoogleCalcStepDefinition.I_open_google()
      java.lang.NullPointerException
    at com.example.GoogleCalcStepDefinition.I_open_google(GoogleCalcStepDefinition.java:38)
    at ✽.I open Google(file:src/test/resources/features/calc.feature:7)

    When I enter "2+2" in search textbox # GoogleCalcStepDefinition.I_enter_in_search_textbox(String)
    Then I should get result as "4"      # GoogleCalcStepDefinition.I_should_get_correct_result(String)

Failed scenarios:
src/test/resources/features/calc.feature:6 # Addition

1 Scenarios (1 failed)
3 Steps (1 failed, 2 skipped)
0m1.364s

java.lang.NullPointerException
    at com.example.GoogleCalcStepDefinition.I_open_google(GoogleCalcStepDefinition.java:38)
    at ✽.I open Google(file:src/test/resources/features/calc.feature:7)
GoogleCalcStepDefinition.java

public class GoogleCalcStepDefinition extends CucumberStepDefinitions {

    private static final String CHROME_DRIVER_EXE = "drivers/chromedriver.exe";
    private static final String WEBDRIVER_CHROME_DRIVER = "webdriver.chrome.driver";
    private static WebDriver driver;

    @BeforeClass
    public static void setUp() {
        System.out.println("Into the setUp() method...");
        String filePath = ClassLoader.getSystemClassLoader().getResource(CHROME_DRIVER_EXE).getFile();
        System.setProperty(WEBDRIVER_CHROME_DRIVER, filePath);
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("useAutomationExtension", false);
        driver = new ChromeDriver(options);
    }

    @Given("^I open Google$")
    public void I_open_google() {
        System.out.println("driver: " + driver);
        //Set implicit wait of 10 seconds and launch google
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get("https://www.google.co.in");
    }

    @When("^I enter \"([^\"]*)\" in search textbox$")
    public void I_enter_in_search_textbox(String additionTerms) {
        //Write term in google textbox
        WebElement googleTextBox = driver.findElement(By.id("gbqfq"));
        googleTextBox.sendKeys(additionTerms);

        //Click on searchButton
        WebElement searchButton = driver.findElement(By.id("gbqfb"));
        searchButton.click();
    }

    @Then("^I should get result as \"([^\"]*)\"$")
    public void I_should_get_correct_result(String expectedResult) {
        //Get result from calculator
        WebElement calculatorTextBox = driver.findElement(By.id("cwos"));
        String result = calculatorTextBox.getText();
        //Verify that result of 2+2 is 4
        assertEquals(result, expectedResult);
    }

    @AfterClass
    public static void closeBrowser() {
        if (null != driver) {
            driver.close();
            driver.quit();
        }
    }

}   
@RunWith(SpringRunner.class)
@SpringBootTest
public abstract class CucumberStepDefinitions {

}
@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty"}, features = {"src/test/resources/features"})
public class TestRunner {

}
CucumberStepDefinitions.java

public class GoogleCalcStepDefinition extends CucumberStepDefinitions {

    private static final String CHROME_DRIVER_EXE = "drivers/chromedriver.exe";
    private static final String WEBDRIVER_CHROME_DRIVER = "webdriver.chrome.driver";
    private static WebDriver driver;

    @BeforeClass
    public static void setUp() {
        System.out.println("Into the setUp() method...");
        String filePath = ClassLoader.getSystemClassLoader().getResource(CHROME_DRIVER_EXE).getFile();
        System.setProperty(WEBDRIVER_CHROME_DRIVER, filePath);
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("useAutomationExtension", false);
        driver = new ChromeDriver(options);
    }

    @Given("^I open Google$")
    public void I_open_google() {
        System.out.println("driver: " + driver);
        //Set implicit wait of 10 seconds and launch google
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get("https://www.google.co.in");
    }

    @When("^I enter \"([^\"]*)\" in search textbox$")
    public void I_enter_in_search_textbox(String additionTerms) {
        //Write term in google textbox
        WebElement googleTextBox = driver.findElement(By.id("gbqfq"));
        googleTextBox.sendKeys(additionTerms);

        //Click on searchButton
        WebElement searchButton = driver.findElement(By.id("gbqfb"));
        searchButton.click();
    }

    @Then("^I should get result as \"([^\"]*)\"$")
    public void I_should_get_correct_result(String expectedResult) {
        //Get result from calculator
        WebElement calculatorTextBox = driver.findElement(By.id("cwos"));
        String result = calculatorTextBox.getText();
        //Verify that result of 2+2 is 4
        assertEquals(result, expectedResult);
    }

    @AfterClass
    public static void closeBrowser() {
        if (null != driver) {
            driver.close();
            driver.quit();
        }
    }

}   
@RunWith(SpringRunner.class)
@SpringBootTest
public abstract class CucumberStepDefinitions {

}
@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty"}, features = {"src/test/resources/features"})
public class TestRunner {

}
TestRunner.java

public class GoogleCalcStepDefinition extends CucumberStepDefinitions {

    private static final String CHROME_DRIVER_EXE = "drivers/chromedriver.exe";
    private static final String WEBDRIVER_CHROME_DRIVER = "webdriver.chrome.driver";
    private static WebDriver driver;

    @BeforeClass
    public static void setUp() {
        System.out.println("Into the setUp() method...");
        String filePath = ClassLoader.getSystemClassLoader().getResource(CHROME_DRIVER_EXE).getFile();
        System.setProperty(WEBDRIVER_CHROME_DRIVER, filePath);
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("useAutomationExtension", false);
        driver = new ChromeDriver(options);
    }

    @Given("^I open Google$")
    public void I_open_google() {
        System.out.println("driver: " + driver);
        //Set implicit wait of 10 seconds and launch google
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get("https://www.google.co.in");
    }

    @When("^I enter \"([^\"]*)\" in search textbox$")
    public void I_enter_in_search_textbox(String additionTerms) {
        //Write term in google textbox
        WebElement googleTextBox = driver.findElement(By.id("gbqfq"));
        googleTextBox.sendKeys(additionTerms);

        //Click on searchButton
        WebElement searchButton = driver.findElement(By.id("gbqfb"));
        searchButton.click();
    }

    @Then("^I should get result as \"([^\"]*)\"$")
    public void I_should_get_correct_result(String expectedResult) {
        //Get result from calculator
        WebElement calculatorTextBox = driver.findElement(By.id("cwos"));
        String result = calculatorTextBox.getText();
        //Verify that result of 2+2 is 4
        assertEquals(result, expectedResult);
    }

    @AfterClass
    public static void closeBrowser() {
        if (null != driver) {
            driver.close();
            driver.quit();
        }
    }

}   
@RunWith(SpringRunner.class)
@SpringBootTest
public abstract class CucumberStepDefinitions {

}
@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty"}, features = {"src/test/resources/features"})
public class TestRunner {

}
src/test/resources/features/calc.feature

Feature: Check addition in Google calculatorcontent
  In order to verify that Google calculator work correctly
  As a user of Google
  I should be able to get correct addition result

  Scenario: Addition
    Given I open Google
    When I enter "2+2" in search textbox
    Then I should get result as "4"
src/test/resources/drivers/chromedriver.exe

pom.xml

   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>4.2.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>4.2.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-spring</artifactId>
        <version>4.2.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-chrome-driver</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>2.45.0</version>
        <scope>test</scope>
    </dependency>

org.springframework.boot
弹簧起动试验
测试
黄瓜
黄瓜爪哇
4.2.3
测试
黄瓜
黄瓜刺柏
4.2.3
测试
黄瓜
黄瓜之春
4.2.3
测试
org.seleniumhq.selenium
硒爪哇
测试
org.seleniumhq.selenium
硒铬驱动器
org.seleniumhq.selenium
硒铬驱动器
2.45.0
测试

问题在于,您使用了JUnit的
@BeforeClass
注释,但Cucumber runner不遵守该注释

相反,您可以使用
cucumber.api.Before
->
@Before
@After
注释

如果您使用这些注释中的一个注释方法钩子,您可以使用
Scenario
接口来获取(例如)正在运行的场景的标记

您还可以有多个
@Before
@After
方法,您可以按如下方式提供它们的顺序:

@Before(order = 1)
public void init(Scenario scenario) { }

我没有看到
System.out.println(“Into the setUp()方法…”)的输出。您确定调用了此方法吗?您是否从
JUnit
包导入了
@BeforeClass
。如果不导入它们,代码甚至不会编译。它看起来像是
Cucumber
无法识别
JUnit
注释,它完全忽略了它。这实际上就是我的想法。您可以使用
cucumber.api.Before
根据场景实例化WebDriver:)靶心:)。这很有魅力。Cucumber是个新手,不知道他们有这些很酷的注释,我可以用它们来代替JUnit注释。好吧,这是否意味着可以在同一个类中使用
@Before
注释多个方法,并使用
order
参数对执行进行优先级排序。而且是
@Before(cucumber.api.Before)
@BeforeClass(org.junit.BeforeClass)
?@user2325154是的。一定要留意订单。因为对于
@之前的
首先运行较低的数字。对于
@之后的
,首先运行更高的数字。另外,确保Cucumber Runner可以像Cucumber Steps一样使用这些钩子。好的,
JUnit@BeforeClass
的一个要求是方法应该是
static
。同样的事情也适用于
Cucumber's@Before
吗?@user2325154不,方法是
public void myHookName(场景)