Первый тест TestFX не выполнен, идентичные вторые тесты проходят, когда в режиме без головы

У меня проблема с TestFX, и он работает в автономном режиме на настольном ПК с openjfx-monocle.

В моем первом "хобби-проекте" все работало нормально, но теперь, когда я делал это на работе, у меня возникли некоторые проблемы с основным меню, которое у нас есть.

Таким образом, главное меню состоит из MenuBar, который содержит меню и те, которые содержат элементы меню. Ссылка на изображение ниже.

Как составлено меню

Проблема, с которой я столкнулся, заключалась в том, что я хотел открыть диалоговое окно "О программе" в главном окне. Это можно сделать, щелкнув в строке меню в меню с надписью "Справка", в котором отображается раскрывающийся список элементов меню, а в меню "Справка" у нас есть только опция "О программе".

Так что к актуальной проблеме. Я получаю сообщение об ошибке, когда пытаюсь щелкнуть пункт меню "О программе"... чтобы в меню "Справка" можно было нажимать.

Я получаю ошибку:

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.

Зависимости TestFX и Monocle в файле build.gradle:

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 ответов

Другие вопросы по тегам