feat(test): allow testIdAttribute to be a comma-separated list of names - #40844

Merged
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827
May 14, 2026
Merged

feat(test): allow testIdAttribute to be a comma-separated list of names#40844
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827

Conversation

@yury-s

@yury-sYury Semikhatsky (yury-s) commented May 14, 2026

Copy link
Copy Markdown
Member

Summary

  • testIdAttribute config option still typed as a single string. Multiple attribute names can be specified by joining them with a comma, e.g. 'data-pw,data-ti'page.getByTestId(...) then matches elements with any of the listed attributes.
  • Codegen / recorder considers each configured attribute when proposing getByTestId(...) candidates.
  • No protocol, client, server, or trace-format changes. Splitting on , happens in three internal consumers: the internal:testid selector engine, the codegen candidate builder, and the locator parser.
// playwright.config.tsexportdefaultdefineConfig({use: {testIdAttribute: 'data-pw,data-ti',},});

Fixes#23827

When an array is provided, `page.getByTestId(...)` matches elements
with any of the listed attributes; codegen/recorder consider each
configured attribute when generating `getByTestId(...)` locators.
Fixesmicrosoft#23827
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/isomorphic/trace/versions/traceV9.ts Outdated

@dgozmanDmitry Gozman (dgozman) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So many changes everywhere! I wonder if we should just support syntax like data-testid;data-test-id and only make a few small targeted changes.

Comment threadpackages/isomorphic/trace/entries.ts Outdated
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/playwright-core/src/client/locator.ts Outdated
Comment threadpackages/protocol/spec/playwright.yml Outdated
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Avoid bumping the trace format: serialize the array of test-id
attribute names as a comma-separated string in the trace, parse it
back when rendering. HTML attribute names cannot contain commas, so
the delimiter is unambiguous.
Encode multiple test id attribute names as a comma-separated string
rather than changing types throughout the protocol/client. Splitting
happens at three consumers (getByTestIdSelector, selectorGenerator,
locatorParser). HTML attribute names cannot contain commas, so the
delimiter is unambiguous.
Produce a single-clause internal:testid=[name=value] selector with
the attribute name quoted when it contains commas, and split inside
the engine. Removes splitting from getByTestIdSelector and the
locatorParser replacement.
Default to 'data-testid' so tests calling parseLocator without the
third argument keep working. Also extract encodeTestIdAttributeName
helper to dedupe the conditional-quote pattern.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Per review feedback, don't touch the deprecated top-level Selectors
API documentation.
@yury-sYury Semikhatsky (yury-s) changed the title feat(test): allow testIdAttribute to be an array of attribute namesfeat(test): allow testIdAttribute to be a comma-separated list of namesMay 14, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

3 failed
❌ [msedge] › mcp/annotate.spec.ts:398 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-msedge
❌ [webkit] › mcp/annotate.spec.ts:173 › user-initiated annotate downloads zip with feedback.md @mcp-macos-latest-webkit
❌ [webkit] › mcp/annotate.spec.ts:330 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit

7083 passed, 1104 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

4 flaky⚠️ [chromium-page] › page/page-request-continue.spec.ts:756 › propagate headers cross origin redirect after interception `@ubuntu-22.04-chromium-tip-of-tree`
⚠️ [chromium-library] › library/beforeunload.spec.ts:130 › should support dismissing the dialog multiple times `@chromium-ubuntu-22.04-arm-node20`
⚠️ [chromium-library] › library/video.spec.ts:719 › screencast › should work with video+trace `@chromium-ubuntu-22.04-node24`
⚠️ [chromium-library] › library/video.spec.ts:275 › screencast › should capture navigation `@chromium-ubuntu-22.04-node20`

41822 passed, 850 skipped


Merge workflow run.

@drod1107

Copy link
Copy Markdown

Just dropping by to say thanks - this feature saved my bacon today. ❤️

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Multiple values for testIdAttribute in playwright.config.ts

4 participants

@yury-s@drod1107@pavelfeldman@dgozman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(test): allow testIdAttribute to be a comma-separated list of names - #40844

