From e3dc9b82fc56df6110212ca39edd45ab3589d966 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Mon, 18 May 2026 16:20:17 -0700 Subject: [PATCH 1/8] Update locators for Sign In that changed from link to button --- src/org/labkey/test/LabKeySiteWrapper.java | 2 +- src/org/labkey/test/tests/core/login/PasswordTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/labkey/test/LabKeySiteWrapper.java b/src/org/labkey/test/LabKeySiteWrapper.java index 112757f4c0..d355049501 100644 --- a/src/org/labkey/test/LabKeySiteWrapper.java +++ b/src/org/labkey/test/LabKeySiteWrapper.java @@ -391,7 +391,7 @@ public void attemptSignIn(String email, String password) try { // attempt to navigate to login page - clickAndWait(Locator.linkWithText("Sign In")); + clickAndWait(Locator.button("Sign In")); } catch (NoSuchElementException error) { diff --git a/src/org/labkey/test/tests/core/login/PasswordTest.java b/src/org/labkey/test/tests/core/login/PasswordTest.java index 94010eb349..0fab926af1 100644 --- a/src/org/labkey/test/tests/core/login/PasswordTest.java +++ b/src/org/labkey/test/tests/core/login/PasswordTest.java @@ -389,7 +389,7 @@ public String userInitiatePasswordReset(String username) { signOut(); goToHome(); - clickAndWait(Locator.linkWithText("Sign In")); + clickAndWait(Locator.button("Sign In")); clickAndWait(Locator.linkContainingText("Forgot password")); setFormElement(Locator.id("email"), username); clickButtonContainingText("Reset", 0); From ada9d14127603b3257ae8001e0f356cb709f5570 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 20 May 2026 11:48:08 -0700 Subject: [PATCH 2/8] Locator updates for label changes --- src/org/labkey/test/LabKeySiteWrapper.java | 2 +- .../components/react/BaseReactSelect.java | 15 ++++------- .../ui/entities/EntityBulkInsertDialog.java | 2 +- .../ui/entities/EntityBulkUpdateDialog.java | 25 +++++++++++++++---- .../ui/entities/ParentEntityEditPanel.java | 8 +++--- 5 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/org/labkey/test/LabKeySiteWrapper.java b/src/org/labkey/test/LabKeySiteWrapper.java index d355049501..476248e119 100644 --- a/src/org/labkey/test/LabKeySiteWrapper.java +++ b/src/org/labkey/test/LabKeySiteWrapper.java @@ -404,7 +404,7 @@ public void attemptSignIn(String email, String password) assertElementPresent(Locator.tagWithName("form", "login")); setFormElement(Locator.id("email"), email); setFormElement(Locator.id("password"), password); - WebElement signInButton = Locator.lkButton("Sign In").findElement(getDriver()); + WebElement signInButton = Locator.button("Sign In").findElement(getDriver()); doAndMaybeWaitForPageToLoad(10_000, () -> { signInButton.click(); shortWait().until(ExpectedConditions.invisibilityOfElementLocated(Locator.byClass("signing-in-msg"))); diff --git a/src/org/labkey/test/components/react/BaseReactSelect.java b/src/org/labkey/test/components/react/BaseReactSelect.java index 57b05c4a24..795a1c9351 100644 --- a/src/org/labkey/test/components/react/BaseReactSelect.java +++ b/src/org/labkey/test/components/react/BaseReactSelect.java @@ -612,21 +612,16 @@ public BaseReactSelectFinder withLabelwithSpan(String labelSpanText) + /* use this to find a reactSelect when the label text is contained within a span/span*/ + public BaseReactSelectFinder followingLabelWithSpan(String labelText) - { - _locator = Locators.containerWithDescendant(Locator.tag("label").withChild(Locator.tagWithText("span", labelText))); + _locator = Locators.containerWithDescendant(Locator.tagWithClassContaining("span", "control-label").withDescendant(Locator.tag("span").withText(spanText))); return this; } - public BaseReactSelectFinder followingSpanWithClass(String cls) { - _locator = Locators.containerWithDescendant(Locator.tagWithClass("label", cls)); + _locator = Locators.containerWithDescendant(Locator.tagWithClass("span", cls)); return this; } diff --git a/src/org/labkey/test/components/ui/entities/EntityBulkInsertDialog.java b/src/org/labkey/test/components/ui/entities/EntityBulkInsertDialog.java index efed5d58b5..9d113a035e 100644 --- a/src/org/labkey/test/components/ui/entities/EntityBulkInsertDialog.java +++ b/src/org/labkey/test/components/ui/entities/EntityBulkInsertDialog.java @@ -428,7 +428,7 @@ public WebElement formRow(CharSequence fieldIdentifier) return _rows.computeIfAbsent(fieldKey, fk -> Locator.tagWithClass("div", "row") // TODO: Shouldn't need to be case-insensitive. Parent/source lookups have weird casing - .withDescendant(Locator.tagWithAttributeIgnoreCase("label", "for", fieldKey)) + .withDescendant(Locator.tagWithAttributeIgnoreCase("span", "data-fieldkey", fieldKey)) .findElement(this)); } diff --git a/src/org/labkey/test/components/ui/entities/EntityBulkUpdateDialog.java b/src/org/labkey/test/components/ui/entities/EntityBulkUpdateDialog.java index 275eda9699..aaed210044 100644 --- a/src/org/labkey/test/components/ui/entities/EntityBulkUpdateDialog.java +++ b/src/org/labkey/test/components/ui/entities/EntityBulkUpdateDialog.java @@ -26,6 +26,7 @@ import java.io.File; import java.io.IOException; import java.time.Duration; +import java.util.ArrayList; import java.util.List; /** @@ -325,15 +326,29 @@ public String getWarningAlertText() public List getFieldNames() { - List labels = Locator.tagWithClass("label", "control-label").withAttribute("for") - .waitForElements(elementCache(), 2_000); + List controlLabels = Locator.byClass("control-label").waitForElements(elementCache(), 2_000); + List names = new ArrayList<>(); + for (WebElement label : controlLabels) + { + String attribute = label.getAttribute("for"); + if (attribute != null) + names.add(FieldKey.fromFieldKey(attribute).getFullName()); + else // Select inputs have spans in the label column to prevent orphaned labels for accessibility + { + attribute = label.getAttribute("data-fieldkey"); + if (attribute != null) + names.add(FieldKey.fromFieldKey(attribute).getFullName()); + else + throw new RuntimeException("Could not find field name for label: " + label.getText()); + } + } // Amount and Units is an example that has a "hide-label" for StoredAmount List hiddenLabels = Locator.tagWithClass("label", "hide-label").withAttribute("for") .findElements(elementCache()); - labels.addAll(hiddenLabels); + names.addAll(hiddenLabels.stream().map(a -> FieldKey.fromFieldKey(a.getDomAttribute("for")).getFullName()).toList()); - return labels.stream().map(a -> FieldKey.fromFieldKey(a.getDomAttribute("for")).getFullName()).toList(); + return names; } public EntityBulkUpdateDialog waitForFieldsToBe(List expectedFieldNames, int waitMilliseconds) @@ -425,7 +440,7 @@ public WebElement formRow(CharSequence fieldIdentifier) { String fieldKey = FieldKey.fromName(fieldIdentifier).toString(); return Locator.tagWithClass("div", "row") - .withDescendant(Locator.tagWithAttribute("label", "for", fieldKey)) + .withDescendant(Locator.tagWithAttribute("span", "data-fieldkey", fieldKey)) .waitForElement(this, WAIT_TIMEOUT); } diff --git a/src/org/labkey/test/components/ui/entities/ParentEntityEditPanel.java b/src/org/labkey/test/components/ui/entities/ParentEntityEditPanel.java index ad98ad7d58..2aee9f3fa7 100644 --- a/src/org/labkey/test/components/ui/entities/ParentEntityEditPanel.java +++ b/src/org/labkey/test/components/ui/entities/ParentEntityEditPanel.java @@ -277,7 +277,7 @@ public ReactSelect getEntityTypeByPosition(int index) public ReactSelect getDisabledEntityTypeByLabel(String typeName) { return ReactSelect.finder(getDriver()) - .followingLabelWithSpan(typeName) + .withSpanLabel(typeName) .waitFor(elementCache()); } @@ -300,7 +300,7 @@ public ReactSelect getEntityType(String entityName) */ public List getEntityTypeNames() { - List labels = Locator.tagWithClass("label", "entity-insert--type-select").findElements(elementCache()); + List labels = Locator.tagWithClass("span", "entity-insert--type-select").findElements(elementCache()); return labels.stream().map(WebElement::getText).toList(); } @@ -312,7 +312,7 @@ public List getEntityTypeNames() public List getAllEntityTypes() { return ReactSelect.finder(getDriver()) - .followingLabelWithClass("entity-insert--type-select") + .followingSpanWithClass("entity-insert--type-select") .findAll(elementCache()); } @@ -340,7 +340,7 @@ public FilteringReactSelect getParent(String typeName) public List getAllParents() { return FilteringReactSelect.finder(getDriver()) - .followingLabelWithClass("entity-insert--parent-select") + .followingSpanWithClass("entity-insert--parent-select") .findAll(elementCache()); } From 850603a4fb08b75301c333219cef3bb020e6a87d Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 20 May 2026 11:59:30 -0700 Subject: [PATCH 3/8] Update locator for Register button --- src/org/labkey/test/tests/SecurityTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/labkey/test/tests/SecurityTest.java b/src/org/labkey/test/tests/SecurityTest.java index 47f74c7528..d7e9cedcaf 100644 --- a/src/org/labkey/test/tests/SecurityTest.java +++ b/src/org/labkey/test/tests/SecurityTest.java @@ -514,7 +514,7 @@ public void loginSelfRegistrationEnabledTest() } assertTitleContains(SIGN_IN_TEXT); assertElementPresent(Locator.tagWithName("form", "login")); - clickAndWait(Locator.lkButton("Register")); + clickAndWait(Locator.button("Register")); assertTitleContains("Register"); assertElementPresent(Locator.tagWithName("form", "register")); From c2303d1f67b82620091983e04c7c309a50d3b09b Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 20 May 2026 15:05:28 -0700 Subject: [PATCH 4/8] Link in title is still an a tag --- src/org/labkey/test/LabKeySiteWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/labkey/test/LabKeySiteWrapper.java b/src/org/labkey/test/LabKeySiteWrapper.java index 476248e119..8483699931 100644 --- a/src/org/labkey/test/LabKeySiteWrapper.java +++ b/src/org/labkey/test/LabKeySiteWrapper.java @@ -391,7 +391,7 @@ public void attemptSignIn(String email, String password) try { // attempt to navigate to login page - clickAndWait(Locator.button("Sign In")); + clickAndWait(Locator.linkWithText("Sign In")); } catch (NoSuchElementException error) { From 9129f036e900386f0b2dc9a83c41b3a50d4e2fbf Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Fri, 22 May 2026 08:23:15 -0700 Subject: [PATCH 5/8] More locator updates --- .../components/react/BaseReactSelect.java | 2 +- .../ui/entities/EntityBulkDialog.java | 4 ++-- .../ui/entities/EntityBulkUpdateDialog.java | 23 ++++++++++--------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/org/labkey/test/components/react/BaseReactSelect.java b/src/org/labkey/test/components/react/BaseReactSelect.java index 795a1c9351..3f72cb9fa7 100644 --- a/src/org/labkey/test/components/react/BaseReactSelect.java +++ b/src/org/labkey/test/components/react/BaseReactSelect.java @@ -642,7 +642,7 @@ public BaseReactSelectFinder withinFormGroupSkipSelect(String labelText) { _locator = Locator.tagWithClass("div", "form-group") - .withChild(Locator.tag("label").withChild(Locator.tagWithText("span", labelText))); + .withChild(Locator.byClass("control-label").withChild(Locator.tagWithText("span", labelText))); return this; } diff --git a/src/org/labkey/test/components/ui/entities/EntityBulkDialog.java b/src/org/labkey/test/components/ui/entities/EntityBulkDialog.java index ba23e4e2d0..47ab69ad39 100644 --- a/src/org/labkey/test/components/ui/entities/EntityBulkDialog.java +++ b/src/org/labkey/test/components/ui/entities/EntityBulkDialog.java @@ -175,12 +175,12 @@ protected abstract class ElementCache extends ModalDialog.ElementCache */ public abstract WebElement formRow(CharSequence fieldIdentifier); - // For composite fields (e.g. StoredAmount + Units) that render a
label instead of