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(场景)