Merged
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827
May 14, 2026
Merged

feat(test): allow testIdAttribute to be a comma-separated list of names#40844
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827

Conversation

@yury-s

@yury-sYury Semikhatsky (yury-s) commented May 14, 2026

Copy link
Copy Markdown
Member

Summary

  • testIdAttribute config option still typed as a single string. Multiple attribute names can be specified by joining them with a comma, e.g. 'data-pw,data-ti'page.getByTestId(...) then matches elements with any of the listed attributes.
  • Codegen / recorder considers each configured attribute when proposing getByTestId(...) candidates.
  • No protocol, client, server, or trace-format changes. Splitting on , happens in three internal consumers: the internal:testid selector engine, the codegen candidate builder, and the locator parser.
// playwright.config.tsexportdefaultdefineConfig({use: {testIdAttribute: 'data-pw,data-ti',},});

Fixes#23827

When an array is provided, `page.getByTestId(...)` matches elements
with any of the listed attributes; codegen/recorder consider each
configured attribute when generating `getByTestId(...)` locators.
Fixesmicrosoft#23827
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/isomorphic/trace/versions/traceV9.ts Outdated

@dgozmanDmitry Gozman (dgozman) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So many changes everywhere! I wonder if we should just support syntax like data-testid;data-test-id and only make a few small targeted changes.

Comment threadpackages/isomorphic/trace/entries.ts Outdated
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/playwright-core/src/client/locator.ts Outdated
Comment threadpackages/protocol/spec/playwright.yml Outdated
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Avoid bumping the trace format: serialize the array of test-id
attribute names as a comma-separated string in the trace, parse it
back when rendering. HTML attribute names cannot contain commas, so
the delimiter is unambiguous.
Encode multiple test id attribute names as a comma-separated string
rather than changing types throughout the protocol/client. Splitting
happens at three consumers (getByTestIdSelector, selectorGenerator,
locatorParser). HTML attribute names cannot contain commas, so the
delimiter is unambiguous.
Produce a single-clause internal:testid=[name=value] selector with
the attribute name quoted when it contains commas, and split inside
the engine. Removes splitting from getByTestIdSelector and the
locatorParser replacement.
Default to 'data-testid' so tests calling parseLocator without the
third argument keep working. Also extract encodeTestIdAttributeName
helper to dedupe the conditional-quote pattern.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Per review feedback, don't touch the deprecated top-level Selectors
API documentation.
@yury-sYury Semikhatsky (yury-s) changed the title feat(test): allow testIdAttribute to be an array of attribute namesfeat(test): allow testIdAttribute to be a comma-separated list of namesMay 14, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

3 failed
❌ [msedge] › mcp/annotate.spec.ts:398 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-msedge
❌ [webkit] › mcp/annotate.spec.ts:173 › user-initiated annotate downloads zip with feedback.md @mcp-macos-latest-webkit
❌ [webkit] › mcp/annotate.spec.ts:330 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit

7083 passed, 1104 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

4 flaky⚠️ [chromium-page] › page/page-request-continue.spec.ts:756 › propagate headers cross origin redirect after interception `@ubuntu-22.04-chromium-tip-of-tree`
⚠️ [chromium-library] › library/beforeunload.spec.ts:130 › should support dismissing the dialog multiple times `@chromium-ubuntu-22.04-arm-node20`
⚠️ [chromium-library] › library/video.spec.ts:719 › screencast › should work with video+trace `@chromium-ubuntu-22.04-node24`
⚠️ [chromium-library] › library/video.spec.ts:275 › screencast › should capture navigation `@chromium-ubuntu-22.04-node20`

41822 passed, 850 skipped


Merge workflow run.

@drod1107

Copy link
Copy Markdown

Just dropping by to say thanks - this feature saved my bacon today. ❤️

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Multiple values for testIdAttribute in playwright.config.ts

4 participants

@yury-s@drod1107@pavelfeldman@dgozman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(test): allow testIdAttribute to be a comma-separated list of names - #40844

Merged
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827
May 14, 2026
Merged

