From 23aa10690eae13219e96672d77ffd963840cfcf7 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Mon, 12 Feb 2024 14:28:14 -0800 Subject: [PATCH] chore: custom test id per playwright instance (#1489) --- .../java/com/microsoft/playwright/impl/Connection.java | 6 ++++-- .../java/com/microsoft/playwright/impl/FrameImpl.java | 4 ++-- .../com/microsoft/playwright/impl/FrameLocatorImpl.java | 4 ++-- .../java/com/microsoft/playwright/impl/LocatorImpl.java | 4 ++-- .../java/com/microsoft/playwright/impl/LocatorUtils.java | 9 ++------- .../com/microsoft/playwright/impl/SharedSelectors.java | 9 ++++++--- .../com/microsoft/playwright/TestSelectorsGetBy.java | 9 +++++++++ 7 files changed, 27 insertions(+), 18 deletions(-) diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java b/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java index ac9ace1f..710ab2b2 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java @@ -71,6 +71,7 @@ public class Connection { isLogging = (debug != null) && debug.contains("pw:channel"); } LocalUtils localUtils; + PlaywrightImpl playwright; final Map env; private int tracingCount; @@ -79,7 +80,7 @@ public class Connection { super(connection, "Root", ""); } - Playwright initialize() { + PlaywrightImpl initialize() { JsonObject params = new JsonObject(); params.addProperty("sdkLanguage", "java"); JsonElement result = sendMessage("initialize", params.getAsJsonObject()); @@ -177,7 +178,8 @@ public class Connection { } public PlaywrightImpl initializePlaywright() { - return (PlaywrightImpl) this.root.initialize(); + playwright = root.initialize(); + return playwright; } LocalUtils localUtils() { diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java index 1d14d676..c93089ed 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/FrameImpl.java @@ -407,12 +407,12 @@ public class FrameImpl extends ChannelOwner implements Frame { @Override public Locator getByTestId(String testId) { - return locator(getByTestIdSelector(testId)); + return locator(getByTestIdSelector(testId, connection.playwright)); } @Override public Locator getByTestId(Pattern testId) { - return locator(getByTestIdSelector(testId)); + return locator(getByTestIdSelector(testId, connection.playwright)); } @Override diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/FrameLocatorImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/FrameLocatorImpl.java index c28f8e13..d0e52908 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/FrameLocatorImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/FrameLocatorImpl.java @@ -82,12 +82,12 @@ class FrameLocatorImpl implements FrameLocator { @Override public Locator getByTestId(String testId) { - return locator(getByTestIdSelector(testId)); + return locator(getByTestIdSelector(testId, frame.connection.playwright)); } @Override public Locator getByTestId(Pattern testId) { - return locator(getByTestIdSelector(testId)); + return locator(getByTestIdSelector(testId, frame.connection.playwright)); } @Override diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/LocatorImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/LocatorImpl.java index 26b3ecd8..12d63097 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/LocatorImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/LocatorImpl.java @@ -278,12 +278,12 @@ class LocatorImpl implements Locator { @Override public Locator getByTestId(String testId) { - return locator(getByTestIdSelector(testId)); + return locator(getByTestIdSelector(testId, frame.connection.playwright)); } @Override public Locator getByTestId(Pattern testId) { - return locator(getByTestIdSelector(testId)); + return locator(getByTestIdSelector(testId, frame.connection.playwright)); } @Override diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/LocatorUtils.java b/playwright/src/main/java/com/microsoft/playwright/impl/LocatorUtils.java index 3129ba38..6a311b71 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/LocatorUtils.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/LocatorUtils.java @@ -9,12 +9,6 @@ import static com.microsoft.playwright.impl.Serialization.gson; import static com.microsoft.playwright.impl.Utils.toJsRegexFlags; public class LocatorUtils { - private static volatile String testIdAttributeName = "data-testid";; - - static void setTestIdAttributeName(String name) { - testIdAttributeName = name; - } - static String getByTextSelector(Object text, Locator.GetByTextOptions options) { boolean exact = options != null && options.exact != null && options.exact; return "internal:text=" + escapeForTextSelector(text, exact); @@ -29,7 +23,8 @@ public class LocatorUtils { return "internal:attr=[" + attrName + "=" + escapeForAttributeSelector(value, exact) + "]"; } - static String getByTestIdSelector(Object testId) { + static String getByTestIdSelector(Object testId, PlaywrightImpl playwright) { + String testIdAttributeName = ((SharedSelectors) playwright.selectors()).testIdAttributeName; return getByAttributeTextSelector(testIdAttributeName, testId, true); } diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/SharedSelectors.java b/playwright/src/main/java/com/microsoft/playwright/impl/SharedSelectors.java index 03911703..0c012a9b 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/SharedSelectors.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/SharedSelectors.java @@ -25,13 +25,14 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import static com.microsoft.playwright.impl.LocatorUtils.setTestIdAttributeName; import static java.nio.charset.StandardCharsets.UTF_8; public class SharedSelectors extends LoggingSupport implements Selectors { private final List channels = new ArrayList<>(); private final List registrations = new ArrayList<>(); + String testIdAttributeName = "data-testid"; + private static class Registration { final String name; final String script; @@ -64,8 +65,10 @@ public class SharedSelectors extends LoggingSupport implements Selectors { @Override public void setTestIdAttribute(String attributeName) { - // TODO: set it per playwright insttance - setTestIdAttributeName(attributeName); + if (attributeName == null) { + throw new PlaywrightException("Test id attribute cannot be null"); + } + testIdAttributeName = attributeName; } void addChannel(SelectorsImpl channel) { diff --git a/playwright/src/test/java/com/microsoft/playwright/TestSelectorsGetBy.java b/playwright/src/test/java/com/microsoft/playwright/TestSelectorsGetBy.java index fb6a8245..2d1ea058 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestSelectorsGetBy.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestSelectorsGetBy.java @@ -20,6 +20,15 @@ public class TestSelectorsGetBy extends TestBase { assertThat(page.locator("div").getByTestId("Hello")).hasText("Hello world"); } + @Test + void getByTestIdWithCustomTestIdShouldWork() { + page.setContent("
Hello world
"); + playwright.selectors().setTestIdAttribute("data-my-custom-testid"); + assertThat(page.getByTestId("Hello")).hasText("Hello world"); + assertThat(page.mainFrame().getByTestId("Hello")).hasText("Hello world"); + assertThat(page.locator("div").getByTestId("Hello")).hasText("Hello world"); + } + @Test void getByTestIdShouldEscapeId() { page.setContent("
Hello world
");