Автоматическое тестирование SideMenu с использованием Addon Masquerade

Есть желание сделать автотесты для кастомных элементов SideMenu, которые мы сами создаем в приложении.
Ранее был метод MenuItem#setTestId(), который позволял задать значение cuba-id для идентификации элемента при тестирования UI.

В платформе 7.2.13 этого метода больше нет.
Как сейчас можно добраться до нужного пункта меню, созданного программно в приложении?

Получилось добраться только через использование SelenideElement и @FindBy(xpath = ".....")
Но если есть более изящный вариант - буду благодарен за совет.

Добрый день, @andrey_vb!

Первым делом, установите значение true для переменной cuba.testMode в файле web-app.properties.

У компонента sideMenu есть cuba-id=“sideMenu” и у каждого пункта меню есть свой cuba-id (например - Administration = cuba-id=“administration”, User.browse = cuba-id=“sec$User.browse”). Но Вы не сможете добраться до пункта меню, если он скрыт - Вам нужно будет сначала раскрыть пункты меню родителя, а затем открыть пункт потомка.

Пример открытия User.Browse:


    @Test
    @DisplayName("Opens menu item")
    void openMenu() {
        Selenide.open("/app/");
        $c(Button.class, "loginButton").click();
        SelenideElement sideMenu = $c("sideMenu")
                .shouldBe(Condition.visible)
                .shouldBe(Condition.enabled);

        openItem(sideMenu, "administration", "sec$User.browse");
    }

    void openItem(SelenideElement sideMenu, String... path) {
        SelenideElement menuItemElement;
        for (String s : path) {
            menuItemElement = sideMenu.$(byCubaId(s))
                    .shouldBe(Condition.visible)
                    .shouldBe(Condition.enabled);

            if (!menuItemElement.has(cssClass(SIDE_MENU_ITEM_HEADER_OPEN))) {
                menuItemElement.click();
            }
        }
    }

С уважением,
Глеб

@durygin Благодарю за развернутый ответ и обозначенный тонкий момент: “Но Вы не сможете добраться до пункта меню, если он скрыт - Вам нужно будет сначала раскрыть пункты меню родителя, а затем открыть пункт потомка”.

Разобрался…

Свойство cuba.testMode было включено и с обнаружением по cuba-id стандартных пунктов меню (которые есть в web-menu.xml) проблем не было.
Но у нас еще реализовано собственное отображение папок приложения в SideMenu.
Мы создаем новые MenuItem по имени папки приложения:
childMenuForAdd = sideMenu.createMenuItem(appFoldersIten.getName());
А далее назначаем для menuItem команду с вызовом метода открытия соответствующей папки приложения.
И тут я упустил момент, что по факту мы этим определяем menuItem.id, который и отображается непосредственно в sideMenu как Видимое пользователю наименование пункта.

Далее у я видел в текущей документации описание метода MenuItem#setTestId: “setTestId - устанавливает значение cuba-id для тестирования UI”.
Т.е. вроде как можно задать cuba-id для пункта меню не совпадающий с menuItem.id, и который не будет зависеть от того, как отображается пункт в меню.

Но в текeщем API этого метода не обнаружил.
И после этого мои глаза отказались видеть в разметке атрибуты типа cuba-id="Заказы/Ком.предложения" ожидая увидеть все же некий “технический” англоязычный вид. :joy:

Но в нашем случае, использование таких cuba-id в коде тестов не особо надежнее использования xPath…
По факту имя папки приложения - штука достаточно непостоянная и больше связана с тем, как удобнее отображать имя папки для Пользователя.

Возможность задать отдельный стабильный cuba-id для пункта меню, используя метод типа MenuItem#setTestId была бы очень полезной.

Может стоит вернуть метод в Jmix?
Или добавить в menuItem отдельное свойство вроде name для отображаемого имени пункта меню?
Тогда menuItem.id будет стабильным техническим id, который может быть использован и при тестировании, а name будет отвечать за отображаемое пользователю имя пункта меню, которое возможно будет меняться в зависимости от локали.

И еще вопрос про судьбу addon Masquerade - планируется его портировать на Jmix с добавлением обёрток для актуальных ходовых элементы управления?

В текущей версии Masquerade нет оберток для многих ходовых элементов Cuba 7.x и сам addon не обновлялся уже год.
Очень нехватает оберток как минимум для OptionsGroup, SuggestionPickerField, SuggestionField

Добрый день, @andrey_vb!

Обычно имя папки - это ключ сообщения в messagePack, поэтому cuba-id для menuItem будет на английском языке. Тогда MenuItem нужно создавать с помощью другого метода:

childMenuForAdd = sideMenu.createMenuItem(appFoldersIten.getName(), messages.getMainMessage(appFoldersIten.getName()));

Если использовать в качестве имени для папки - ключ сообщения в messagePack, то значение cuba-id становится стабильным и постоянным на разных локалях.

Проект jmix-masquerade уже портирован на Jmix - https://github.com/Haulmont/jmix-masquerade.
Пример его использования - https://github.com/Haulmont/jmix-ui-tests.
Добавление новых компонентов и оберток в проект jmix-masquerade в ближайшее время не планировалось.

С уважением,
Глеб

1 симпатия