feat(test): allow testIdAttribute to be a comma-separated list of names#40844
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827

Conversation

@yury-s

@yury-sYury Semikhatsky (yury-s) commented May 14, 2026

Copy link
Copy Markdown
Member

Summary

  • testIdAttribute config option still typed as a single string. Multiple attribute names can be specified by joining them with a comma, e.g. 'data-pw,data-ti'page.getByTestId(...) then matches elements with any of the listed attributes.
  • Codegen / recorder considers each configured attribute when proposing getByTestId(...) candidates.
  • No protocol, client, server, or trace-format changes. Splitting on , happens in three internal consumers: the internal:testid selector engine, the codegen candidate builder, and the locator parser.
// playwright.config.tsexportdefaultdefineConfig({use: {testIdAttribute: 'data-pw,data-ti',},});

Fixes#23827

When an array is provided, `page.getByTestId(...)` matches elements
with any of the listed attributes; codegen/recorder consider each
configured attribute when generating `getByTestId(...)` locators.
Fixesmicrosoft#23827
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/isomorphic/trace/versions/traceV9.ts Outdated

@dgozmanDmitry Gozman (dgozman) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So many changes everywhere! I wonder if we should just support syntax like data-testid;data-test-id and only make a few small targeted changes.

Comment threadpackages/isomorphic/trace/entries.ts Outdated
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/playwright-core/src/client/locator.ts Outdated
Comment threadpackages/protocol/spec/playwright.yml Outdated
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Avoid bumping the trace format: serialize the array of test-id
attribute names as a comma-separated string in the trace, parse it
back when rendering. HTML attribute names cannot contain commas, so
the delimiter is unambiguous.
Encode multiple test id attribute names as a comma-separated string
rather than changing types throughout the protocol/client. Splitting
happens at three consumers (getByTestIdSelector, selectorGenerator,
locatorParser). HTML attribute names cannot contain commas, so the
delimiter is unambiguous.
Produce a single-clause internal:testid=[name=value] selector with
the attribute name quoted when it contains commas, and split inside
the engine. Removes splitting from getByTestIdSelector and the
locatorParser replacement.
Default to 'data-testid' so tests calling parseLocator without the
third argument keep working. Also extract encodeTestIdAttributeName
helper to dedupe the conditional-quote pattern.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Per review feedback, don't touch the deprecated top-level Selectors
API documentation.
@yury-sYury Semikhatsky (yury-s) changed the title feat(test): allow testIdAttribute to be an array of attribute namesfeat(test): allow testIdAttribute to be a comma-separated list of namesMay 14, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

3 failed
❌ [msedge] › mcp/annotate.spec.ts:398 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-msedge
❌ [webkit] › mcp/annotate.spec.ts:173 › user-initiated annotate downloads zip with feedback.md @mcp-macos-latest-webkit
❌ [webkit] › mcp/annotate.spec.ts:330 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit

7083 passed, 1104 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

4 flaky⚠️ [chromium-page] › page/page-request-continue.spec.ts:756 › propagate headers cross origin redirect after interception `@ubuntu-22.04-chromium-tip-of-tree`
⚠️ [chromium-library] › library/beforeunload.spec.ts:130 › should support dismissing the dialog multiple times `@chromium-ubuntu-22.04-arm-node20`
⚠️ [chromium-library] › library/video.spec.ts:719 › screencast › should work with video+trace `@chromium-ubuntu-22.04-node24`
⚠️ [chromium-library] › library/video.spec.ts:275 › screencast › should capture navigation `@chromium-ubuntu-22.04-node20`

41822 passed, 850 skipped


Merge workflow run.

@drod1107

Copy link
Copy Markdown

Just dropping by to say thanks - this feature saved my bacon today. ❤️

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Multiple values for testIdAttribute in playwright.config.ts

4 participants

@yury-s@drod1107@pavelfeldman@dgozman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(test): allow testIdAttribute to be a comma-separated list of names - #40844

Merged
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827
May 14, 2026
Merged

feat(test): allow testIdAttribute to be a comma-separated list of names#40844
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827

