java.awt.Robot.waitForIdle()不可靠
我们在每晚的UI测试中经常看到时间问题。测试经常失败,因为在测试代码尝试验证结果之前,java.awt.Robot执行的事件尚未完成 我们的代码类似于使用:java.awt.Robot.waitForIdle()不可靠,java,testing,awtrobot,Java,Testing,Awtrobot,我们在每晚的UI测试中经常看到时间问题。测试经常失败,因为在测试代码尝试验证结果之前,java.awt.Robot执行的事件尚未完成 我们的代码类似于使用: Point p = cb.getLocationOnScreen(); int m = 5; if (cb.getWidth()<5||cb.getHeight()<5) m=3; System.out.println("Click at " + (p.x+m) + "," + (p.y+m)); robot.mouse
Point p = cb.getLocationOnScreen();
int m = 5;
if (cb.getWidth()<5||cb.getHeight()<5)
m=3;
System.out.println("Click at " + (p.x+m) + "," + (p.y+m));
robot.mouseMove(p.x + m, p.y + m);
robot.mousePress(MouseEvent.BUTTON1_MASK);
robot.mouseRelease(MouseEvent.BUTTON1_MASK);
robot.waitForIdle();
Thread.sleep(100);
// Verify results...
点p=cb.getLocationOnScreen();
int m=5;
如果(cb.getWidth()我得出结论,我确实需要使用SunToolkit.realSync(),而且它似乎也能正确地用于Java9
看起来,尽管我找不到任何确凿的证据,realSync()会等待所有与图形相关的线程,而Robot.waitForIdle()和SwingUntilities.invokeLater()只会等待Java事件线程完成它的工作
如果有人提出了更好的答案,我会接受这个答案,而不是我的答案。您尝试过将设置为“开”吗?我不确定是否看到AutoWaitForIdle和手动调用waitForIdle()之间的区别。可能没有,只是一个粗略的猜测。可能值得一试。=)如果这不起作用,并且您不信任Robot.waitForIdle
,您可以使用SwingUtilities.invokeLater
从可运行的计划中执行“验证结果”。Runnable放在事件调度队列上,应该在队列上的所有内容之后进行处理。我的回答不被接受,因为今天,在Java 1.7 realSync()下挂起。不知道为什么,因为我对代码没有可见性。