Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: Playwright does not recognize Pattern quotation escape sequence (\Q ... \E) #1709

Open
jhyot opened this issue Nov 28, 2024 · 1 comment

Comments

@jhyot
Copy link

jhyot commented Nov 28, 2024

Version

1.47.0

Steps to reproduce

Using Playwright Java, navigate to https://playwright.dev

Run the following assertions:

working:

assertThat(page.getByRole(AriaRole.HEADING)
  .filter(new Locator.FilterOptions().setHasText(Pattern.compile("Playwright")))
).isVisible();

not working:

assertThat(page.getByRole(AriaRole.HEADING)
  .filter(new Locator.FilterOptions().setHasText(Pattern.compile(Pattern.quote("Playwright"))))
).isVisible();

Expected behavior

Both patterns should work, as they match exactly the same strings.

Actual behavior

The second pattern fails to find the DOM element.

Additional context

Java has the Regex special escapes \Q and \E, which means all characters are quoted as is betwen those two escape sequences. This is exactly what Pattern.quote does.

In other words, these are equivalent (as you can see if you print the result of Pattern.quote):
Pattern.compile("\\Qsometext\\E")
Pattern.compile(Pattern.quote("sometext"))

This is documented here (search for "Quotation"): https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

This is speculation, but why it might fail is if the regex is just transferred to the Javascript engine and executed there. Javascript does not seem to have the \Q and \E special escapes, which leads to the meaning of the passed regex to change.

You can also check here, switch between Java and ECMAScript engines; it works for Java but not for Javascript: https://regex101.com/r/lJ1XNH/1

Environment

macOS Sequoia, arm64
Java 17
Chromium browser (others not tested)

@yury-s
Copy link
Member

yury-s commented Dec 27, 2024

This is speculation, but why it might fail is if the regex is just transferred to the Javascript engine and executed there. Javascript does not seem to have the \Q and \E special escapes, which leads to the meaning of the passed regex to change.

Yes, this is correct, Playwright shares the implementation between all language ports and it is JavaScript regex syntax that we support.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants