From 4e557ed082366ed94a16fc7744c6ced1cb966424 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Mon, 12 Feb 2024 11:50:20 -0800 Subject: [PATCH 1/2] chore: custom test id per playwright instance Reference https://github.com/microsoft/playwright-java/issues/1369 --- .../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 ++++++--- .../java/com/microsoft/playwright/junit/Options.java | 3 +++ .../com/microsoft/playwright/TestSelectorsGetBy.java | 9 +++++++++ 8 files changed, 30 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 ac9ace1f0..710ab2b2c 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 @@ class Root extends ChannelOwner { 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 @@ private WaitableResult internalSendMessage(String guid, String meth } 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 1d14d676a..c93089ede 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 Locator getByRole(AriaRole role, GetByRoleOptions options) { @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 c28f8e136..d0e52908c 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 @@ public Locator getByRole(AriaRole role, GetByRoleOptions options) { @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 26b3ecd8e..12d630971 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 @@ public Locator getByRole(AriaRole role, GetByRoleOptions options) { @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 3129ba380..6a311b715 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.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 @@ private static String getByAttributeTextSelector(String attrName, Object value, 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 03911703b..0c012a9b1 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.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 void register(String name, Path path, RegisterOptions options) { @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/main/java/com/microsoft/playwright/junit/Options.java b/playwright/src/main/java/com/microsoft/playwright/junit/Options.java index 23db68533..9711b12b0 100644 --- a/playwright/src/main/java/com/microsoft/playwright/junit/Options.java +++ b/playwright/src/main/java/com/microsoft/playwright/junit/Options.java @@ -11,6 +11,9 @@ public class Options { public Boolean headless; public String browserName; public String deviceName; + + // Custom attribute to be used in page.getByTestId(). data-testid is used by default. + public String testIdAttribute; public BrowserType.LaunchOptions launchOptions; public Browser.NewContextOptions contextOptions; public APIRequest.NewContextOptions apiRequestOptions; diff --git a/playwright/src/test/java/com/microsoft/playwright/TestSelectorsGetBy.java b/playwright/src/test/java/com/microsoft/playwright/TestSelectorsGetBy.java index fb6a8245a..2d1ea0580 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 @@ void getByTestIdShouldWork() { 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
"); From 7c656eae1c87ca67c7802787ab97566ce0cd25ae Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Mon, 12 Feb 2024 12:54:56 -0800 Subject: [PATCH 2/2] Revert playwright/src/main/java/com/microsoft/playwright/junit/Options.java --- .../src/main/java/com/microsoft/playwright/junit/Options.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/Options.java b/playwright/src/main/java/com/microsoft/playwright/junit/Options.java index 9711b12b0..23db68533 100644 --- a/playwright/src/main/java/com/microsoft/playwright/junit/Options.java +++ b/playwright/src/main/java/com/microsoft/playwright/junit/Options.java @@ -11,9 +11,6 @@ public class Options { public Boolean headless; public String browserName; public String deviceName; - - // Custom attribute to be used in page.getByTestId(). data-testid is used by default. - public String testIdAttribute; public BrowserType.LaunchOptions launchOptions; public Browser.NewContextOptions contextOptions; public APIRequest.NewContextOptions apiRequestOptions;