From 504047406c762ce63cae7c7f1e642455a57af775 Mon Sep 17 00:00:00 2001 From: labkey-tchad Date: Mon, 11 Aug 2025 11:28:15 -0700 Subject: [PATCH 1/3] Fix WebDriverWrapper.isTextPresent usages --- src/org/labkey/test/WebDriverWrapper.java | 21 +++++++++---------- .../announcements/ModeratorReviewTest.java | 2 +- src/org/labkey/test/util/EscapeUtil.java | 1 + src/org/labkey/test/util/TextSearcher.java | 6 ++++-- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/org/labkey/test/WebDriverWrapper.java b/src/org/labkey/test/WebDriverWrapper.java index fe0077f074..4849a16be2 100644 --- a/src/org/labkey/test/WebDriverWrapper.java +++ b/src/org/labkey/test/WebDriverWrapper.java @@ -61,6 +61,7 @@ import org.labkey.test.util.RelativeUrl; import org.labkey.test.util.TestLogger; import org.labkey.test.util.TextSearcher; +import org.labkey.test.util.TextSearcher.TextTransformers; import org.labkey.test.util.Timer; import org.labkey.test.util.selenium.ScrollUtils; import org.labkey.test.util.selenium.WebDriverUtils; @@ -1614,15 +1615,7 @@ public void assertLabKeyErrorPresent() fail("No errors found"); } - public static String encodeText(String unencodedText) - { - return unencodedText - .replace("&", "&") - .replace("<", "<") - .replace(">", ">"); - } - - public boolean isTextPresent(String... texts) + public boolean isHtmlPresent(String... texts) { final MutableBoolean present = new MutableBoolean(true); @@ -1634,11 +1627,17 @@ public boolean isTextPresent(String... texts) return present.get(); }; TextSearcher searcher = new TextSearcher(this); + searcher.setSearchTransformer(TextTransformers.IDENTITY); searcher.searchForTexts(handler, Arrays.asList(texts)); return present.get(); } + public boolean isTextPresent(String... texts) + { + return isHtmlPresent(Arrays.stream(texts).map(TextTransformers.ENCODE_HTML).toArray(String[]::new)); + } + public List getTextOrder(TextSearcher searcher, String... texts) { final List> foundTexts = new ArrayList<>(); @@ -1709,7 +1708,7 @@ public void assertTextPresentCaseInsensitive(String... texts) { TextSearcher searcher = new TextSearcher(this); - searcher.setSearchTransformer((text) -> encodeText(text).toLowerCase()); + searcher.setSearchTransformer(TextTransformers.ENCODE_HTML.andThen(String::toLowerCase)); searcher.setSourceTransformer(String::toLowerCase); @@ -1892,7 +1891,7 @@ public static void assertTextNotPresent(TextSearcher searcher, String... texts) public void assertTextNotPresent(String... texts) { TextSearcher searcher = new TextSearcher(this); - searcher.setSearchTransformer((text) -> encodeText(text).replace(" ", " ")); + searcher.setSearchTransformer(TextTransformers.ENCODE_HTML.andThen(t -> t.replace(" ", " "))); assertTextNotPresent(searcher, texts); } diff --git a/src/org/labkey/test/tests/announcements/ModeratorReviewTest.java b/src/org/labkey/test/tests/announcements/ModeratorReviewTest.java index d79161b04e..70fdb06842 100644 --- a/src/org/labkey/test/tests/announcements/ModeratorReviewTest.java +++ b/src/org/labkey/test/tests/announcements/ModeratorReviewTest.java @@ -163,7 +163,7 @@ private String addResponse(String user, String title, boolean expectAutoApproved // commonmark-java auto-linking turns all email addresses into mailto: links String formattedResponse = replaceEmailAddressesWithMailToLinks(response); - boolean responseAdded = isTextPresent(formattedResponse); + boolean responseAdded = isHtmlPresent(formattedResponse); if (expectAutoApproved && !responseAdded) { checker().fatal().error(String.format("Expected response '%s' was not present on the thread page.", formattedResponse)); diff --git a/src/org/labkey/test/util/EscapeUtil.java b/src/org/labkey/test/util/EscapeUtil.java index 8e7241219e..ff1a098c6c 100644 --- a/src/org/labkey/test/util/EscapeUtil.java +++ b/src/org/labkey/test/util/EscapeUtil.java @@ -150,4 +150,5 @@ public static String escapeForNameExpression(String name) { return nameExpressionNeedsEscaping.matcher(name).replaceAll("\\\\$1"); } + } diff --git a/src/org/labkey/test/util/TextSearcher.java b/src/org/labkey/test/util/TextSearcher.java index 3ed4a79f06..e0c8d26611 100644 --- a/src/org/labkey/test/util/TextSearcher.java +++ b/src/org/labkey/test/util/TextSearcher.java @@ -15,7 +15,6 @@ */ package org.labkey.test.util; -import org.labkey.test.BaseWebDriverTest; import org.labkey.test.TestFileUtils; import org.labkey.test.WebDriverWrapper; @@ -129,7 +128,10 @@ public interface TextHandler public static abstract class TextTransformers { - public static final Function ENCODE_HTML = BaseWebDriverTest::encodeText; + public static final Function ENCODE_HTML = t -> t + .replace("&", "&") + .replace("<", "<") + .replace(">", ">"); public static final Function IDENTITY = text -> text; //Inserts spaces between camel-cased words From 3e91be07685172f65652f9db7bec030a37a6c5fd Mon Sep 17 00:00:00 2001 From: labkey-tchad Date: Mon, 11 Aug 2025 12:16:29 -0700 Subject: [PATCH 2/3] move basic text checks to TextSearcher --- src/org/labkey/test/LabKeySiteWrapper.java | 2 +- src/org/labkey/test/WebDriverWrapper.java | 47 +++++++--------------- src/org/labkey/test/util/TextSearcher.java | 47 ++++++++++++++++++++++ 3 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src/org/labkey/test/LabKeySiteWrapper.java b/src/org/labkey/test/LabKeySiteWrapper.java index 03f757301c..de4a1135f7 100644 --- a/src/org/labkey/test/LabKeySiteWrapper.java +++ b/src/org/labkey/test/LabKeySiteWrapper.java @@ -431,7 +431,7 @@ public void signInShouldFail(String email, String password, String... expectedMe errorText = getText(Locator.tagWithClass("div", "auth-form-body").childTag("p")); } - List missingErrors = getMissingTexts(new TextSearcher(errorText), expectedMessages); + List missingErrors = new TextSearcher(errorText).getMissingTexts(expectedMessages); assertTrue(String.format("Wrong errors.\nExpected: ['%s']\nActual: '%s'", String.join("',\n'", expectedMessages), errorText), missingErrors.isEmpty()); } diff --git a/src/org/labkey/test/WebDriverWrapper.java b/src/org/labkey/test/WebDriverWrapper.java index 4849a16be2..3d236fb8b3 100644 --- a/src/org/labkey/test/WebDriverWrapper.java +++ b/src/org/labkey/test/WebDriverWrapper.java @@ -18,7 +18,6 @@ import org.apache.commons.collections4.MultiValuedMap; import org.apache.commons.collections4.multimap.HashSetValuedHashMap; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.mutable.MutableBoolean; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -1615,27 +1614,27 @@ public void assertLabKeyErrorPresent() fail("No errors found"); } - public boolean isHtmlPresent(String... texts) + /** + * Check whether the HTML-encoded text is in the page source + * @param htmlFragments encoded html fragments to search for + * @return true if all the specified texts are present on the page + */ + public boolean isHtmlPresent(String... htmlFragments) { - final MutableBoolean present = new MutableBoolean(true); - - TextSearcher.TextHandler handler = (htmlSource, text) -> { - // Not found... stop enumerating and return false - if (htmlSource == null || !htmlSource.contains(text)) - present.setFalse(); - - return present.get(); - }; TextSearcher searcher = new TextSearcher(this); searcher.setSearchTransformer(TextTransformers.IDENTITY); - searcher.searchForTexts(handler, Arrays.asList(texts)); - return present.get(); + return searcher.areAllTextsPresent(htmlFragments); } + /** + * Check whether all the specified text is present on the page + * @param texts un-encoded text to search for + * @return true if all the specified texts are present on the page + */ public boolean isTextPresent(String... texts) { - return isHtmlPresent(Arrays.stream(texts).map(TextTransformers.ENCODE_HTML).toArray(String[]::new)); + return new TextSearcher(this).areAllTextsPresent(texts); } public List getTextOrder(TextSearcher searcher, String... texts) @@ -1658,11 +1657,6 @@ public List getTextOrder(TextSearcher searcher, String... texts) return orderedTexts; } - public List getMissingTexts(TextSearcher searcher, String... texts) - { - return searcher.getMissingTexts(Arrays.asList(texts)); - } - public String getText(Locator elementLocator) { WebElement el = elementLocator.findElement(getDriver()); @@ -1691,7 +1685,7 @@ public void assertTextPresent(String... texts) public void assertTextPresent(TextSearcher searcher, String... texts) { - List missingTexts = getMissingTexts(searcher, texts); + List missingTexts = searcher.getMissingTexts(texts); if (!missingTexts.isEmpty()) { @@ -1720,18 +1714,7 @@ public void assertTextPresentCaseInsensitive(String... texts) */ public boolean isAnyTextPresent(String... texts) { - final MutableBoolean found = new MutableBoolean(false); - - TextSearcher.TextHandler handler = (htmlSource, text) -> { - if (htmlSource.contains(text)) - found.setTrue(); - - return !found.get(); // stop searching if any value is found - }; - TextSearcher searcher = new TextSearcher(this); - searcher.searchForTexts(handler, Arrays.asList(texts)); - - return found.get(); + return new TextSearcher(this).isAnyTextPresent(texts); } /** diff --git a/src/org/labkey/test/util/TextSearcher.java b/src/org/labkey/test/util/TextSearcher.java index e0c8d26611..a36368ba1b 100644 --- a/src/org/labkey/test/util/TextSearcher.java +++ b/src/org/labkey/test/util/TextSearcher.java @@ -15,11 +15,13 @@ */ package org.labkey.test.util; +import org.apache.commons.lang3.mutable.MutableBoolean; import org.labkey.test.TestFileUtils; import org.labkey.test.WebDriverWrapper; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.function.Function; @@ -97,6 +99,11 @@ public final void searchForTexts(TextHandler textHandler, List texts) } } + public List getMissingTexts(String... texts) + { + return getMissingTexts(Arrays.asList(texts)); + } + public List getMissingTexts(List texts) { final List missingTexts = new ArrayList<>(); @@ -112,6 +119,46 @@ public List getMissingTexts(List texts) return missingTexts; } + /** + * Checks whether any of the texts are present + * @return true if any of the specified text is found + */ + public boolean isAnyTextPresent(String... texts) + { + final MutableBoolean found = new MutableBoolean(false); + + TextSearcher.TextHandler handler = (htmlSource, text) -> { + if (htmlSource.contains(text)) + found.setTrue(); + + return !found.get(); // stop searching if any value is found + }; + searchForTexts(handler, Arrays.asList(texts)); + + return found.get(); + } + + /** + * Checks whether all the specified texts are present + * @return true if all the specified texts are present on the page + */ + public boolean areAllTextsPresent(String... texts) + { + final MutableBoolean present = new MutableBoolean(true); + + TextSearcher.TextHandler handler = (htmlSource, text) -> { + // Not found... stop enumerating and return false + if (htmlSource == null || !htmlSource.contains(text)) + present.setFalse(); + + return present.get(); + }; + + searchForTexts(handler, Arrays.asList(texts)); + + return present.get(); + } + /** * @return source text from the last search attempt */ From 74950f9582e1307a3f41ac24c25d591e767ee7fc Mon Sep 17 00:00:00 2001 From: labkey-tchad Date: Mon, 11 Aug 2025 12:23:10 -0700 Subject: [PATCH 3/3] Reorder methods --- src/org/labkey/test/WebDriverWrapper.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/org/labkey/test/WebDriverWrapper.java b/src/org/labkey/test/WebDriverWrapper.java index 3d236fb8b3..6024c761ba 100644 --- a/src/org/labkey/test/WebDriverWrapper.java +++ b/src/org/labkey/test/WebDriverWrapper.java @@ -1614,6 +1614,16 @@ public void assertLabKeyErrorPresent() fail("No errors found"); } + /** + * Check whether all the specified text is present on the page + * @param texts un-encoded text to search for + * @return true if all the specified texts are present on the page + */ + public boolean isTextPresent(String... texts) + { + return new TextSearcher(this).areAllTextsPresent(texts); + } + /** * Check whether the HTML-encoded text is in the page source * @param htmlFragments encoded html fragments to search for @@ -1627,16 +1637,6 @@ public boolean isHtmlPresent(String... htmlFragments) return searcher.areAllTextsPresent(htmlFragments); } - /** - * Check whether all the specified text is present on the page - * @param texts un-encoded text to search for - * @return true if all the specified texts are present on the page - */ - public boolean isTextPresent(String... texts) - { - return new TextSearcher(this).areAllTextsPresent(texts); - } - public List getTextOrder(TextSearcher searcher, String... texts) { final List> foundTexts = new ArrayList<>();