[英]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)上运行。
以下是我在故障机器上发现的可能出现的问题,但出现空白:
因此,我正在寻找可能会干扰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.