Закрытие диалогового окна в ui тестах

Есть диалоговое окно

Dialogs dialogs = getScreenContext(origin).getDialogs();
        dialogs.createInputDialog(this)
                .withCaption("Сохранить как черновик?")
                .withActions(
                        new InputDialogAction("discard")
                                .withCaption("Не сохранять")
                                .withHandler(e -> {
                                    result.discard();
                                    e.getInputDialog().close(StandardOutcome.DISCARD);
                                }),
                        new InputDialogAction(DialogAction.Type.OK.getId())
                                .withPrimary(true)
                                .withCaption("Сохранить")
                                .withHandler(e -> {
                                    result.commit();
                                    e.getInputDialog().close(StandardOutcome.COMMIT);
                                })
                )
                .show();

Как правильно закрыть это окно в ui тестах, нажав на кнопку “Сохранить” с actionId “ok”
есть следующий код, но он нерабочий:

OperationResult closeDialog = api.getOpenedInputDialog().screen().close(new StandardCloseAction("ok"));
        assertThat(closeDialog).isEqualTo(OperationResult.success());

Как я понял, он просто закрывает окно, нажав на “крестик”, но надо, чтобы нажималось “сохранить”

Добрый день!

Кнопку можно получить из открытого InputDialog, пример на Groovy можно посмотреть в этом тесте: jmix/InputDialogTest.groovy at a0be3dc2200dd4a646bdf2c2d7ff237b25d12958 · jmix-framework/jmix · GitHub

Основная идея сначала вызвать метод build() при построении диалога, чтобы получить ссылку на InputDialog. Затем можно получать через него компоненты:

def actionsLayout = (HBoxLayout) dialog.getWindow().getComponentNN("actionsLayout")
actionsLayout.getComponents().size() == 3

def okBtn = (Button) actionsLayout.getComponent(1) // because 0 - spacer
okBtn.getAction().actionPerform(okBtn) // вызов действия OK

А если actionsLayout не существует? (выдает ошибку)

Можете, пожалуйста, приложить код того, как Вы получаете actionsLayout? По идее, этот компонент всегда присутствует в InputDialog, и его никто не удаляет.

Возможно я что-то не так делаю и туплю, извиняюсь заранее, только недавно начал работать с фреймворком, вот мой код теста:

var browse = api.openStandardLookup(Attachment.class, AttachmentBrowse.class);
        browse.interact(click(button("detailsBtnId")));
        var editor = api.getOpenedEditorScreen(AttachmentEdit.class);
        editor.interact(enter(textField("commentField"), "Примечание"));
        api.getOpenedEditorScreen(AttachmentEdit.class).screen().close(new StandardCloseAction("windowClose"));
        assertThat(api.getOpenedInputDialog().screen().getDialogWindow().getCaption())
                .isEqualTo("Сохранить как черновик?");
        var actionsLayout = (HBoxLayout) api.getOpenedInputDialog().screen().getDialogWindow().getActionNN("actionsLayout");
       assertThat(actionsLayout.getComponents().size()).isEqualTo(3);

Попробуйте поменять getActionNN("actionsLayout") на getComponentNN("actionsLayout"), должно заработать.

помогло!!! Спсаибо большое, хорошего дня!)