BorbelyI
BorbelyI

Reputation: 31

NoSuchMethodError: org.jbehave.core.steps.DelegatingStepMonitor when executing Selenium Jbehave test

I tried to implement a Selenium + Jbehave solution like this: https://jbehave.org/reference/web/stable/page-objects.html but I have some trouble when I trie to execute.

Story runner class:

public class TravelLedgerWebStories extends JUnitStories {

private WebDriverProvider driverProvider = new PropertyWebDriverProvider();
private WebDriverSteps lifecycleSteps = new PerStoriesWebDriverSteps(driverProvider);
private Pages pages = new Pages(driverProvider);
private SeleniumContext context = new SeleniumContext();
private ContextView contextView = new LocalFrameContextView().sized(500, 100);

public TravelLedgerWebStories() {
    if ( lifecycleSteps instanceof PerStoriesWebDriverSteps ){
        configuredEmbedder().useExecutorService(new SameThreadExecutors().create(configuredEmbedder().embedderControls()));
    }
}

@Override
public Configuration configuration() {
    Class<? extends Embeddable> embeddableClass = this.getClass();
    return new SeleniumConfiguration()
            .useSeleniumContext(context)
            .useWebDriverProvider(driverProvider)
            .useStepMonitor(new SeleniumStepMonitor(contextView, context, new SilentStepMonitor()))
            .useStoryLoader(new LoadFromClasspath(embeddableClass))
            .useStoryReporterBuilder(new StoryReporterBuilder()
                    .withCodeLocation(codeLocationFromClass(embeddableClass))
                    .withDefaultFormats()
                    .withFormats(CONSOLE, TXT, HTML, XML));
}

@Override
public InjectableStepsFactory stepsFactory() {
    Configuration configuration = configuration();
    return new InstanceStepsFactory(configuration,
            new TravelledgerWebSteps(pages),
            lifecycleSteps,
            new WebDriverScreenshotOnFailure(driverProvider, configuration.storyReporterBuilder()));
}


@Override
protected List<String> storyPaths() {
    return new StoryFinder()
            .findPaths(codeLocationFromClass(this.getClass()).getFile(), asList("**/*.story"), null);
}
}

Step class:

public class TravelledgerWebSteps {

private final Pages pages;

public TravelledgerWebSteps(Pages pages) {
    this.pages = pages;
}

@Given("user is on Login page")
public void userIsOnLoginPage(){
    pages.loginPagePOM().open();
}

@Given("I login as: \"$email\" with password: \"$pass\"")
public void loginToMainPage(String email, String pass) {
    pages.transactionsPagePOM().open(email, pass);
}

@Given("Wait for loading main page")
public void waitForMainPage() throws InterruptedException {
    pages.transactionsPagePOM().waitForLoadingMainPage();
}

@Then("Navigate to Import file page")
public void navigateToImportFilePage() {
    pages.transactionsPagePOM().navigateToImportFilePage();
}

@Then("Select Auto commit uploaded invoices checkbox")
public void selectCheckbox() {
    pages.transactionsPagePOM().selectCheckBox();
}

@Then("Upload transaction file")
public void uploadTransactionFile(String location) {
    pages.transactionsPagePOM().uploadTransactionFile(location);
}

@Then("Navigate to Bookings page")
public void navigatesToBookingsPage() {
    pages.transactionsPagePOM().navigatesToBookings();
}

@Then("Check that the transactions have been commited and can be viewed")
public void checkTransactionsCommited() {
    pages.transactionsPagePOM().checkCommitedTransactions();
}

@Then("Logout")
public void logout() {
    pages.transactionsPagePOM().logout();
}
}

The Pages object is injected with the Selenium API-specific objects:

public class Pages {

private final WebDriverProvider driverProvider;

private LoginPagePOM loginPagePOM;
private TransactionsPagePOM transactionsPagePOM;

public Pages(WebDriverProvider driverProvider) {
    this.driverProvider = driverProvider;
}

public LoginPagePOM loginPagePOM(){
    if ( loginPagePOM == null ){
        loginPagePOM = new LoginPagePOM(driverProvider);
    }
    return loginPagePOM;
}

public TransactionsPagePOM transactionsPagePOM() {
    if ( transactionsPagePOM == null ){
        transactionsPagePOM = new TransactionsPagePOM(driverProvider);
    }
    return transactionsPagePOM;
}}

The login Page POM what I want to execute first looks like:

public class LoginPagePOM extends AbstractPage{

public LoginPagePOM(WebDriverProvider driverProvider) {
    super(driverProvider);
}

public void open() {
    get("https://qa.abtlg.io");
    manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}}

So the pages.loginPagePOM().open() is the enty point.

The error message when I tried to execute TravelledgerWebStories:

java.lang.NoSuchMethodError: org.jbehave.core.steps.DelegatingStepMonitor.<init>(Lorg/jbehave/core/steps/StepMonitor;)V

at org.jbehave.web.selenium.SeleniumStepMonitor.<init>(SeleniumStepMonitor.java:22)
at travelledgerJbehave.webdriver.TravelLedgerWebStories.configuration(TravelLedgerWebStories.java:43)
at org.jbehave.core.ConfigurableEmbedder.configuredEmbedder(ConfigurableEmbedder.java:122)
at travelledgerJbehave.webdriver.TravelLedgerWebStories.<init>(TravelLedgerWebStories.java:34)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:250)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:260)
at org.junit.runners.BlockJUnit4ClassRunner$2.runReflectiveCall(BlockJUnit4ClassRunner.java:309)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

Process finished with exit code 255

I think something in the configuration side go wrong.

I did not setup any driver for example firefox driver like this in my previous project without Jbehave:

System.setProperty("webdriver.gecko.driver", "/Users/User/Documents/selenium dependencies/drivers/geckodriver");
    WebDriver driver = new FirefoxDriver();
    driver.get("https://qa.abtlg.io");

What could be the solution? Thank you for your help in advance!

Upvotes: 1

Views: 456

Answers (0)

Related Questions