执行 Selenium Jbehave 测试时出现 NoSuchMethodError: org.jbehave.core.steps.DelegatingStepMonitor

发布于 2025-01-15 08:20:38 字数 7639 浏览 2 评论 0原文

我尝试实现这样的 Selenium + Jbehave 解决方案: https://jbehave.org/reference/web/stable/page-objects。 html 但当我尝试执行时遇到了一些麻烦。

Story runner 类:

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 类:

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();
}
}

Pages 对象注入了 Selenium API 特定的对象:

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;
}}

我要首先执行的登录 Page POM 如下所示:

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);
}}

因此,pages.loginPagePOM().open() 是入口点。

当我尝试执行 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

我认为配置方面出现问题。

在没有 Jbehave 的情况下,我没有在之前的项目中设置任何驱动程序,例如 Firefox 驱动程序:

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

解决方案是什么? 提前感谢您的帮助!

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!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文