0

我的 JavaFX 应用程序会第二次创建一个对话框,Stage而我的 JemmyFX 测试间歇性地无法单击该对话框中的控件。

在我的 Ubuntu Linux 工作站上,故障发生率约为 10%,但这在 Windows 上运行良好。

失败的近端原因似乎是 JemmyFX 在错误的位置单击鼠标。我对此进行了深入研究,错误的点击坐标似乎是由来自Window拥有Scene.

所以,我创建了一个最小的应用程序和测试来演示这个问题,它实际上以比我的实际应用程序更高的比率(大约 50%)失败。

这是应用程序:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.stage.Stage;

public class MySmallApplication extends Application {

    public void start(Stage primaryStage) {

        class MyDialog extends Stage {

            public MyDialog() {
                setTitle("My Dialog");
                ComboBox comboBox = new ComboBox();
                comboBox.getItems().add("apple");
                comboBox.getItems().add("pear");
                comboBox.getItems().add("banana");
                comboBox.setId("click-me");
                setScene(new Scene(comboBox));
                sizeToScene();
            }

        }

        Button button = new Button("Show Dialog");
        button.setOnAction((event) -> {
                new MyDialog().showAndWait();
            });

        primaryStage.setScene(new Scene(button));
        primaryStage.setTitle("My Small Application");
        primaryStage.show();
    }

}

这是测试:

import javafx.application.Application;
import javafx.scene.control.ComboBox;
import javafx.stage.Window;
import org.jemmy.fx.AppExecutor;
import org.jemmy.fx.SceneDock;
import org.jemmy.fx.control.ComboBoxDock;
import org.jemmy.fx.control.LabeledDock;
import org.jemmy.resources.StringComparePolicy;
import org.junit.BeforeClass;
import org.junit.Test;
import MySmallApplication;

public class WindowBugTest3 {

    @BeforeClass
    public static void launch() throws InterruptedException {
        AppExecutor.executeNoBlock(MySmallApplication.class);
        Thread.sleep(1000);
    }

    @Test
    public void testWindowPosition() throws InterruptedException {
        SceneDock sceneDock = new SceneDock();

        new LabeledDock(
            sceneDock.asParent(),
            "Show Dialog",
            StringComparePolicy.EXACT).mouse().click();

        Thread.sleep(1000);
        SceneDock dialogSceneDock = new SceneDock(
            "My Dialog",
            StringComparePolicy.EXACT);
        ComboBoxDock comboBoxDock = new ComboBoxDock(
            dialogSceneDock.asParent(), "click-me");

        comboBoxDock.selector().select("pear");
    }

}

我真的不想在 Windows 上开发我的测试。

我通过最近获取的 JemmyFX(8、8u、8u-dev)在 Ubuntu 14.04 上的 Java8u101 上编译和运行,观察到了所有这些。

4

1 回答 1

1

这似乎是 JavaFX 中的一个错误(https://bugs.openjdk.java.net/browse/JDK-8166414)。在 JemmyFX 方面无法解决。

PS 它极不可能在可观察的时间内修复。所以我可能只建议使用一些丑陋的解决方法,比如在收到不正确的对话框坐标后恢复正确的对话框坐标(例如,在第二次调用坐标属性侦听器时额外的 centerOnScreen())。

于 2016-09-20T21:59:50.780 回答