Conversation

@yury-s

@yury-sYury Semikhatsky (yury-s) commented May 14, 2026

Copy link
Copy Markdown
Member

Summary

  • testIdAttribute config option still typed as a single string. Multiple attribute names can be specified by joining them with a comma, e.g. 'data-pw,data-ti'page.getByTestId(...) then matches elements with any of the listed attributes.
  • Codegen / recorder considers each configured attribute when proposing getByTestId(...) candidates.
  • No protocol, client, server, or trace-format changes. Splitting on , happens in three internal consumers: the internal:testid selector engine, the codegen candidate builder, and the locator parser.
// playwright.config.tsexportdefaultdefineConfig({use: {testIdAttribute: 'data-pw,data-ti',},});

Fixes#23827

When an array is provided, `page.getByTestId(...)` matches elements
with any of the listed attributes; codegen/recorder consider each
configured attribute when generating `getByTestId(...)` locators.
Fixesmicrosoft#23827
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/isomorphic/trace/versions/traceV9.ts Outdated

@dgozmanDmitry Gozman (dgozman) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So many changes everywhere! I wonder if we should just support syntax like data-testid;data-test-id and only make a few small targeted changes.

Comment threadpackages/isomorphic/trace/entries.ts Outdated
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/playwright-core/src/client/locator.ts Outdated
Comment threadpackages/protocol/spec/playwright.yml Outdated
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Avoid bumping the trace format: serialize the array of test-id
attribute names as a comma-separated string in the trace, parse it
back when rendering. HTML attribute names cannot contain commas, so
the delimiter is unambiguous.
Encode multiple test id attribute names as a comma-separated string
rather than changing types throughout the protocol/client. Splitting
happens at three consumers (getByTestIdSelector, selectorGenerator,
locatorParser). HTML attribute names cannot contain commas, so the
delimiter is unambiguous.
Produce a single-clause internal:testid=[name=value] selector with
the attribute name quoted when it contains commas, and split inside
the engine. Removes splitting from getByTestIdSelector and the
locatorParser replacement.
Default to 'data-testid' so tests calling parseLocator without the
third argument keep working. Also extract encodeTestIdAttributeName
helper to dedupe the conditional-quote pattern.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Per review feedback, don't touch the deprecated top-level Selectors
API documentation.
@yury-sYury Semikhatsky (yury-s) changed the title feat(test): allow testIdAttribute to be an array of attribute namesfeat(test): allow testIdAttribute to be a comma-separated list of namesMay 14, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

3 failed
❌ [msedge] › mcp/annotate.spec.ts:398 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-msedge
❌ [webkit] › mcp/annotate.spec.ts:173 › user-initiated annotate downloads zip with feedback.md @mcp-macos-latest-webkit
❌ [webkit] › mcp/annotate.spec.ts:330 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit

7083 passed, 1104 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

4 flaky⚠️ [chromium-page] › page/page-request-continue.spec.ts:756 › propagate headers cross origin redirect after interception `@ubuntu-22.04-chromium-tip-of-tree`
⚠️ [chromium-library] › library/beforeunload.spec.ts:130 › should support dismissing the dialog multiple times `@chromium-ubuntu-22.04-arm-node20`
⚠️ [chromium-library] › library/video.spec.ts:719 › screencast › should work with video+trace `@chromium-ubuntu-22.04-node24`
⚠️ [chromium-library] › library/video.spec.ts:275 › screencast › should capture navigation `@chromium-ubuntu-22.04-node20`

41822 passed, 850 skipped


Merge workflow run.

@drod1107

Copy link
Copy Markdown

Just dropping by to say thanks - this feature saved my bacon today. ❤️

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Multiple values for testIdAttribute in playwright.config.ts

4 participants

@yury-s@drod1107@pavelfeldman@dgozman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(test): allow testIdAttribute to be a comma-separated list of names - #40844

Merged
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827
May 14, 2026
Merged

feat(test): allow testIdAttribute to be a comma-separated list of names#40844
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827

Conversation

@yury-s

