Взаимодействие 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() при втором вызове слушателя свойства координат).