AssertJ Swing 无法在一台 Windows 10 台机器上工作

AssertJ Swing not working on one Windows 10 machine

我们在 Java 应用程序的演示版中使用 AssertJ Swing 中的机器人来对我们的应用程序执行一些自动配置更改。这比教我们的推销员正确地做这些事情要好得多,也容易得多。

代码在几台 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() returns 顶级 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()方法在Windows10机器上失败,因为tabbedPane.selectTab("Buttons")方法并没有真正点击选项卡,所以我们要找的table屏幕上没有。

奇怪的是,selectTab() 方法认为它做了正确的事情,因此不会抛出任何错误。但是,当我观看它时,鼠标会移动到选项卡上方的屏幕顶部,然后在应用程序标题栏上单击(如果它完全单击 - 我不确定)。非常奇怪,特别是因为它适用于我们尝试过的所有其他系统(包括 Windows 10)。

以下是我在故障机器上认为可能存在的一些问题,结果却一无所获:

所以,我正在寻找我可能错过的干扰 AssertJ Swing 的东西。有什么建议或想法吗?

更新 1

在故障笔记本电脑和工作正常的 Windows 10 机器上尝试了 Java 的不同版本和位数。两者都没有区别。

发生故障的笔记本电脑是 运行ning Windows 10 v1803。 工作机器是 运行ning Windows 10 v1809.

我们没有看到将 Windows 10 升级或降级到特定版本的简单方法,并且不想通过升级到 v1903 来加入销售人员笔记本电脑的 Beta 测试。

更新 2

我们以不同的方式选择了选项卡(使用常规的 Swing 代码,而不是 AssertJ Swing 代码),这当然奏效了。但是,下一段需要移动鼠标的 AssertJ Swing 代码将鼠标移到了另一个错误的位置。

尽管 Swing 为它提供了正确的坐标(根据我们添加的一些日志语句),但它似乎在某种程度上做错了数学运算并点击了太高和太左的位置。

更新 3

我们在另一台具有相同硬件和 OS 的笔记本电脑上进行了尝试,但它以同样的方式失败了。

这是 Java 8 中的错误,记录在此处:

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

不幸的是,来自 Oracle 的第一条评论声称该错误不会影响 Java8。这不是真的,因为票证中的测试用例在我的测试系统上失败,出现了问题。

我已将问题报告给 Oracle,但对 Java 8 的修复程序即将到来的信心很低。

我发现它在 Java 11.0.4 下工作正常(应该在 Java 11.0.1 中修复),所以我们通过移动到 [=21= 来避免这个问题] 11(它有自己的一系列问题)。