@yury-sYury Semikhatsky (yury-s) commented May 14, 2026

Copy link
Copy Markdown
Member

Summary

  • testIdAttribute config option still typed as a single string. Multiple attribute names can be specified by joining them with a comma, e.g. 'data-pw,data-ti'page.getByTestId(...) then matches elements with any of the listed attributes.
  • Codegen / recorder considers each configured attribute when proposing getByTestId(...) candidates.
  • No protocol, client, server, or trace-format changes. Splitting on , happens in three internal consumers: the internal:testid selector engine, the codegen candidate builder, and the locator parser.
// playwright.config.tsexportdefaultdefineConfig({use: {testIdAttribute: 'data-pw,data-ti',},});

Fixes#23827

When an array is provided, `page.getByTestId(...)` matches elements
with any of the listed attributes; codegen/recorder consider each
configured attribute when generating `getByTestId(...)` locators.
Fixesmicrosoft#23827
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/isomorphic/trace/versions/traceV9.ts Outdated

@dgozmanDmitry Gozman (dgozman) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So many changes everywhere! I wonder if we should just support syntax like data-testid;data-test-id and only make a few small targeted changes.

Comment threadpackages/isomorphic/trace/entries.ts Outdated
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/playwright-core/src/client/locator.ts Outdated
Comment threadpackages/protocol/spec/playwright.yml Outdated
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Avoid bumping the trace format: serialize the array of test-id
attribute names as a comma-separated string in the trace, parse it
back when rendering. HTML attribute names cannot contain commas, so
the delimiter is unambiguous.
Encode multiple test id attribute names as a comma-separated string
rather than changing types throughout the protocol/client. Splitting
happens at three consumers (getByTestIdSelector, selectorGenerator,
locatorParser). HTML attribute names cannot contain commas, so the
delimiter is unambiguous.
Produce a single-clause internal:testid=[name=value] selector with
the attribute name quoted when it contains commas, and split inside
the engine. Removes splitting from getByTestIdSelector and the
locatorParser replacement.
Default to 'data-testid' so tests calling parseLocator without the
third argument keep working. Also extract encodeTestIdAttributeName
helper to dedupe the conditional-quote pattern.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Per review feedback, don't touch the deprecated top-level Selectors
API documentation.
@yury-sYury Semikhatsky (yury-s) changed the title feat(test): allow testIdAttribute to be an array of attribute namesfeat(test): allow testIdAttribute to be a comma-separated list of namesMay 14, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

3 failed
❌ [msedge] › mcp/annotate.spec.ts:398 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-msedge
❌ [webkit] › mcp/annotate.spec.ts:173 › user-initiated annotate downloads zip with feedback.md @mcp-macos-latest-webkit
❌ [webkit] › mcp/annotate.spec.ts:330 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit

7083 passed, 1104 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

4 flaky⚠️ [chromium-page] › page/page-request-continue.spec.ts:756 › propagate headers cross origin redirect after interception `@ubuntu-22.04-chromium-tip-of-tree`
⚠️ [chromium-library] › library/beforeunload.spec.ts:130 › should support dismissing the dialog multiple times `@chromium-ubuntu-22.04-arm-node20`
⚠️ [chromium-library] › library/video.spec.ts:719 › screencast › should work with video+trace `@chromium-ubuntu-22.04-node24`
⚠️ [chromium-library] › library/video.spec.ts:275 › screencast › should capture navigation `@chromium-ubuntu-22.04-node20`

41822 passed, 850 skipped


Merge workflow run.

@drod1107

Copy link
Copy Markdown

Just dropping by to say thanks - this feature saved my bacon today. ❤️

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Multiple values for testIdAttribute in playwright.config.ts

4 participants

@yury-s@drod1107@pavelfeldman@dgozman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(test): allow testIdAttribute to be a comma-separated list of names - #40844

Merged
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827
May 14, 2026
Merged

feat(test): allow testIdAttribute to be a comma-separated list of names#40844
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827

Conversation

@yury-s

@yury-sYury Semikhatsky (yury-s) commented May 14, 2026

