Крючки для огурца проходят, но не тесты - PullRequest
0 голосов
/ 04 июня 2019

Я получаю сообщение об ошибке: cucumber.runtime.CucumberException: Failed to instantiate class steps.MyStepdefs

Вот что я пытаюсь сделать.Мои хуки находятся в пакете steps:

public class hooks {
    public static WebDriver webDriver;

    @Before
    public static void ChromeDriverSetup() {

        System.out.println("Creating new ChromeDriver instance...");
        webDriver = new ChromeDriver();

        System.out.println("Hello from hooks!");
    }

Выше выполнено ...

Но тестовый класс MyStepdefs не выполняется (он также находится в steps пакет) и я получаю вышеуказанную ошибку.

public class MyStepdefs {
   ProductPage productPageObjects = new ProductPage();


    @Given("I purchase {int} items of the same product")
    public void iPurchaseItemsOfTheSameProduct(int qty)  {

        System.out.println("Hello from MySteps!");
        productPageObjects.Visit();
        productPageObjects.ClickPlusQtyElement(qty);
    }
package pageobjects;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import static steps.hooks.webDriver;

public class ProductPage {

    private WebElement totalQtyElement = webDriver.findElement(By.cssSelector(".sanitized"));
    private WebElement plusQtyElement = webDriver.findElement(By.cssSelector(".sanitized"));

    public void Visit() {
        webDriver.get("https://www.example.com");
    }


    public String ClickPlusQtyElement(int qty) {

        int minAmount = 1;
        while (minAmount < qty)
        {
            plusQtyElement.click();
            minAmount ++;

        }
        System.out.println("The amount is now: " + totalQtyElement.getText());

        return totalQtyElement.getText();
    }
}

В IntelliJ мой glue установлен как steps.У меня также есть класс RunCucumberTest в пакете steps.

package steps;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(tags = "not @ignore", plugin = {"pretty", "html:target/cucumber"})
public class RunCucumberTest {}

Почему он не выполняет MyStepsdefs?

stacktrace: https://pastebin.com/X5KhHfuP

Обновление : Когда я комментирую вызовы ProductPage, строка System.out.println("Hello from MySteps!"); выполняется.Так что есть проблема с этим конкретным вызовом.

Ответы [ 3 ]

1 голос
/ 04 июня 2019

Хорошо, я понял это. Когда я пытаюсь создать экземпляр класса ProductPage, я получаю сообщение об ошибке из-за вызовов веб-драйвера, т.е. private WebElement totalQtyElement = webDriver.findElement(By.cssSelector(".sanitized"));

Проблема в том, что я еще не посетил URL! Итак, я собираюсь поместить вышеупомянутое в метод и сделать некоторый рефакторинг.

0 голосов
/ 04 июня 2019

Проблема в вашей странице продукта.Когда вы создаете экземпляры этих двух полей веб-элементов:

private WebElement totalQtyElement = webDriver.findElement(By.cssSelector(".sanitized"));
private WebElement plusQtyElement = webDriver.findElement(By.cssSelector(".sanitized"));

, вы получаете исключение нулевого указателя.

Почему?Потому что в этот момент хук @Before не работает, а ваш webDriver по-прежнему равен нулю, когда вы пытаетесь создать экземпляр ProductPage.

Я бы предложил переместить все эти вызовы (webDriver.findElement) внутрьопределение шага или внутри метода, который вызывается из определения шага.Таким образом, вы можете быть уверены, что порядок создания экземпляров не вызовет проблем.

0 голосов
/ 04 июня 2019

Если вы проанализируете трассировку стека, мы увидим, что NullPointerException происходит в 16 строке в классе ProductPage.java

Caused by: java.lang.NullPointerException
    at pageobjects.ProductPage.<init>(ProductPage.java:16)
    at steps.MyStepdefs.<init>(MyStepdefs.java:15)
    ... 18 more

Пожалуйста, проверьте инициализацию нанад строкой, так как, вероятно, эта ссылка используется в приведенном ниже коде в строке productPageObjects.Visit ();

public class MyStepdefs {

    @Given("I purchase {int} items of the same product")
    public void iPurchaseItemsOfTheSameProduct(int qty)  {

        System.out.println("Hello from MySteps!");
        productPageObjects.Visit();
        productPageObjects.ClickPlusQtyElement(qty);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...