From 4abfd88909d1647ecb2ab2d098b802e636af69c0 Mon Sep 17 00:00:00 2001 From: Alan Vezina Date: Mon, 12 Feb 2024 13:18:02 -0600 Subject: [PATCH] DropdownSection (#1820) --- .../components/react/DropdownButtonGroup.java | 2 +- .../test/components/react/MultiMenu.java | 38 +++++++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/org/labkey/test/components/react/DropdownButtonGroup.java b/src/org/labkey/test/components/react/DropdownButtonGroup.java index fd795be942..9e10be025e 100644 --- a/src/org/labkey/test/components/react/DropdownButtonGroup.java +++ b/src/org/labkey/test/components/react/DropdownButtonGroup.java @@ -254,7 +254,7 @@ static public Locator.XPathLocator buttonGroupWithId(String Id) static public Locator.XPathLocator buttonGroupWithClass(String cls) { - return Locator.tagWithClass("div", "dropdown").withChild(Locators.toggleAnchor().withClass(cls)); + return Locator.tagWithClass("div", "dropdown").withClass(cls); } } diff --git a/src/org/labkey/test/components/react/MultiMenu.java b/src/org/labkey/test/components/react/MultiMenu.java index fd5e9f7800..effbeb7400 100644 --- a/src/org/labkey/test/components/react/MultiMenu.java +++ b/src/org/labkey/test/components/react/MultiMenu.java @@ -61,8 +61,6 @@ public void doMenuAction(@LoggedParam List pathToAction) { expand(); - WebElement menuList = getMenuList(); - for (int i = 0; i < pathToAction.size(); i++) { Assert.assertFalse("Menu item not enabled.", isMenuItemDisabled(pathToAction.get(i))); @@ -72,8 +70,8 @@ public void doMenuAction(@LoggedParam List pathToAction) if (i < pathToAction.size() - 1) { // Everything in the pathToAction should contain a sub menu except possibly the last item. - Assert.assertTrue("Item in menu path '" + pathToAction.get(i) + "' does not contain a sub-menu.", menuItem.getAttribute("class").contains("dropdown-submenu")); - if(!Locator.xpath("./i").findElement(menuItem).getAttribute("class").contains("fa-chevron-up")) + Assert.assertTrue("Item in menu path '" + pathToAction.get(i) + "' does not contain a sub-menu.", menuItem.getAttribute("class").contains("dropdown-section-toggle")); + if(!Locator.byClass("fa").findElement(menuItem).getAttribute("class").contains("fa-chevron-up")) { // This is a sub-menu item, but click it only if the sub-menu is not expanded. menuItem.click(); @@ -156,11 +154,13 @@ private void expandAll() for (WebElement menuItem : menuItems) { menuItem = Locator.xpath("..").findElement(menuItem); // Up a level - Optional expando = Locator.xpath("./i").withClass("fa-chevron-down").findOptionalElement(menuItem); + Optional expando = Locator.byClass("fa-chevron-down").findOptionalElement(menuItem); if (expando.isPresent()) { expando.get().click(); - Locator.tagWithClass("ul", "well").waitForElement(menuItem, 1_000); + // Note: if we really do need to wait for the items to appear we can probably wait for elements with + // class "dropdown-section__menu-item", we'll want to track how many we already have and check that the + // number has increased, since nothing is nested, everything is siblings. } } } @@ -189,15 +189,31 @@ public List getMenuText() public List getItemsUnderHeading(String heading) { expandAll(); + boolean headingFound = false; + List items = new ArrayList<>(); + List listItems = Locator.tag("li").findElements(this); + + for (WebElement item : listItems) + { + String className = item.getAttribute("class"); + String text = item.getText().trim(); + + if (className.contains("dropdown-header") && text.equalsIgnoreCase(heading)) + headingFound = true; - WebElement submenu = Locator.byClass("dropdown-header").withText(heading) - .followingSibling("li").withClass("dropdown-submenu").findElement(this); - List menuList = Locator.tagWithAttribute("a", "role", "menuitem").findElements(submenu); - List menuText = getWrapper().getTexts(menuList); + // Once we've found our header we know that all dropdown-section__menu-item elements belong to the heading + // we are interested in + if (headingFound && className.contains("dropdown-section__menu-item")) + items.add(text); + + // Once we hit a divider we're done looking at menu items related to the heading, so we can stop iterating + if (headingFound && className.contains("divider")) + break; + } collapse(); - return menuText; + return items; } public String getButtonText()