JemmyFX interactions with a control in a dialog fail intermittently **on Linux**

138 Views Asked by At

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.

1

There are 1 best solutions below

0
On

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).