我在使用 TestFX 时遇到问题,并且在我的台式电脑上使用 openjfx-monocle 以无头模式运行。
在我的第一个“爱好项目”中一切正常,但现在在工作中这样做时,我遇到了我们拥有的主菜单的一些问题。
所以主菜单是由一个MenuBar 组成的,其中包含Menus,而那些包含menuItems。链接到下面的图片。
我遇到的问题是当我想从主窗口打开一个关于对话框时。这是通过单击菜单上的“帮助”菜单栏来完成的,该菜单显示菜单项的下拉列表,对于帮助菜单,我们现在只有“关于”选项。
所以对于实际问题。尝试单击“关于”菜单项时出现错误...因此“帮助”菜单是可单击的。
我得到的错误是:
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。摇篮版本: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);
}
}