Взаимодействие JemmyFX с элементом управления в диалоге периодически прерывается ** в Linux**

Мое приложение 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), скомпилированными и запущенными на Java8u101 в Ubuntu 14.04.

1 ответ

Похоже, что это ошибка в JavaFX ( https://bugs.openjdk.java.net/browse/JDK-8166414). Это не может быть решено на стороне JemmyFX.

PS Маловероятно, что это будет исправлено в заметное время. Поэтому я могу только предложить использовать некрасивый обходной путь, такой как восстановление правильных координат диалога после получения неправильных (например, с помощью дополнительного centerOnScreen() при втором вызове слушателя свойства координат).

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