Copy link
Copy Markdown
Member

Summary

  • testIdAttribute config option still typed as a single string. Multiple attribute names can be specified by joining them with a comma, e.g. 'data-pw,data-ti'page.getByTestId(...) then matches elements with any of the listed attributes.
  • Codegen / recorder considers each configured attribute when proposing getByTestId(...) candidates.
  • No protocol, client, server, or trace-format changes. Splitting on , happens in three internal consumers: the internal:testid selector engine, the codegen candidate builder, and the locator parser.
// playwright.config.tsexportdefaultdefineConfig({use: {testIdAttribute: 'data-pw,data-ti',},});

Fixes#23827

When an array is provided, `page.getByTestId(...)` matches elements
with any of the listed attributes; codegen/recorder consider each
configured attribute when generating `getByTestId(...)` locators.
Fixesmicrosoft#23827
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/isomorphic/trace/versions/traceV9.ts Outdated

@dgozmanDmitry Gozman (dgozman) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So many changes everywhere! I wonder if we should just support syntax like data-testid;data-test-id and only make a few small targeted changes.

Comment threadpackages/isomorphic/trace/entries.ts Outdated
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/playwright-core/src/client/locator.ts Outdated
Comment threadpackages/protocol/spec/playwright.yml Outdated
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Avoid bumping the trace format: serialize the array of test-id
attribute names as a comma-separated string in the trace, parse it
back when rendering. HTML attribute names cannot contain commas, so
the delimiter is unambiguous.
Encode multiple test id attribute names as a comma-separated string
rather than changing types throughout the protocol/client. Splitting
happens at three consumers (getByTestIdSelector, selectorGenerator,
locatorParser). HTML attribute names cannot contain commas, so the
delimiter is unambiguous.
Produce a single-clause internal:testid=[name=value] selector with
the attribute name quoted when it contains commas, and split inside
the engine. Removes splitting from getByTestIdSelector and the
locatorParser replacement.
Default to 'data-testid' so tests calling parseLocator without the
third argument keep working. Also extract encodeTestIdAttributeName
helper to dedupe the conditional-quote pattern.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Per review feedback, don't touch the deprecated top-level Selectors
API documentation.
@yury-sYury Semikhatsky (yury-s) changed the title feat(test): allow testIdAttribute to be an array of attribute namesfeat(test): allow testIdAttribute to be a comma-separated list of namesMay 14, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

3 failed
❌ [msedge] › mcp/annotate.spec.ts:398 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-msedge
❌ [webkit] › mcp/annotate.spec.ts:173 › user-initiated annotate downloads zip with feedback.md @mcp-macos-latest-webkit
❌ [webkit] › mcp/annotate.spec.ts:330 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit

7083 passed, 1104 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

4 flaky⚠️ [chromium-page] › page/page-request-continue.spec.ts:756 › propagate headers cross origin redirect after interception `@ubuntu-22.04-chromium-tip-of-tree`
⚠️ [chromium-library] › library/beforeunload.spec.ts:130 › should support dismissing the dialog multiple times `@chromium-ubuntu-22.04-arm-node20`
⚠️ [chromium-library] › library/video.spec.ts:719 › screencast › should work with video+trace `@chromium-ubuntu-22.04-node24`
⚠️ [chromium-library] › library/video.spec.ts:275 › screencast › should capture navigation `@chromium-ubuntu-22.04-node20`

41822 passed, 850 skipped


Merge workflow run.

@drod1107

Copy link
Copy Markdown

Just dropping by to say thanks - this feature saved my bacon today. ❤️

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Multiple values for testIdAttribute in playwright.config.ts

4 participants

@yury-s@drod1107@pavelfeldman@dgozman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(test): allow testIdAttribute to be a comma-separated list of names - #40844

Merged
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827
May 14, 2026
Merged

feat(test): allow testIdAttribute to be a comma-separated list of names#40844
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827

Conversation

@yury-s

@yury-sYury Semikhatsky (yury-s) commented May 14, 2026

Copy link
Copy Markdown
Member

