FESTIVAL:Aguarde o carregamento da GUI antes de fazer qualquer coisa
Pergunta
@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>(JTable.class) {
@Override protected boolean isMatching(JTable table) {
return (table instanceof myTreeTable);
}
});
}
Este código funciona bem.Se removermos a pausa de 5 segundos, a tabela não será encontrada porque o aplicativo leva alguns segundos para carregá-la.
Gostaria de saber se existe uma maneira mais limpa de fazer isso.Tentei com robot.waitForIdle() depois do ApplicationLauncher (acho que quando o EDT está vazio, tudo está carregado), mas simplesmente não funciona.
Eu sei que a pausa pode usar algumas condições como um evento sobre quando parar, mas não entendo como escrevê-la, pois o JavaDoc e o documento oficial são ruins.
- Pause.pause(WaitForComponentToShowCondition.untilIsShowing(frame.component())) :Preciso de um componente, se eu passar o frame wrapper ele não funciona.E não posso passar da mesa porque é exatamente isso que estou esperando para conseguir.
Entendo que provavelmente deveria trabalhar com ComponentFoundCondition, mas não entendi!Cansei com:
ComponentMatcher matcher = new GenericTypeMatcher<JTable>(JTable.class) { @Override protected boolean isMatching(JTable table) { return (table instanceof myTreeTable); } }; Pause.pause(new ComponentFoundCondition("DebugMsg", frame.robot.finder(), matcher));
Qualquer ajuda?
Solução
Você poderia usar Localizador de Componentes para localizar o componente.Por exemplo, com base no matcher da pergunta:
final ComponentMatcher matcher = new TypeMatcher(myTreeTable.class);
Pause.pause(new Condition("Waiting for myTreeTable") {
@Override
public boolean test() {
Collection<Component> list =
window.robot.finder().findAll(window.target, matcher);
return list.size() > 0;
}
}, 5000);
Aqui está uma alternativa com pesquisa por nome:
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<Component> list =
window.robot.finder().findAll(window.target, nameMatcher);
return list.size() > 0;
}
}, 5000);