在无头模式下,第一次TestFX测试执行失败,相同的第二次测试通过

时间:2017-07-17 16:37:40

标签: java javafx headless testfx

我在TestFX上遇到问题,并在我的桌面PC上使用openjfx-monocle在无头模式下运行。

在我的第一个"业余爱好项目中,一切都运转正常。但是现在当我在工作中这样做时,我遇到了一些主菜单问题。

因此主菜单由MenuBar构成,其中包含菜单,其中包含menuItems。链接到下面的图片。

How the menu is built up

我遇到的问题是当我想从主窗口打开一个关于对话框时。这可以通过单击菜单上的菜单栏来完成,该菜单显示“帮助”,其中显示了menuItem的下拉列表,而对于“帮助”菜单,我们只有“关于”'选项现在。

所以对实际问题。我在尝试点击“关于”时遇到错误。 MenuItem ......所以'帮助'菜单是可点击的。

我得到的错误是:

org.testfx.api.FxRobotException: the query "About" returned no nodes.
at org.testfx.api.FxRobot.queryVisibleNode(FxRobot.java:1107) at
org.testfx.api.FxRobot.pointOfVisibleNode(FxRobot.java:1076) at
org.testfx.api.FxRobot.clickOn(FxRobot.java:750) at
org.testfx.api.FxRobot.clickOn(FxRobot.java:60) at
se.compenayname.testfx.pages.AboutPage.openAboutDialogFromMain(AboutPage.java:46)

现在对我来说很奇怪的是,它对下一次执行的测试很有用。因此,如果我要创建让我们说空的测试,或者只是为1 + 1 = 2执行断言的测试并将其设置为先运行,那么所有测试都将通过。 - 但我不想这样做,闻起来很有趣,我想知道我做错了什么。

现在有没有人有过这样/类似的问题?或任何可以帮助我的人,希望只是指出我已经做过的一些愚蠢的新手错误并把它送到我的路上:)

您可能需要的其他信息: 操作系统:Windows 7。 编辑:Eclipse。 Gradle版本:3.3。 JDK:8u121。

build.gradle文件中的TestFX和Monocle依赖项是:

testCompile  "org.testfx:testfx-core:4.0.+", 
             "org.testfx:testfx-junit:4.0.+"
testRuntime  "org.testfx:openjfx-monocle:1.8.0_20"

我注意到确定是否需要其他任何东西,但我会试一试并发布此内容。如果我遗失某些东西,或者我不清楚,请事先道歉。

我正在运行的代码如下所示。

public class AboutDialogTests extends TestFXBase{

    private AboutPage aboutPage;

    @Before
    public void before() throws Exception {
        aboutPage = new AboutPage(this);
    }

    @Test
    public void verifyCopyrightText(){
        aboutPage.openAboutDialogFromMain();

        FxAssert.verifyThat(AboutDialogFXIDs.COPYRIGHTLABEL, (Label copyrightLabel) -> {
            String text = copyrightLabel.getText();
            return text.equals("Copyright © 1995-2017. CompanyName AB. All rights reserved.");
        }); 
    }
    @Test
    public void verifyCopyrightText2(){
        aboutPage.openAboutDialogFromMain();

        FxAssert.verifyThat(AboutDialogFXIDs.COPYRIGHTLABEL, (Label copyrightLabel) -> {
            String text = copyrightLabel.getText();
            return text.equals("Copyright © 1995-2017. CompanyName AB. All rights reserved.");
        }); 
    }
}

这是我的简单TestFXBase类:

public class TestFXBase extends ApplicationTest{

    private Stage primaryStage;

    /**
     * Am always running in headless mode at the moment.
     */
    static{
        System.setProperty("java.awt.headless", "true");
        System.setProperty("testfx.robot", "glass");
        System.setProperty("testfx.headless", "true");
        System.setProperty("prism.order", "sw");
        System.setProperty("prism.text", "t2k");

    }


    @Override
    public void start(Stage stage) throws Exception {
         this.primaryStage = stage;
         primaryStage.show();
    }


    @Before
    public void beforeEachTest() throws Exception{
        /*
         *  The following FxToolkit lines allow for indirectly performing
         *  ApplicationTest.launch(Main.class); and registering the primary stage
         *  in order to allow running multiple @Test in a single file
         */
        FxToolkit.registerPrimaryStage();

        // specifying which class to start the application with.
        FxToolkit.setupApplication(Main.class); 
    }


    /**
     * Release any keys and mousebuttons that may be stuck so that it wont influence other tests.
     * @throws TimeoutException
     */
    @After
    public void afterEachTest() throws TimeoutException{
        FxToolkit.hideStage();
        release(new KeyCode[]{});
        release(new MouseButton[]{});
    }
    public Stage getPrimaryStage() {
        return primaryStage;
    }
}

以下是AboutPage类:

public class AboutPage{
    private final TestFXBase base;

    public AboutPage(TestFXBase fxBase) {
        this.base = fxBase;
    }


    /**
    * Navigate through the main menu and open the 'About' dialog.
    */
    public void openAboutDialogFromMain() {
        base.clickOn("Help").clickOn("About", Motion.VERTICAL_FIRST, MouseButton.PRIMARY);

    // The lines below does not work at all when trying to click on a menu / menuitem.
    //base.clickOn(MainMenuFXIDs.MAINMENUHELP);
    //base.clickOn(MainMenuFXIDs.HELPMENUITEMABOUT);
    }


    public void closeAboutDialog() {
        base.clickOn(AboutDialogFXIDs.CLOSEBUTTON);
    }
}

0 个答案:

没有答案