Summary

  • testIdAttribute config option still typed as a single string. Multiple attribute names can be specified by joining them with a comma, e.g. 'data-pw,data-ti'page.getByTestId(...) then matches elements with any of the listed attributes.
  • Codegen / recorder considers each configured attribute when proposing getByTestId(...) candidates.
  • No protocol, client, server, or trace-format changes. Splitting on , happens in three internal consumers: the internal:testid selector engine, the codegen candidate builder, and the locator parser.
// playwright.config.tsexportdefaultdefineConfig({use: {testIdAttribute: 'data-pw,data-ti',},});

Fixes#23827

When an array is provided, `page.getByTestId(...)` matches elements
with any of the listed attributes; codegen/recorder consider each
configured attribute when generating `getByTestId(...)` locators.
Fixesmicrosoft#23827
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/isomorphic/trace/versions/traceV9.ts Outdated

@dgozmanDmitry Gozman (dgozman) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So many changes everywhere! I wonder if we should just support syntax like data-testid;data-test-id and only make a few small targeted changes.

Comment threadpackages/isomorphic/trace/entries.ts Outdated
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/playwright-core/src/client/locator.ts Outdated
Comment threadpackages/protocol/spec/playwright.yml Outdated
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Avoid bumping the trace format: serialize the array of test-id
attribute names as a comma-separated string in the trace, parse it
back when rendering. HTML attribute names cannot contain commas, so
the delimiter is unambiguous.
Encode multiple test id attribute names as a comma-separated string
rather than changing types throughout the protocol/client. Splitting
happens at three consumers (getByTestIdSelector, selectorGenerator,
locatorParser). HTML attribute names cannot contain commas, so the
delimiter is unambiguous.
Produce a single-clause internal:testid=[name=value] selector with
the attribute name quoted when it contains commas, and split inside
the engine. Removes splitting from getByTestIdSelector and the
locatorParser replacement.
Default to 'data-testid' so tests calling parseLocator without the
third argument keep working. Also extract encodeTestIdAttributeName
helper to dedupe the conditional-quote pattern.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Per review feedback, don't touch the deprecated top-level Selectors
API documentation.
@yury-sYury Semikhatsky (yury-s) changed the title feat(test): allow testIdAttribute to be an array of attribute namesfeat(test): allow testIdAttribute to be a comma-separated list of namesMay 14, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

3 failed
❌ [msedge] › mcp/annotate.spec.ts:398 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-msedge
❌ [webkit] › mcp/annotate.spec.ts:173 › user-initiated annotate downloads zip with feedback.md @mcp-macos-latest-webkit
❌ [webkit] › mcp/annotate.spec.ts:330 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit

7083 passed, 1104 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

4 flaky⚠️ [chromium-page] › page/page-request-continue.spec.ts:756 › propagate headers cross origin redirect after interception `@ubuntu-22.04-chromium-tip-of-tree`
⚠️ [chromium-library] › library/beforeunload.spec.ts:130 › should support dismissing the dialog multiple times `@chromium-ubuntu-22.04-arm-node20`
⚠️ [chromium-library] › library/video.spec.ts:719 › screencast › should work with video+trace `@chromium-ubuntu-22.04-node24`
⚠️ [chromium-library] › library/video.spec.ts:275 › screencast › should capture navigation `@chromium-ubuntu-22.04-node20`

41822 passed, 850 skipped


Merge workflow run.

@drod1107

Copy link
Copy Markdown

Just dropping by to say thanks - this feature saved my bacon today. ❤️

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Multiple values for testIdAttribute in playwright.config.ts

4 participants

@yury-s@drod1107@pavelfeldman@dgozman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(test): allow testIdAttribute to be a comma-separated list of names - #40844

Merged
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827
May 14, 2026
Merged

feat(test): allow testIdAttribute to be a comma-separated list of names#40844
Yury Semikhatsky (yury-s) merged 8 commits into
microsoft:mainfrom
yury-s:fix-23827

Conversation

@yury-s

@yury-sYury Semikhatsky (yury-s) commented May 14, 2026

