microsoft / microsoft/playwright-java

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

オープン
#1,709 コメント 2 件 リアクション 2 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

P3-collecting-feedback
主要言語
Java
スター
1.6k
フォーク
298
平均マージ
3日 2時間
マージ済み PR(30日)
14

説明

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)

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

Java Locator.FilterOptions.setHasText エントリポイントから始め、playwright.dev の見出しに対する 2 つの Pattern.compile アサーションを再現します。Java 正規表現がブラウザーの JavaScript エンジンにどのように渡されるかを追跡し、プレーンなパターンと Pattern.quote パターンの両方が同じ要素にマッチすることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java, javascript
領域
testing-qa
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。