AssertJ Swing не работает на одной машине с Windows 10 - PullRequest
0 голосов
/ 02 июля 2019

Мы используем Robot в 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 верхнего уровня. Переменная ROBOT:

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), которые мы пробовали.

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

  • Font Scale - установить на 100%, поэтому масштабирование не будет
  • Запуск в собственном разрешении (1920x1080)
  • Проверьте, не подключен ли «дополнительный» монитор (нет, нет)
  • Загрузка в безопасном режиме с сетевым подключением (не удалось запустить наше приложение, так как нет сетевого драйвера для WiFi и сетевого разъема на ноутбуке - безопасный режим с сетевым подключением теперь поставляется без сетевого подключения)
  • Искал возможно мешающие приложения - не нашел ни одного
  • Выключил брандмауэр 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

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

...