Copy link
Copy Markdown
Member

Summary

  • testIdAttribute config option still typed as a single string. Multiple attribute names can be specified by joining them with a comma, e.g. 'data-pw,data-ti'page.getByTestId(...) then matches elements with any of the listed attributes.
  • Codegen / recorder considers each configured attribute when proposing getByTestId(...) candidates.
  • No protocol, client, server, or trace-format changes. Splitting on , happens in three internal consumers: the internal:testid selector engine, the codegen candidate builder, and the locator parser.
// playwright.config.tsexportdefaultdefineConfig({use: {testIdAttribute: 'data-pw,data-ti',},});

Fixes#23827

When an array is provided, `page.getByTestId(...)` matches elements
with any of the listed attributes; codegen/recorder consider each
configured attribute when generating `getByTestId(...)` locators.
Fixesmicrosoft#23827
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/isomorphic/trace/versions/traceV9.ts Outdated

@dgozmanDmitry Gozman (dgozman) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So many changes everywhere! I wonder if we should just support syntax like data-testid;data-test-id and only make a few small targeted changes.

Comment threadpackages/isomorphic/trace/entries.ts Outdated
Comment threaddocs/src/api/class-selectors.md Outdated
Comment threadpackages/playwright-core/src/client/locator.ts Outdated
Comment threadpackages/protocol/spec/playwright.yml Outdated
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Avoid bumping the trace format: serialize the array of test-id
attribute names as a comma-separated string in the trace, parse it
back when rendering. HTML attribute names cannot contain commas, so
the delimiter is unambiguous.
Encode multiple test id attribute names as a comma-separated string
rather than changing types throughout the protocol/client. Splitting
happens at three consumers (getByTestIdSelector, selectorGenerator,
locatorParser). HTML attribute names cannot contain commas, so the
delimiter is unambiguous.
Produce a single-clause internal:testid=[name=value] selector with
the attribute name quoted when it contains commas, and split inside
the engine. Removes splitting from getByTestIdSelector and the
locatorParser replacement.
Default to 'data-testid' so tests calling parseLocator without the
third argument keep working. Also extract encodeTestIdAttributeName
helper to dedupe the conditional-quote pattern.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Per review feedback, don't touch the deprecated top-level Selectors
API documentation.
@yury-sYury Semikhatsky (yury-s) changed the title feat(test): allow testIdAttribute to be an array of attribute namesfeat(test): allow testIdAttribute to be a comma-separated list of namesMay 14, 2026
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "MCP"

3 failed
❌ [msedge] › mcp/annotate.spec.ts:398 › should cancel browser_annotate when the MCP client disconnects @mcp-windows-latest-msedge
❌ [webkit] › mcp/annotate.spec.ts:173 › user-initiated annotate downloads zip with feedback.md @mcp-macos-latest-webkit
❌ [webkit] › mcp/annotate.spec.ts:330 › should annotate when context has no fixed viewport @mcp-windows-latest-webkit

7083 passed, 1104 skipped


Merge workflow run.

@github-actions

Copy link
Copy Markdown
Contributor

Test results for "tests 1"

4 flaky⚠️ [chromium-page] › page/page-request-continue.spec.ts:756 › propagate headers cross origin redirect after interception `@ubuntu-22.04-chromium-tip-of-tree`
⚠️ [chromium-library] › library/beforeunload.spec.ts:130 › should support dismissing the dialog multiple times `@chromium-ubuntu-22.04-arm-node20`
⚠️ [chromium-library] › library/video.spec.ts:719 › screencast › should work with video+trace `@chromium-ubuntu-22.04-node24`
⚠️ [chromium-library] › library/video.spec.ts:275 › screencast › should capture navigation `@chromium-ubuntu-22.04-node20`

41822 passed, 850 skipped


Merge workflow run.

@drod1107

Copy link
Copy Markdown

Just dropping by to say thanks - this feature saved my bacon today. ❤️

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Multiple values for testIdAttribute in playwright.config.ts

4 participants

@yury-s@drod1107@pavelfeldman@dgozman