Reputation: 31
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