From d998145d1faf2b0c606faffba2c378b45a956719 Mon Sep 17 00:00:00 2001 From: alanv Date: Wed, 29 Oct 2025 17:32:45 -0500 Subject: [PATCH 1/2] QueryChartPanel: Add getCurveStatsGrid ResponsiveGrid: Add inParentWithClass --- src/org/labkey/test/components/react/QueryChartPanel.java | 8 ++++++++ .../labkey/test/components/ui/grids/ResponsiveGrid.java | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/org/labkey/test/components/react/QueryChartPanel.java b/src/org/labkey/test/components/react/QueryChartPanel.java index 9ba0135e58..3a259416e3 100644 --- a/src/org/labkey/test/components/react/QueryChartPanel.java +++ b/src/org/labkey/test/components/react/QueryChartPanel.java @@ -5,6 +5,7 @@ import org.labkey.test.components.WebDriverComponent; import org.labkey.test.components.html.BootstrapMenu; import org.labkey.test.components.ui.grids.QueryGrid; +import org.labkey.test.components.ui.grids.ResponsiveGrid; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; @@ -55,6 +56,13 @@ public WebElement getSvgChart() return Locator.byClass("svg-chart__chart").childTag("svg").waitForElement(this, WAIT_FOR_JAVASCRIPT); } + public ResponsiveGrid getCurveStatsGrid() + { + return new ResponsiveGrid.ResponsiveGridFinder(getDriver()) + .inParentWithClass("curve-fit-statistics") + .waitFor(this); + } + public QueryGrid clickClose() { var btn = elementCache().closeButton; diff --git a/src/org/labkey/test/components/ui/grids/ResponsiveGrid.java b/src/org/labkey/test/components/ui/grids/ResponsiveGrid.java index e8bfad7634..199f30c04e 100644 --- a/src/org/labkey/test/components/ui/grids/ResponsiveGrid.java +++ b/src/org/labkey/test/components/ui/grids/ResponsiveGrid.java @@ -995,6 +995,12 @@ public ResponsiveGridFinder inParentWithId(String id) return this; } + public ResponsiveGridFinder inParentWithClass(String className) + { + _locator = Locator.byClass(className).child(Locators.responsiveGrid()); + return this; + } + public ResponsiveGridFinder withGridId(String id) { _locator = Locators.responsiveGrid(id); From e049c9280a7b81a74829df6aea7bc20a7aa67c0a Mon Sep 17 00:00:00 2001 From: alanv Date: Thu, 30 Oct 2025 18:09:04 -0500 Subject: [PATCH 2/2] QueryChartPanel: add isCurveStatsPanelPresent, exportCurveStats --- .../components/react/QueryChartPanel.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/org/labkey/test/components/react/QueryChartPanel.java b/src/org/labkey/test/components/react/QueryChartPanel.java index 3a259416e3..4aa22782cf 100644 --- a/src/org/labkey/test/components/react/QueryChartPanel.java +++ b/src/org/labkey/test/components/react/QueryChartPanel.java @@ -3,7 +3,6 @@ import org.labkey.test.Locator; import org.labkey.test.components.Component; import org.labkey.test.components.WebDriverComponent; -import org.labkey.test.components.html.BootstrapMenu; import org.labkey.test.components.ui.grids.QueryGrid; import org.labkey.test.components.ui.grids.ResponsiveGrid; import org.openqa.selenium.WebDriver; @@ -39,11 +38,7 @@ public QueryChartDialog clickEdit() public File clickExport(String subMenuText) { - elementCache().exportMenu.expand(); - return getWrapper().doAndWaitForDownload(() -> - Locator.tagWithClass("li", "lk-menu-item") - .descendant(Locator.tagContainingText("a", subMenuText)) - .findElement(elementCache().headingEl).click()); + return getWrapper().doAndWaitForDownload(() -> elementCache().exportMenu.doMenuAction(subMenuText)); } public String getTitle() @@ -58,18 +53,25 @@ public WebElement getSvgChart() public ResponsiveGrid getCurveStatsGrid() { - return new ResponsiveGrid.ResponsiveGridFinder(getDriver()) - .inParentWithClass("curve-fit-statistics") - .waitFor(this); + return new ResponsiveGrid.ResponsiveGridFinder(getDriver()).waitFor(elementCache().curveStatsPanel); } - public QueryGrid clickClose() + public boolean isCurveStatsPanelPresent() + { + return ElementCache.curveStatsPanelLoc.findOptionalElement(this).isPresent(); + } + + public File exportCurveStats(String type) + { + return getWrapper().doAndWaitForDownload(() -> elementCache().exportStatsMenu.doMenuAction(type)); + } + + public void clickClose() { var btn = elementCache().closeButton; getWrapper().shortWait().until(ExpectedConditions.elementToBeClickable(btn)); btn.click(); getWrapper().shortWait().until(ExpectedConditions.stalenessOf(btn)); - return _queryGrid; } @Override @@ -96,11 +98,17 @@ protected class ElementCache extends Component.ElementCache .findWhenNeeded(this).withTimeout(2000); public final WebElement editButton = Locator.tagWithAttribute("button", "title", "Edit chart") .findWhenNeeded(headingEl); - public final BootstrapMenu exportMenu = new MultiMenu.MultiMenuFinder(getDriver()).withButtonClass("chart-panel-export-btn").findWhenNeeded(headingEl); + public final MultiMenu exportMenu = new MultiMenu.MultiMenuFinder(getDriver()) + .withButtonClass("chart-panel-export-btn") + .findWhenNeeded(headingEl); public final WebElement closeButton = Locator.tagWithAttribute("button", "title", "Hide chart") .findWhenNeeded(headingEl); public final WebElement titleElement= Locator.tagWithClass("div", "chart-panel__heading-title") .findWhenNeeded(headingEl); + public static final Locator curveStatsPanelLoc = Locator.byClass("curve-fit-statistics"); + public final WebElement curveStatsPanel = curveStatsPanelLoc.findWhenNeeded(this).withTimeout(WAIT_FOR_JAVASCRIPT); + public final WebElement curveStatsHeader = Locator.byClass("curve-fit-statistics__header").findWhenNeeded(curveStatsPanel); + public final MultiMenu exportStatsMenu = new MultiMenu.MultiMenuFinder(getDriver()).findWhenNeeded(curveStatsHeader); }