FEST:在执行任何操作之前等待GUI加载

@Before public void setUp() { Robot robot = BasicRobot.robotWithCurrentAwtHierarchy(); ApplicationLauncher.application("myApp").start(); Pause.pause(5, TimeUnit.SECONDS); frame = WindowFinder.findFrame("frame0").using(robot); JTableFixture table = frame.table(new GenericTypeMatcher(JTable.class) { @Override protected boolean isMatching(JTable table) { return (table instanceof myTreeTable); } }); } 

这段代码效果很好。 如果我们删除5秒暂停,则找不到表,因为应用程序加载它需要几秒钟。

我想知道是否有更清洁的方法。 我在ApplicationLauncher之后尝试使用robot.waitForIdle()(我猜一旦EDT为空,一切都已加载),但它无法正常工作。

我知道暂停可以使用某些条件作为何时停止的事件,但我不明白如何编写它,因为JavaDoc和官方文档很差。

  • Pause.pause(WaitForComponentToShowCondition.untilIsShowing(frame.component())):我需要一个组件,如果我通过包装器框架它不起作用。 我无法通过这张桌子,因为这正是我正在等待的。
  • 我明白我应该使用ComponentFoundCondition,但我不明白! 我厌倦了:

      ComponentMatcher matcher = new GenericTypeMatcher(JTable.class) { @Override protected boolean isMatching(JTable table) { return (table instanceof myTreeTable); } }; Pause.pause(new ComponentFoundCondition("DebugMsg", frame.robot.finder(), matcher)); 

有帮助吗?

您可以使用ComponentFinder来定位组件。 例如,基于问题中的匹配器:

 final ComponentMatcher matcher = new TypeMatcher(myTreeTable.class); Pause.pause(new Condition("Waiting for myTreeTable") { @Override public boolean test() { Collection list = window.robot.finder().findAll(window.target, matcher); return list.size() > 0; } }, 5000); 

这是一个按名称查找的替代方法:

 final ComponentMatcher nameMatcher = new ComponentMatcher(){ @Override public boolean matches(Component c) { return "ComponentName".equals(c.getName()) && c.isShowing(); } }; Pause.pause(new Condition("Waiting") { @Override public boolean test() { Collection list = window.robot.finder().findAll(window.target, nameMatcher); return list.size() > 0; } }, 5000);