繁体   English   中英

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()返回顶级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();
}

在Windows 10机器上,clickOnTable()方法失败,因为tabbedPane.selectTab("Buttons")方法实际上并未单击选项卡,因此我们要查找的表不在屏幕上。

奇怪的是,selectTab()方法认为它做对了,因此不会引发任何错误。 但是,当我观看它时,鼠标移至选项卡上方屏幕的顶部,因此单击了应用程序标题栏(如果完全单击,我不确定)。 非常奇怪,特别是因为它可以在我们尝试过的所有其他系统(包括Windows 10)上运行。

以下是我在故障机器上发现的可能出现的问题,但出现空白:

  • 字体比例-设置为100%,因此无法缩放
  • 以原始分辨率(1920x1080)运行
  • 检查是否连接了“额外”显示器(不,没有)
  • 引导到带有网络的安全模式(无法运行我们的应用程序,因为笔记本电脑上没有WiFi的网络驱动程序,也没有网络插头-现在带网络的安全模式不带网络)
  • 寻找可能干扰的应用程序-未找到任何应​​用程序
  • 关闭Windows防火墙(在黑暗中拍摄)
  • 经过几次尝试(在WebStart下运行,所以调试器很棘手-不确定我到底想学什么),我无法连接到调试器。

因此,我正在寻找可能会干扰AssertJ Swing的东西。 有什么建议或想法吗?

更新1

在出现故障的笔记本电脑和正在运行的Windows 10计算机上尝试了Java的不同版本和具体程度。 两者都没有影响。

故障笔记本电脑正在运行Windows 10 v1803。 工作机器正在运行Windows 10 v1809。

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

更新2

我们以不同的方式(使用常规的Swing代码,而不是AssertJ Swing代码)选择了选项卡,并且当然可以。 但是,需要移动鼠标的AssertJ Swing代码的下一部分,将其移动到了其他错误的位置。

看起来它以某种方式做错了数学,并且单击过高和过左,即使Swing向其提供了正确的坐标(根据我们添加的一些log语句)。

更新3

我们在具有相同硬件和操作系统的另一台笔记本电脑上进行了尝试,并且在那里以相同的方式失败了。

这是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中已修复)下可以正常工作,因此我们通过迁移到Java 11(它带有其自身的一系列问题)来避免此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM