Можно создать дубликат:
Making FEST to wait for the application to loadСоздание Fest: ■ компонент поиска механизм ожидания для компонента существует
Примечание: Этот вопрос в основном идентичен this question. Поскольку ответов на этот вопрос не было, я решил расширить пример оттуда в исполняемый SSCE и предоставить дополнительную информацию, надеясь получить некоторую помощь.
Итак, вопрос в том, как вы должны обрабатывать поиск компонентов, когда искомый компонент еще не существует. Посмотрите на этот простой графический интерфейс с одной этикеткой.
public class MyFrame extends JFrame {
JLabel theLabel;
public MyFrame() {
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
theLabel = new JLabel();
theLabel.setName("theLabelName");
computeLabelContentOnWorkerThread();
}
private void computeLabelContentOnWorkerThread() {
new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
Thread.sleep(5000);
return "Info from slow database connection";
}
@Override
protected void done() {
try {
theLabel.setText(get());
add(theLabel);
pack();
setVisible(true);
} catch (InterruptedException ignore) {
} catch (ExecutionException ignore) {
}
}
}.execute();
}
}
И этот тест:
public class TestOfDelayedComponent extends FestSwingJUnitTestCase {
FrameFixture frameWrapper;
@Before
public void onSetUp() {
MyFrame frame = GuiActionRunner.execute(new GuiQuery<MyFrame>() {
protected MyFrame executeInEDT() {
return new MyFrame();
}
});
frameWrapper = new FrameFixture(robot(), frame);
frameWrapper.show();
}
@Test
public void testLabelContent() {
String labelContent = frameWrapper.label("theLabelName").text();
assertTrue(labelContent.equals("Info from slow database connection"));
}
}
Что происходит? Конструкция компонента метки делегируется медленному потоку рабочего. Таким образом, ярлык не появится сразу после появления GUI. Когда тестовый пример запущен, метка не появилась, поэтому при выполнении поиска компонента в frameWrapper.label("theLabelName")
генерируется исключение ComponentLookupException.
Вопрос как предотвратить исключение этого исключения? Если бы это был компонент верхнего уровня, я мог бы сделать WindowFinder.findFrame("title").withTimeout(10000)
, чтобы получить объект FrameFinder, который находит кадры, даже если есть задержка до их появления. То, что я хочу, похоже на это, но для других типов компонентов, таких как, например, JLabel.
ПРИМЕЧАНИЕ: Конечно, реализовать эту функциональность не будет. Было бы довольно просто сделать:
while(noComponentFound and notReachedTimeout){
look for component using FEST
sleep for a short delay
}
Однако, было бы хорошо, чтобы не быть вынуждены загромождать тестовые сценарии с такими петлями. Кажется, что ожидание компонентов не является слишком необычной задачей в тестовых сценариях. Поэтому, на мой взгляд, в FEST должна быть поддержка для этого. Может быть, это не так? Невозможно дождаться компонентов?