java.lang.NullPointerException 使用带有 Java 的 cucumber-junit 通过步骤定义文件执行黄瓜功能文件时
java.lang.NullPointerException when executing cucumber feature file through step definition file using cucumber-junit with Java
虽然 运行 一个使用带有 Java 的 junit 的黄瓜功能文件,但我收到一个 NULL 指针异常。我无法理解为什么会出现此异常。
这是我的步骤定义文件,写在 java 中。
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import pageObjects.CartPage;
import pageObjects.Checkoutpage;
import pageObjects.HomePage;
import pageObjects.ProductListingPage;
import cucumber.api.PendingException;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;
public class EndtoEndTest {
WebDriver driver;
@Given("^User is on Homepage$")
public void user_is_on_Homepage() throws Throwable {
System.setProperty("webdriver.chrome.driver", "C:\Users\Downloads\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.shop.demoqa.com");
driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
driver.manage().window().maximize();
}
@When("^he searches for \"([^\"]*)\"$")
public void he_searches_for(String arg1) throws Throwable {
HomePage home = new HomePage(driver);
home.perform_Search(arg1);
}
@When("^Choose to buy the first item$")
public void choose_to_buy_the_first_item() throws Throwable {
ProductListingPage productListingPage = new ProductListingPage(driver);
productListingPage.select_Product(0);
productListingPage.clickOn_AddToCart();
}
@When("^moves to checkout from mini cart$")
public void moves_to_checkout_from_mini_cart() throws Throwable {
CartPage cartPage = new CartPage(driver);
cartPage.clickOn_Cart();
cartPage.clickOn_ContinueToCheckout();
}
@When("^enter personal details onn checkout page$")
public void enter_personal_details_onn_checkout_page() throws Throwable {
Checkoutpage checkoutPage = new Checkoutpage(driver);
checkoutPage.fill_PersonalDetails();
}
@When("^select same delivery address$")
public void select_same_delivery_address() throws Throwable {
Checkoutpage checkoutPage = new Checkoutpage(driver);
checkoutPage.check_ShipToDifferentAddress(false);
}
@When("^select payment method as \"([^\"]*)\" payment$")
public void select_payment_method_as_payment(String arg1) throws Throwable {
Checkoutpage checkoutPage = new Checkoutpage(driver);
checkoutPage.select_PaymentMethod("CheckPayment");
}
@When("^place the order$")
public void place_the_order() throws Throwable {
Checkoutpage checkoutPage = new Checkoutpage(driver);
checkoutPage.check_TermsAndCondition(true);
checkoutPage.clickOn_PlaceOrder();
driver.quit();
}
}
这是我的 PageObject 文件
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.PageFactory;
public class HomePage {
WebDriver driver;
public HomePage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
@FindBy(how=How.XPATH, using="//a[@class='noo-search icon_search']")
private WebElement click_on_search_icon;
@FindBy(how = How.XPATH, using="//input[@class='form-control']")
private WebElement enter_data_for_search;
public void perform_Search(String search) {
click_on_search_icon.click();
enter_data_for_search.sendKeys(search);
enter_data_for_search.sendKeys(Keys.ENTER);
}
public void navigateTo_HomePage() {
driver.get("http://www.shop.demoqa.com");
}
}
**我在 运行 功能文件时得到的错误堆栈跟踪:
java.lang.NullPointerException
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy13.click(Unknown Source)
at pageObjects.HomePage.perform_Search(HomePage.java:27)
at stepDefinations.EndtoEndTest.he_searches_for(EndtoEndTest.java:39)
at ✽.When he searches for "dress"(src/test/resources/functionalTest/EndtoEndTest.feature:9)
我不确定为什么会出现空指针异常。任何帮助,将不胜感激。谢谢**
您收到空指针异常,因为您的驱动程序对象的范围仅限于一个方法。一旦 cucumber-JVM 测试运行程序退出以下方法,它就会被销毁。 : user_is_on_Homepage() 您必须按以下方式重写您的 class。
public EndToEndTest(){
System.setProperty("webdriver.chrome.driver", "C:\Users\Downloads\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.shop.demoqa.com");
driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
driver.manage().window().maximize();
}
@Given("^User is on Homepage$")
public void user_is_on_Homepage() throws Throwable {
//do some assertion that verifies you are on Homepage.
}
将驱动程序实例化移动到构造方法。或 创建一个 parent/base class 来处理驱动程序对象 的实例化和关闭。
如果您继续使用后一种方法,请使用来自 Junit 的 @Before 和 @After 注释在执行功能测试之前处理驱动程序对象的拆卸和设置。
您看到 NullPointerException 因为您声明了 WebDriver 的实例,如 :
WebDriver driver;
但是在 user_is_on_Homepage()
函数中向前推进,您已经启动了 WebDriver 的另一个实例,如 :
WebDriver driver = new ChromeDriver();
由于您的所有函数都将使用相同的 WebDriver 实例,因此您需要使用已在全局声明的 WebDriver 实例.
解决方案
从 :
更改行
WebDriver driver = new ChromeDriver();
收件人:
driver = new ChromeDriver();
我也遇到了同样的问题。我已通过在步骤定义文件中将 WebDriver 设置为静态来纠正它,如下所示。
public class StepDefinitions {
static WebDriver driver;
HomePage homePage;
@Given("^I navigate to the website$")
public void iNavigateToTheWebsite() {
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get(config.getString("test.url"));
}
@When("^I enter details and click offers$")
public void iEnterDetailsAndClickOffers() {
homePage = new HomePage(driver);
homePage.searchOffer();
}
@When("^I update the dates of the search$")
public void iUpdateTheDatesOfTheSearch(){
hotelSelectionPage = new HotelSelectionPage(driver);
hotelSelectionPage.selectNewSearchDates();
}
}
虽然 运行 一个使用带有 Java 的 junit 的黄瓜功能文件,但我收到一个 NULL 指针异常。我无法理解为什么会出现此异常。
这是我的步骤定义文件,写在 java 中。
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import pageObjects.CartPage;
import pageObjects.Checkoutpage;
import pageObjects.HomePage;
import pageObjects.ProductListingPage;
import cucumber.api.PendingException;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;
public class EndtoEndTest {
WebDriver driver;
@Given("^User is on Homepage$")
public void user_is_on_Homepage() throws Throwable {
System.setProperty("webdriver.chrome.driver", "C:\Users\Downloads\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.shop.demoqa.com");
driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
driver.manage().window().maximize();
}
@When("^he searches for \"([^\"]*)\"$")
public void he_searches_for(String arg1) throws Throwable {
HomePage home = new HomePage(driver);
home.perform_Search(arg1);
}
@When("^Choose to buy the first item$")
public void choose_to_buy_the_first_item() throws Throwable {
ProductListingPage productListingPage = new ProductListingPage(driver);
productListingPage.select_Product(0);
productListingPage.clickOn_AddToCart();
}
@When("^moves to checkout from mini cart$")
public void moves_to_checkout_from_mini_cart() throws Throwable {
CartPage cartPage = new CartPage(driver);
cartPage.clickOn_Cart();
cartPage.clickOn_ContinueToCheckout();
}
@When("^enter personal details onn checkout page$")
public void enter_personal_details_onn_checkout_page() throws Throwable {
Checkoutpage checkoutPage = new Checkoutpage(driver);
checkoutPage.fill_PersonalDetails();
}
@When("^select same delivery address$")
public void select_same_delivery_address() throws Throwable {
Checkoutpage checkoutPage = new Checkoutpage(driver);
checkoutPage.check_ShipToDifferentAddress(false);
}
@When("^select payment method as \"([^\"]*)\" payment$")
public void select_payment_method_as_payment(String arg1) throws Throwable {
Checkoutpage checkoutPage = new Checkoutpage(driver);
checkoutPage.select_PaymentMethod("CheckPayment");
}
@When("^place the order$")
public void place_the_order() throws Throwable {
Checkoutpage checkoutPage = new Checkoutpage(driver);
checkoutPage.check_TermsAndCondition(true);
checkoutPage.clickOn_PlaceOrder();
driver.quit();
}
}
这是我的 PageObject 文件
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.PageFactory;
public class HomePage {
WebDriver driver;
public HomePage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
@FindBy(how=How.XPATH, using="//a[@class='noo-search icon_search']")
private WebElement click_on_search_icon;
@FindBy(how = How.XPATH, using="//input[@class='form-control']")
private WebElement enter_data_for_search;
public void perform_Search(String search) {
click_on_search_icon.click();
enter_data_for_search.sendKeys(search);
enter_data_for_search.sendKeys(Keys.ENTER);
}
public void navigateTo_HomePage() {
driver.get("http://www.shop.demoqa.com");
}
}
**我在 运行 功能文件时得到的错误堆栈跟踪:
java.lang.NullPointerException
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy13.click(Unknown Source)
at pageObjects.HomePage.perform_Search(HomePage.java:27)
at stepDefinations.EndtoEndTest.he_searches_for(EndtoEndTest.java:39)
at ✽.When he searches for "dress"(src/test/resources/functionalTest/EndtoEndTest.feature:9)
我不确定为什么会出现空指针异常。任何帮助,将不胜感激。谢谢**
您收到空指针异常,因为您的驱动程序对象的范围仅限于一个方法。一旦 cucumber-JVM 测试运行程序退出以下方法,它就会被销毁。 : user_is_on_Homepage() 您必须按以下方式重写您的 class。
public EndToEndTest(){
System.setProperty("webdriver.chrome.driver", "C:\Users\Downloads\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.shop.demoqa.com");
driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
driver.manage().window().maximize();
}
@Given("^User is on Homepage$")
public void user_is_on_Homepage() throws Throwable {
//do some assertion that verifies you are on Homepage.
}
将驱动程序实例化移动到构造方法。或 创建一个 parent/base class 来处理驱动程序对象 的实例化和关闭。
如果您继续使用后一种方法,请使用来自 Junit 的 @Before 和 @After 注释在执行功能测试之前处理驱动程序对象的拆卸和设置。
您看到 NullPointerException 因为您声明了 WebDriver 的实例,如 :
WebDriver driver;
但是在 user_is_on_Homepage()
函数中向前推进,您已经启动了 WebDriver 的另一个实例,如 :
WebDriver driver = new ChromeDriver();
由于您的所有函数都将使用相同的 WebDriver 实例,因此您需要使用已在全局声明的 WebDriver 实例.
解决方案
从 :
更改行WebDriver driver = new ChromeDriver();
收件人:
driver = new ChromeDriver();
我也遇到了同样的问题。我已通过在步骤定义文件中将 WebDriver 设置为静态来纠正它,如下所示。
public class StepDefinitions {
static WebDriver driver;
HomePage homePage;
@Given("^I navigate to the website$")
public void iNavigateToTheWebsite() {
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get(config.getString("test.url"));
}
@When("^I enter details and click offers$")
public void iEnterDetailsAndClickOffers() {
homePage = new HomePage(driver);
homePage.searchOffer();
}
@When("^I update the dates of the search$")
public void iUpdateTheDatesOfTheSearch(){
hotelSelectionPage = new HotelSelectionPage(driver);
hotelSelectionPage.selectNewSearchDates();
}
}