0

My JavaFX application creates a dialog as a second Stage and my JemmyFX tests intermittently fail to click controls in that dialog.

Failures occur at a rate of about 10% on my Ubuntu Linux workstation, but this works flawlessly on Windows.

The proximal cause of the failure seems to be that JemmyFX is clicking the mouse in the wrong places. I dug into this, and the bad click coordinates seem to be caused by incorrect window coordinates coming from the Window object that owns the Scene.

So, I created a minimal application and test that demonstrates the problem, and it actually fails at an even higher rate than my real application (about 50%).

Here is the application:

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

}

Here is the test:

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

}

I don't really want to develop my tests on Windows.

I observed all of this with recent fetches of JemmyFX (8, 8u, 8u-dev) compiled and run on Java8u101 on Ubuntu 14.04.

davidrmcharles
  • 1,923
  • 2
  • 20
  • 33

1 Answers1

1

It seems that it is a bug in JavaFX (https://bugs.openjdk.java.net/browse/JDK-8166414). It can't be resolved on JemmyFX side.

P.S. It is highly unlikely that it will be fixed in observable time. So I may only suggest to use some ugly workaround like restoring correct dialog coordinates after receiving incorrect ones (e.g. by additional centerOnScreen() on the second invocation of coordinate property listener).

J. Smith
  • 35
  • 7