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)。
以下是我在故障机器上认为可能存在的一些问题,结果却一无所获:
- 字体缩放 - 设置为 100%,因此没有缩放
- 运行 原始分辨率 (1920x1080)
- 检查连接的 "extra" 监视器(不,没有)
- 引导进入带网络连接的安全模式(无法 运行 我们的应用程序,因为没有用于 WiFi 的网络 driver 并且笔记本电脑上没有网络插头 - 带网络连接的安全模式现在没有网络)
- 寻找可能有干扰的应用程序 - 没有找到任何
- 关闭 Windows 防火墙(在黑暗中拍摄)
- 我尝试了几次后无法连接调试器(运行s 在 WebStart 下所以调试器很棘手 - 不确定我到底希望学到什么)。
所以,我正在寻找我可能错过的干扰 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(它有自己的一系列问题)。
我们在 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)。
以下是我在故障机器上认为可能存在的一些问题,结果却一无所获:
- 字体缩放 - 设置为 100%,因此没有缩放
- 运行 原始分辨率 (1920x1080)
- 检查连接的 "extra" 监视器(不,没有)
- 引导进入带网络连接的安全模式(无法 运行 我们的应用程序,因为没有用于 WiFi 的网络 driver 并且笔记本电脑上没有网络插头 - 带网络连接的安全模式现在没有网络)
- 寻找可能有干扰的应用程序 - 没有找到任何
- 关闭 Windows 防火墙(在黑暗中拍摄)
- 我尝试了几次后无法连接调试器(运行s 在 WebStart 下所以调试器很棘手 - 不确定我到底希望学到什么)。
所以,我正在寻找我可能错过的干扰 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(它有自己的一系列问题)。