AssertJ Swing не работает на одном компьютере с Windows 10

Мы используем робота в AssertJ Swing в демо-версии нашего Java-приложения для выполнения некоторых автоматических изменений конфигурации нашего приложения. Это намного лучше и проще, чем учить нашего продавца делать эти вещи правильно.

Код работает у нас на нескольких машинах с Linux, на Mac и на одной машине с Windows 10. Однако он не работает на компьютере нашего продавца с Windows 10. На его машине установлена ​​Java 1.8, и мы успешно запустили эту версию Java на других машинах.

Я потратил некоторое время на отладку проблемы и не смог ее решить. Вот код, который использует робота:

        FrameFixture fullScreenFrame = robot.getFullScreenFrameFixture();
        // Go to the configuration screen
        robot.runCommand("MENU config");
        robot.waitForIdle();

        // Select Buttons tab
        JTabbedPaneFixture tabbedPane = fullScreenFrame.tabbedPane();
        LOG.log(Level.WARNING, "Found the Tab Pane "+tabbedPane);
        tabbedPane.selectTab("Buttons");
        LOG.log(Level.WARNING, "Found the Buttons Tab");
        robot.waitForIdle();
        // Select the "or" button group
        robot.clickOnTable(fullScreenFrame, "buttons", "buttongroups", "Name", "or");
        robot.waitForIdle();

Вот метод, который получает фикстуру:

public FrameFixture getFullScreenFrameFixture() {
    return new FrameFixture(ROBOT, DataSource.getInstance().getFullScreenFrame());
}

DataSource.getInstance().getFullScreenFrame() возвращает JFrame верхнего уровня. Переменная РОБОТ:

public static final Robot ROBOT = BasicRobot.robotWithCurrentAwtHierarchy();

Метод robot.runCommand(...) даже не использует робота и выглядит так:

public void runCommand(final String command) {
    try {
        SwingUtilities.invokeAndWait(new Runnable() {
            @Override
            public void run() {
                DataSource.getInstance().getFullScreenFrame().handleCommand(command);
            }
        });
    } catch (InterruptedException ex) {
        Logger.getLogger("com.hcs.orc.demo.DemoRobot").log(Level.SEVERE, "Bad news - Robot failed to run the command "+command, ex);
    } catch (InvocationTargetException ex) {
        Logger.getLogger("com.hcs.orc.demo.DemoRobot").log(Level.SEVERE, "Bad news - Robot failed to run the command "+command, ex);
    }
    waitForIdle();
}

Этот код работает правильно (и связан с нашим более крупным приложением) и выводит экран конфигурации для нашего приложения.

Вот метод ожидания простоя:

/**
 * Wait for the Event Thread to be idle.
 */
public void waitForIdle() {
    ROBOT.waitForIdle();
}

Метод clickOnTable() не работает на компьютере с Windows 10, потому что метод tabbedPane.selectTab("Buttons") фактически не щелкнул вкладку, поэтому искомая таблица отсутствует на экране.

Как ни странно, метод selectTab() считает, что поступил правильно, и поэтому не выдает никаких ошибок. Однако, когда я смотрю его, мышь переходит в верхнюю часть экрана над вкладкой и так щелкает (щелкает ли вообще - я не уверен) в строке заголовка приложения. Очень странно, тем более, что это работает на всех других системах (включая Windows 10), которые мы пробовали.

Вот некоторые вещи, которые я рассматривал как возможные проблемы на неисправной машине и оказались пустыми:

  • Масштаб шрифта — установите значение 100%, чтобы не было масштабирования.
  • Запуск в родном разрешении (1920x1080)
  • Проверьте наличие «лишнего» монитора (нет, нет)
  • Загрузка в безопасном режиме с поддержкой сети (не удалось запустить наше приложение, поскольку на ноутбуке нет сетевого драйвера для Wi-Fi и сетевого адаптера — безопасный режим с поддержкой сети теперь поставляется без сети)
  • Искал возможно мешающие приложения - не нашел
  • Отключил брандмауэр Windows (снято в темноте)
  • Мне не удалось подключить отладчик после нескольких попыток (работает под WebStart, поэтому отладчик сложен - в любом случае не уверен, что я надеялся узнать).

Итак, я ищу то, что я мог пропустить, что мешает AssertJ Swing. Любые предложения или идеи?

Обновление 1

Пробовал разные версии и разрядность Java как на неисправном ноутбуке, так и на работающей машине с Windows 10. Ни на том, ни на другом разницы не было.

Неисправный ноутбук работает под управлением Windows 10 v1803. На рабочей машине стоит Windows 10 v1809.

Мы не видим простого способа обновить или понизить Windows 10 до определенной версии и не хотим присоединяться к бета-тестированию ноутбука продавца путем обновления до v1903.

Обновление 2

Мы выбрали вкладку по-другому (используя обычный код Swing вместо кода AssertJ Swing), и это, конечно же, сработало. Однако следующий фрагмент кода AssertJ Swing, который должен был переместить мышь, переместил ее в другое неправильное место.

Похоже, что он как-то неправильно выполняет математические операции и щелкает слишком высоко и слишком далеко влево, даже несмотря на то, что Swing передает ему правильные координаты (согласно некоторым из наших добавленных операторов журнала).

Обновление 3

Мы попробовали это на другом ноутбуке с тем же оборудованием и ОС, и там все пошло не так.


person Stephen M -on strike-    schedule 02.07.2019    source источник


Ответы (1)


Это ошибка в Java 8, которая описана здесь:

https://bugs.openjdk.java.net/browse/JDK-8196030?attachmentOrder=des

К сожалению, в первом комментарии от Oracle утверждается, что ошибка не влияет на Java 8. Это неправда, поскольку тестовые примеры в заявке не работают на моей тестовой системе, в которой обнаружена проблема.

Я сообщил о проблеме в Oracle, но уверенность в том, что исправление для Java 8 появится, невелика.

Я обнаружил, что он работает правильно в Java 11.0.4 (предполагалось, что он будет исправлен в Java 11.0.1), поэтому мы избегаем проблемы, переходя на Java 11 (которая имеет свой собственный набор проблем).

person Stephen M -on strike-    schedule 22.08.2019