TestFX 4 Выбор значения из ChoiceBox / Menu

Я ломаю голову, пытаясь заставить моего робота TestFX щелкнуть Menu, а затем MenuItem.

Ни один из вышеперечисленных классов не является производным от Node, поэтому я не могу использовать fxRobot.clickOn(Node node).

Кто-нибудь еще знает, как это сделать? Помимо простого использования TextMatcher, который выполняет поиск по всей области.

Пример MenuBar с меню:

<MenuBar fx:id="mainMenuBar">
        <menus>
            <Menu mnemonicParsing="false" style="-fx-font-weight: bold;" text="MainMenu">
                <items>
                    <MenuItem mnemonicParsing="false" style="-fx-font-weight: normal;" text="About" />
                    <MenuItem mnemonicParsing="false" style="-fx-font-weight: normal;" text="Exit" />
                </items>
            </Menu>

Как мне добиться, чтобы робот щелкнул верхнюю часть Menu (желательно видимым текстом меню) и элемент меню внутри (также предпочтительно выбранный визуальным текстом)

Пример окна выбора:

<ChoiceBox fx:id="myChoices" />

Его элементы динамически заполняются с моего контроллера:

@FXML private ChoiceBox myChoices;

@FXML
public void initialize() {
    List<String> items = ItemsRepo.getItems();
    myChoices.setItems(FXCollections.observableArrayList(items))
}

Я мог бы сначала щелкнуть поле выбора через его fx:id. Но как мне тогда выбрать один из его элементов? Желательно из элементов виден текст. Тексты элементов могут мешать другим текстам внутри приложения. Поэтому я хочу убедиться, что я нажимаю один из элементов поля выбора, а не какой-либо другой текст.

С Уважением


person Robin Jonsson    schedule 19.08.2016    source источник
comment
добавьте код сюда. я скажу вам, как это сделать   -  person Gaali Prabhakar    schedule 19.08.2016
comment
@Prabhakargaali Я добавил пример кода   -  person Robin Jonsson    schedule 19.08.2016


Ответы (2)


Мне пришлось заполнить всплывающую форму в моем тестовом примере, в котором было несколько полей ввода ChoiceBox. Элементы ChoiceBox были видны на Сцене под PopUp, поэтому найти элемент по его тексту было невозможно (робот обычно нажимал на другое вхождение текста). Я достиг этого с помощью FxRobotInterface, как показано ниже.

clickOn("#choiceBox");
type(KeyCode.DOWN);
type(KeyCode.ENTER);

Таким образом был выбран первый элемент ChoiceBox. Вы не можете полностью контролировать, какой элемент вы выбираете с помощью этого решения, поскольку элементы могут меняться, но в моем случае это сработало.

person Balint Korcsmar    schedule 20.08.2017

Если у вас есть сцена, вы можете использовать поиск в MenuBar, который является узлом внутри сцены.

MenuBar menuBar = scene.lookup("#menuBar");

Вам нужен "#" перед идентификатором. Когда у вас есть MenuBar, вы можете перебирать меню и пункты меню в каждом меню.

person Fiona Buchanan    schedule 04.11.2016
comment
Спасибо, Фиона, однако, когда я получил свой MenuBar по идентификатору и просмотрел его MenuItem, как мне щелкнуть тот, который я хочу? Как я упоминал в своем первоначальном вопросе, FXRobot может нажимать только на элементы, полученные из Node, а MenuItem не считается Node. Я мог бы просто использовать TextMatcher, чтобы щелкнуть по нему, но я бы хотел ограничить область действия сопоставления активным Menu (и не искать ЛЮБОЙ видимый текст) - person Robin Jonsson; 07.11.2016