Skip to content

Upgrade to Playwright 1.61.1 - #1

Closed
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1
Closed

Upgrade to Playwright 1.61.1#1
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1

Conversation

@kruppel

@kruppelkruppel commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

Upgrade playwright-ruby to Playwright 1.61.1.

Key Changes

  • Frame#expect error handling: Refactored to handle Playwright 1.61+ behavior

    • The expect command now resolves on successful match and rejects with FrameExpectErrorDetails on mismatch/timeout
    • Changed from parsing result['received'] to catching ::Playwright::Error exceptions
    • Returns { 'matches' => !is_not } on success, extracts error details on failure
    • Properly handles both isNot flag and error details from server
  • Error class enhancements: Added support for expect-specific error details

    • Added raw_log and details attributes to Error class
    • Updated lib/playwright/connection.rb to parse and attach errorDetails from server messages
  • API coverage documentation: Updated to reflect deprecated/unimplemented features

    • Marked local_storage, session_storage, and credentials as unimplemented
    • Updated development/api.json with Playwright 1.61.1 schema changes
    • Added artifactsDir parameter to BrowserType#connect_over_cdp

@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch 3 times, most recently from 3f5d099 to 8862204CompareJune 26, 2026 02:13
end

def connect_over_cdp(endpointURL, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)
def connect_over_cdp(endpointURL, artifactsDir: nil, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

attr_reader :name, :message, :stack
attr_reader :name, :message, :stack, :raw_log
# Error details for `expect` failures (received value, timedOut, customErrorMessage).
attr_accessor :details

@kruppelkruppelJun 26, 2026

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

The change isn't captured in the release notes, but came from upstream PR #40801 "chore: throw on Frame.expect / Page.expectScreenshot failure".

Here's the difference in the expect protocol across the two versions:

Playwright 1.60.0 — the command returns the result:

exporttypeFrameExpectResult={matches: boolean,received?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,errorMessage?: string,log?: string[],};// (no FrameExpectErrorDetails type exists)

Playwright 1.61.1 — the result is gone; failure info moved to a reject-path type:

exporttypeFrameExpectResult=void;// ← resolves with NOTHING on a matchexporttypeFrameExpectErrorDetails={// ← NEW; sent on the error/reject pathreceived?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,customErrorMessage?: string,};

In 1.60, the Ruby client read result['matches'] / ['received'] / ['log'] off the return value. In 1.61, since the command returns void, assertions break as the expect call comes back as {"id":7} (no result), and raises undefined method 'key?' for nil at frame.rb:738.

To resolve the failing test:

  • details carries the new FrameExpectErrorDetails (received / timedOut / customErrorMessage), which now only exists on the error path.
  • raw_log replaces the old FrameExpectResult.log field (the call-log array), which likewise moved off the result and onto the error's wire log.

Ports Frame#expect to the 1.61 expect protocol: the command now resolves
on a successful match and rejects with FrameExpectErrorDetails on
mismatch/timeout (upstream microsoft/playwright#40801). Carry
errorDetails on Playwright::Error and translate it back into the
assertion result hash.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from 8862204 to cfc42abCompareJune 26, 2026 02:40
Adds the 1.61 WebStorage API: page.local_storage / page.session_storage
expose the current origin's localStorage / sessionStorage via items,
get_item, set_item, remove_item and clear, backed by the page channel's
webStorage* commands.
Registers WebStorage with the API generator and ports the upstream
page-localstorage spec.
Adds the 1.61 WebAuthn API: browser_context.credentials exposes a virtual
authenticator scoped to the context, with install, create, get and delete
backed by the context channel's credentials* commands. Lets tests seed
passkeys and answer navigator.credentials ceremonies without real hardware.
Registers Credentials with the API generator, maps the class doc examples,
and ports the upstream browsercontext-webauthn spec.
Exposes the 1.61 APIResponse fields: security_details returns the TLS
certificate details for HTTPS responses (nil for plain HTTP) and
server_addr returns the resolved IP address and port, both read from the
fetch response initializer.
Ports the upstream global-fetch specs covering these methods.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from c7b94dc to f6583cbCompareJune 26, 2026 02:57
@kruppel
kruppel marked this pull request as ready for review June 26, 2026 02:59
@kruppelkruppel closed this Jun 26, 2026
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.

1 participant

@kruppel
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Upgrade to Playwright 1.61.1 by kruppel · Pull Request #1 · kruppel/playwright-ruby-client · GitHub
Skip to content

Upgrade to Playwright 1.61.1 - #1

Closed
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1
Closed

Upgrade to Playwright 1.61.1#1
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1

Conversation

@kruppel

@kruppelkruppel commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

Upgrade playwright-ruby to Playwright 1.61.1.

Key Changes

  • Frame#expect error handling: Refactored to handle Playwright 1.61+ behavior

    • The expect command now resolves on successful match and rejects with FrameExpectErrorDetails on mismatch/timeout
    • Changed from parsing result['received'] to catching ::Playwright::Error exceptions
    • Returns { 'matches' => !is_not } on success, extracts error details on failure
    • Properly handles both isNot flag and error details from server
  • Error class enhancements: Added support for expect-specific error details

    • Added raw_log and details attributes to Error class
    • Updated lib/playwright/connection.rb to parse and attach errorDetails from server messages
  • API coverage documentation: Updated to reflect deprecated/unimplemented features

    • Marked local_storage, session_storage, and credentials as unimplemented
    • Updated development/api.json with Playwright 1.61.1 schema changes
    • Added artifactsDir parameter to BrowserType#connect_over_cdp

@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch 3 times, most recently from 3f5d099 to 8862204CompareJune 26, 2026 02:13
end

def connect_over_cdp(endpointURL, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)
def connect_over_cdp(endpointURL, artifactsDir: nil, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

attr_reader :name, :message, :stack
attr_reader :name, :message, :stack, :raw_log
# Error details for `expect` failures (received value, timedOut, customErrorMessage).
attr_accessor :details

@kruppelkruppelJun 26, 2026

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

The change isn't captured in the release notes, but came from upstream PR #40801 "chore: throw on Frame.expect / Page.expectScreenshot failure".

Here's the difference in the expect protocol across the two versions:

Playwright 1.60.0 — the command returns the result:

exporttypeFrameExpectResult={matches: boolean,received?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,errorMessage?: string,log?: string[],};// (no FrameExpectErrorDetails type exists)

Playwright 1.61.1 — the result is gone; failure info moved to a reject-path type:

exporttypeFrameExpectResult=void;// ← resolves with NOTHING on a matchexporttypeFrameExpectErrorDetails={// ← NEW; sent on the error/reject pathreceived?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,customErrorMessage?: string,};

In 1.60, the Ruby client read result['matches'] / ['received'] / ['log'] off the return value. In 1.61, since the command returns void, assertions break as the expect call comes back as {"id":7} (no result), and raises undefined method 'key?' for nil at frame.rb:738.

To resolve the failing test:

  • details carries the new FrameExpectErrorDetails (received / timedOut / customErrorMessage), which now only exists on the error path.
  • raw_log replaces the old FrameExpectResult.log field (the call-log array), which likewise moved off the result and onto the error's wire log.

Ports Frame#expect to the 1.61 expect protocol: the command now resolves
on a successful match and rejects with FrameExpectErrorDetails on
mismatch/timeout (upstream microsoft/playwright#40801). Carry
errorDetails on Playwright::Error and translate it back into the
assertion result hash.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from 8862204 to cfc42abCompareJune 26, 2026 02:40
Adds the 1.61 WebStorage API: page.local_storage / page.session_storage
expose the current origin's localStorage / sessionStorage via items,
get_item, set_item, remove_item and clear, backed by the page channel's
webStorage* commands.
Registers WebStorage with the API generator and ports the upstream
page-localstorage spec.
Adds the 1.61 WebAuthn API: browser_context.credentials exposes a virtual
authenticator scoped to the context, with install, create, get and delete
backed by the context channel's credentials* commands. Lets tests seed
passkeys and answer navigator.credentials ceremonies without real hardware.
Registers Credentials with the API generator, maps the class doc examples,
and ports the upstream browsercontext-webauthn spec.
Exposes the 1.61 APIResponse fields: security_details returns the TLS
certificate details for HTTPS responses (nil for plain HTTP) and
server_addr returns the resolved IP address and port, both read from the
fetch response initializer.
Ports the upstream global-fetch specs covering these methods.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from c7b94dc to f6583cbCompareJune 26, 2026 02:57
@kruppel
kruppel marked this pull request as ready for review June 26, 2026 02:59
@kruppelkruppel closed this Jun 26, 2026
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.

1 participant

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

Upgrade to Playwright 1.61.1 - #1

Closed
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1
Closed

Upgrade to Playwright 1.61.1#1
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1

Conversation

@kruppel

@kruppelkruppel commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

Upgrade playwright-ruby to Playwright 1.61.1.

Key Changes

  • Frame#expect error handling: Refactored to handle Playwright 1.61+ behavior

    • The expect command now resolves on successful match and rejects with FrameExpectErrorDetails on mismatch/timeout
    • Changed from parsing result['received'] to catching ::Playwright::Error exceptions
    • Returns { 'matches' => !is_not } on success, extracts error details on failure
    • Properly handles both isNot flag and error details from server
  • Error class enhancements: Added support for expect-specific error details

    • Added raw_log and details attributes to Error class
    • Updated lib/playwright/connection.rb to parse and attach errorDetails from server messages
  • API coverage documentation: Updated to reflect deprecated/unimplemented features

    • Marked local_storage, session_storage, and credentials as unimplemented
    • Updated development/api.json with Playwright 1.61.1 schema changes
    • Added artifactsDir parameter to BrowserType#connect_over_cdp

@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch 3 times, most recently from 3f5d099 to 8862204CompareJune 26, 2026 02:13
end

def connect_over_cdp(endpointURL, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)
def connect_over_cdp(endpointURL, artifactsDir: nil, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

attr_reader :name, :message, :stack
attr_reader :name, :message, :stack, :raw_log
# Error details for `expect` failures (received value, timedOut, customErrorMessage).
attr_accessor :details

@kruppelkruppelJun 26, 2026

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

The change isn't captured in the release notes, but came from upstream PR #40801 "chore: throw on Frame.expect / Page.expectScreenshot failure".

Here's the difference in the expect protocol across the two versions:

Playwright 1.60.0 — the command returns the result:

exporttypeFrameExpectResult={matches: boolean,received?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,errorMessage?: string,log?: string[],};// (no FrameExpectErrorDetails type exists)

Playwright 1.61.1 — the result is gone; failure info moved to a reject-path type:

exporttypeFrameExpectResult=void;// ← resolves with NOTHING on a matchexporttypeFrameExpectErrorDetails={// ← NEW; sent on the error/reject pathreceived?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,customErrorMessage?: string,};

In 1.60, the Ruby client read result['matches'] / ['received'] / ['log'] off the return value. In 1.61, since the command returns void, assertions break as the expect call comes back as {"id":7} (no result), and raises undefined method 'key?' for nil at frame.rb:738.

To resolve the failing test:

  • details carries the new FrameExpectErrorDetails (received / timedOut / customErrorMessage), which now only exists on the error path.
  • raw_log replaces the old FrameExpectResult.log field (the call-log array), which likewise moved off the result and onto the error's wire log.

Ports Frame#expect to the 1.61 expect protocol: the command now resolves
on a successful match and rejects with FrameExpectErrorDetails on
mismatch/timeout (upstream microsoft/playwright#40801). Carry
errorDetails on Playwright::Error and translate it back into the
assertion result hash.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from 8862204 to cfc42abCompareJune 26, 2026 02:40
Adds the 1.61 WebStorage API: page.local_storage / page.session_storage
expose the current origin's localStorage / sessionStorage via items,
get_item, set_item, remove_item and clear, backed by the page channel's
webStorage* commands.
Registers WebStorage with the API generator and ports the upstream
page-localstorage spec.
Adds the 1.61 WebAuthn API: browser_context.credentials exposes a virtual
authenticator scoped to the context, with install, create, get and delete
backed by the context channel's credentials* commands. Lets tests seed
passkeys and answer navigator.credentials ceremonies without real hardware.
Registers Credentials with the API generator, maps the class doc examples,
and ports the upstream browsercontext-webauthn spec.
Exposes the 1.61 APIResponse fields: security_details returns the TLS
certificate details for HTTPS responses (nil for plain HTTP) and
server_addr returns the resolved IP address and port, both read from the
fetch response initializer.
Ports the upstream global-fetch specs covering these methods.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from c7b94dc to f6583cbCompareJune 26, 2026 02:57
@kruppel
kruppel marked this pull request as ready for review June 26, 2026 02:59
@kruppelkruppel closed this Jun 26, 2026
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.

1 participant

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

Upgrade to Playwright 1.61.1 - #1

Closed
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1
Closed

Upgrade to Playwright 1.61.1#1
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1

Conversation

@kruppel

@kruppelkruppel commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

Upgrade playwright-ruby to Playwright 1.61.1.

Key Changes

  • Frame#expect error handling: Refactored to handle Playwright 1.61+ behavior

    • The expect command now resolves on successful match and rejects with FrameExpectErrorDetails on mismatch/timeout
    • Changed from parsing result['received'] to catching ::Playwright::Error exceptions
    • Returns { 'matches' => !is_not } on success, extracts error details on failure
    • Properly handles both isNot flag and error details from server
  • Error class enhancements: Added support for expect-specific error details

    • Added raw_log and details attributes to Error class
    • Updated lib/playwright/connection.rb to parse and attach errorDetails from server messages
  • API coverage documentation: Updated to reflect deprecated/unimplemented features

    • Marked local_storage, session_storage, and credentials as unimplemented
    • Updated development/api.json with Playwright 1.61.1 schema changes
    • Added artifactsDir parameter to BrowserType#connect_over_cdp

@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch 3 times, most recently from 3f5d099 to 8862204CompareJune 26, 2026 02:13
end

def connect_over_cdp(endpointURL, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)
def connect_over_cdp(endpointURL, artifactsDir: nil, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

attr_reader :name, :message, :stack
attr_reader :name, :message, :stack, :raw_log
# Error details for `expect` failures (received value, timedOut, customErrorMessage).
attr_accessor :details

@kruppelkruppelJun 26, 2026

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

The change isn't captured in the release notes, but came from upstream PR #40801 "chore: throw on Frame.expect / Page.expectScreenshot failure".

Here's the difference in the expect protocol across the two versions:

Playwright 1.60.0 — the command returns the result:

exporttypeFrameExpectResult={matches: boolean,received?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,errorMessage?: string,log?: string[],};// (no FrameExpectErrorDetails type exists)

Playwright 1.61.1 — the result is gone; failure info moved to a reject-path type:

exporttypeFrameExpectResult=void;// ← resolves with NOTHING on a matchexporttypeFrameExpectErrorDetails={// ← NEW; sent on the error/reject pathreceived?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,customErrorMessage?: string,};

In 1.60, the Ruby client read result['matches'] / ['received'] / ['log'] off the return value. In 1.61, since the command returns void, assertions break as the expect call comes back as {"id":7} (no result), and raises undefined method 'key?' for nil at frame.rb:738.

To resolve the failing test:

  • details carries the new FrameExpectErrorDetails (received / timedOut / customErrorMessage), which now only exists on the error path.
  • raw_log replaces the old FrameExpectResult.log field (the call-log array), which likewise moved off the result and onto the error's wire log.

Ports Frame#expect to the 1.61 expect protocol: the command now resolves
on a successful match and rejects with FrameExpectErrorDetails on
mismatch/timeout (upstream microsoft/playwright#40801). Carry
errorDetails on Playwright::Error and translate it back into the
assertion result hash.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from 8862204 to cfc42abCompareJune 26, 2026 02:40
Adds the 1.61 WebStorage API: page.local_storage / page.session_storage
expose the current origin's localStorage / sessionStorage via items,
get_item, set_item, remove_item and clear, backed by the page channel's
webStorage* commands.
Registers WebStorage with the API generator and ports the upstream
page-localstorage spec.
Adds the 1.61 WebAuthn API: browser_context.credentials exposes a virtual
authenticator scoped to the context, with install, create, get and delete
backed by the context channel's credentials* commands. Lets tests seed
passkeys and answer navigator.credentials ceremonies without real hardware.
Registers Credentials with the API generator, maps the class doc examples,
and ports the upstream browsercontext-webauthn spec.
Exposes the 1.61 APIResponse fields: security_details returns the TLS
certificate details for HTTPS responses (nil for plain HTTP) and
server_addr returns the resolved IP address and port, both read from the
fetch response initializer.
Ports the upstream global-fetch specs covering these methods.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from c7b94dc to f6583cbCompareJune 26, 2026 02:57
@kruppel
kruppel marked this pull request as ready for review June 26, 2026 02:59
@kruppelkruppel closed this Jun 26, 2026
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.

1 participant

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

Upgrade to Playwright 1.61.1 - #1

Closed
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1
Closed

Upgrade to Playwright 1.61.1#1
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1

Conversation

@kruppel

@kruppelkruppel commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

Upgrade playwright-ruby to Playwright 1.61.1.

Key Changes

  • Frame#expect error handling: Refactored to handle Playwright 1.61+ behavior

    • The expect command now resolves on successful match and rejects with FrameExpectErrorDetails on mismatch/timeout
    • Changed from parsing result['received'] to catching ::Playwright::Error exceptions
    • Returns { 'matches' => !is_not } on success, extracts error details on failure
    • Properly handles both isNot flag and error details from server
  • Error class enhancements: Added support for expect-specific error details

    • Added raw_log and details attributes to Error class
    • Updated lib/playwright/connection.rb to parse and attach errorDetails from server messages
  • API coverage documentation: Updated to reflect deprecated/unimplemented features

    • Marked local_storage, session_storage, and credentials as unimplemented
    • Updated development/api.json with Playwright 1.61.1 schema changes
    • Added artifactsDir parameter to BrowserType#connect_over_cdp

@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch 3 times, most recently from 3f5d099 to 8862204CompareJune 26, 2026 02:13
end

def connect_over_cdp(endpointURL, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)
def connect_over_cdp(endpointURL, artifactsDir: nil, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

attr_reader :name, :message, :stack
attr_reader :name, :message, :stack, :raw_log
# Error details for `expect` failures (received value, timedOut, customErrorMessage).
attr_accessor :details

@kruppelkruppelJun 26, 2026

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

The change isn't captured in the release notes, but came from upstream PR #40801 "chore: throw on Frame.expect / Page.expectScreenshot failure".

Here's the difference in the expect protocol across the two versions:

Playwright 1.60.0 — the command returns the result:

exporttypeFrameExpectResult={matches: boolean,received?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,errorMessage?: string,log?: string[],};// (no FrameExpectErrorDetails type exists)

Playwright 1.61.1 — the result is gone; failure info moved to a reject-path type:

exporttypeFrameExpectResult=void;// ← resolves with NOTHING on a matchexporttypeFrameExpectErrorDetails={// ← NEW; sent on the error/reject pathreceived?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,customErrorMessage?: string,};

In 1.60, the Ruby client read result['matches'] / ['received'] / ['log'] off the return value. In 1.61, since the command returns void, assertions break as the expect call comes back as {"id":7} (no result), and raises undefined method 'key?' for nil at frame.rb:738.

To resolve the failing test:

  • details carries the new FrameExpectErrorDetails (received / timedOut / customErrorMessage), which now only exists on the error path.
  • raw_log replaces the old FrameExpectResult.log field (the call-log array), which likewise moved off the result and onto the error's wire log.

Ports Frame#expect to the 1.61 expect protocol: the command now resolves
on a successful match and rejects with FrameExpectErrorDetails on
mismatch/timeout (upstream microsoft/playwright#40801). Carry
errorDetails on Playwright::Error and translate it back into the
assertion result hash.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from 8862204 to cfc42abCompareJune 26, 2026 02:40
Adds the 1.61 WebStorage API: page.local_storage / page.session_storage
expose the current origin's localStorage / sessionStorage via items,
get_item, set_item, remove_item and clear, backed by the page channel's
webStorage* commands.
Registers WebStorage with the API generator and ports the upstream
page-localstorage spec.
Adds the 1.61 WebAuthn API: browser_context.credentials exposes a virtual
authenticator scoped to the context, with install, create, get and delete
backed by the context channel's credentials* commands. Lets tests seed
passkeys and answer navigator.credentials ceremonies without real hardware.
Registers Credentials with the API generator, maps the class doc examples,
and ports the upstream browsercontext-webauthn spec.
Exposes the 1.61 APIResponse fields: security_details returns the TLS
certificate details for HTTPS responses (nil for plain HTTP) and
server_addr returns the resolved IP address and port, both read from the
fetch response initializer.
Ports the upstream global-fetch specs covering these methods.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from c7b94dc to f6583cbCompareJune 26, 2026 02:57
@kruppel
kruppel marked this pull request as ready for review June 26, 2026 02:59
@kruppelkruppel closed this Jun 26, 2026
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.

1 participant

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

Upgrade to Playwright 1.61.1 - #1

Closed
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1
Closed

Upgrade to Playwright 1.61.1#1
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1

Conversation

@kruppel

@kruppelkruppel commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

Upgrade playwright-ruby to Playwright 1.61.1.

Key Changes

  • Frame#expect error handling: Refactored to handle Playwright 1.61+ behavior

    • The expect command now resolves on successful match and rejects with FrameExpectErrorDetails on mismatch/timeout
    • Changed from parsing result['received'] to catching ::Playwright::Error exceptions
    • Returns { 'matches' => !is_not } on success, extracts error details on failure
    • Properly handles both isNot flag and error details from server
  • Error class enhancements: Added support for expect-specific error details

    • Added raw_log and details attributes to Error class
    • Updated lib/playwright/connection.rb to parse and attach errorDetails from server messages
  • API coverage documentation: Updated to reflect deprecated/unimplemented features

    • Marked local_storage, session_storage, and credentials as unimplemented
    • Updated development/api.json with Playwright 1.61.1 schema changes
    • Added artifactsDir parameter to BrowserType#connect_over_cdp

@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch 3 times, most recently from 3f5d099 to 8862204CompareJune 26, 2026 02:13
end

def connect_over_cdp(endpointURL, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)
def connect_over_cdp(endpointURL, artifactsDir: nil, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

attr_reader :name, :message, :stack
attr_reader :name, :message, :stack, :raw_log
# Error details for `expect` failures (received value, timedOut, customErrorMessage).
attr_accessor :details

@kruppelkruppelJun 26, 2026

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

The change isn't captured in the release notes, but came from upstream PR #40801 "chore: throw on Frame.expect / Page.expectScreenshot failure".

Here's the difference in the expect protocol across the two versions:

Playwright 1.60.0 — the command returns the result:

exporttypeFrameExpectResult={matches: boolean,received?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,errorMessage?: string,log?: string[],};// (no FrameExpectErrorDetails type exists)

Playwright 1.61.1 — the result is gone; failure info moved to a reject-path type:

exporttypeFrameExpectResult=void;// ← resolves with NOTHING on a matchexporttypeFrameExpectErrorDetails={// ← NEW; sent on the error/reject pathreceived?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,customErrorMessage?: string,};

In 1.60, the Ruby client read result['matches'] / ['received'] / ['log'] off the return value. In 1.61, since the command returns void, assertions break as the expect call comes back as {"id":7} (no result), and raises undefined method 'key?' for nil at frame.rb:738.

To resolve the failing test:

  • details carries the new FrameExpectErrorDetails (received / timedOut / customErrorMessage), which now only exists on the error path.
  • raw_log replaces the old FrameExpectResult.log field (the call-log array), which likewise moved off the result and onto the error's wire log.

Ports Frame#expect to the 1.61 expect protocol: the command now resolves
on a successful match and rejects with FrameExpectErrorDetails on
mismatch/timeout (upstream microsoft/playwright#40801). Carry
errorDetails on Playwright::Error and translate it back into the
assertion result hash.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from 8862204 to cfc42abCompareJune 26, 2026 02:40
Adds the 1.61 WebStorage API: page.local_storage / page.session_storage
expose the current origin's localStorage / sessionStorage via items,
get_item, set_item, remove_item and clear, backed by the page channel's
webStorage* commands.
Registers WebStorage with the API generator and ports the upstream
page-localstorage spec.
Adds the 1.61 WebAuthn API: browser_context.credentials exposes a virtual
authenticator scoped to the context, with install, create, get and delete
backed by the context channel's credentials* commands. Lets tests seed
passkeys and answer navigator.credentials ceremonies without real hardware.
Registers Credentials with the API generator, maps the class doc examples,
and ports the upstream browsercontext-webauthn spec.
Exposes the 1.61 APIResponse fields: security_details returns the TLS
certificate details for HTTPS responses (nil for plain HTTP) and
server_addr returns the resolved IP address and port, both read from the
fetch response initializer.
Ports the upstream global-fetch specs covering these methods.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from c7b94dc to f6583cbCompareJune 26, 2026 02:57
@kruppel
kruppel marked this pull request as ready for review June 26, 2026 02:59
@kruppelkruppel closed this Jun 26, 2026
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.

1 participant

@kruppel
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Upgrade to Playwright 1.61.1 by kruppel · Pull Request #1 · kruppel/playwright-ruby-client · GitHub
Skip to content

Upgrade to Playwright 1.61.1 - #1

Closed
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1
Closed

Upgrade to Playwright 1.61.1#1
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1

Conversation

@kruppel

@kruppelkruppel commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

Upgrade playwright-ruby to Playwright 1.61.1.

Key Changes

  • Frame#expect error handling: Refactored to handle Playwright 1.61+ behavior

    • The expect command now resolves on successful match and rejects with FrameExpectErrorDetails on mismatch/timeout
    • Changed from parsing result['received'] to catching ::Playwright::Error exceptions
    • Returns { 'matches' => !is_not } on success, extracts error details on failure
    • Properly handles both isNot flag and error details from server
  • Error class enhancements: Added support for expect-specific error details

    • Added raw_log and details attributes to Error class
    • Updated lib/playwright/connection.rb to parse and attach errorDetails from server messages
  • API coverage documentation: Updated to reflect deprecated/unimplemented features

    • Marked local_storage, session_storage, and credentials as unimplemented
    • Updated development/api.json with Playwright 1.61.1 schema changes
    • Added artifactsDir parameter to BrowserType#connect_over_cdp

@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch 3 times, most recently from 3f5d099 to 8862204CompareJune 26, 2026 02:13
end

def connect_over_cdp(endpointURL, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)
def connect_over_cdp(endpointURL, artifactsDir: nil, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

attr_reader :name, :message, :stack
attr_reader :name, :message, :stack, :raw_log
# Error details for `expect` failures (received value, timedOut, customErrorMessage).
attr_accessor :details

@kruppelkruppelJun 26, 2026

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

The change isn't captured in the release notes, but came from upstream PR #40801 "chore: throw on Frame.expect / Page.expectScreenshot failure".

Here's the difference in the expect protocol across the two versions:

Playwright 1.60.0 — the command returns the result:

exporttypeFrameExpectResult={matches: boolean,received?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,errorMessage?: string,log?: string[],};// (no FrameExpectErrorDetails type exists)

Playwright 1.61.1 — the result is gone; failure info moved to a reject-path type:

exporttypeFrameExpectResult=void;// ← resolves with NOTHING on a matchexporttypeFrameExpectErrorDetails={// ← NEW; sent on the error/reject pathreceived?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,customErrorMessage?: string,};

In 1.60, the Ruby client read result['matches'] / ['received'] / ['log'] off the return value. In 1.61, since the command returns void, assertions break as the expect call comes back as {"id":7} (no result), and raises undefined method 'key?' for nil at frame.rb:738.

To resolve the failing test:

  • details carries the new FrameExpectErrorDetails (received / timedOut / customErrorMessage), which now only exists on the error path.
  • raw_log replaces the old FrameExpectResult.log field (the call-log array), which likewise moved off the result and onto the error's wire log.

Ports Frame#expect to the 1.61 expect protocol: the command now resolves
on a successful match and rejects with FrameExpectErrorDetails on
mismatch/timeout (upstream microsoft/playwright#40801). Carry
errorDetails on Playwright::Error and translate it back into the
assertion result hash.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from 8862204 to cfc42abCompareJune 26, 2026 02:40
Adds the 1.61 WebStorage API: page.local_storage / page.session_storage
expose the current origin's localStorage / sessionStorage via items,
get_item, set_item, remove_item and clear, backed by the page channel's
webStorage* commands.
Registers WebStorage with the API generator and ports the upstream
page-localstorage spec.
Adds the 1.61 WebAuthn API: browser_context.credentials exposes a virtual
authenticator scoped to the context, with install, create, get and delete
backed by the context channel's credentials* commands. Lets tests seed
passkeys and answer navigator.credentials ceremonies without real hardware.
Registers Credentials with the API generator, maps the class doc examples,
and ports the upstream browsercontext-webauthn spec.
Exposes the 1.61 APIResponse fields: security_details returns the TLS
certificate details for HTTPS responses (nil for plain HTTP) and
server_addr returns the resolved IP address and port, both read from the
fetch response initializer.
Ports the upstream global-fetch specs covering these methods.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from c7b94dc to f6583cbCompareJune 26, 2026 02:57
@kruppel
kruppel marked this pull request as ready for review June 26, 2026 02:59
@kruppelkruppel closed this Jun 26, 2026
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.

1 participant

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

Upgrade to Playwright 1.61.1 - #1

Closed
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1
Closed

Upgrade to Playwright 1.61.1#1
kruppel wants to merge 4 commits into
mainfrom
kurt/playwright-1.61.1

Conversation

@kruppel

@kruppelkruppel commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

Upgrade playwright-ruby to Playwright 1.61.1.

Key Changes

  • Frame#expect error handling: Refactored to handle Playwright 1.61+ behavior

    • The expect command now resolves on successful match and rejects with FrameExpectErrorDetails on mismatch/timeout
    • Changed from parsing result['received'] to catching ::Playwright::Error exceptions
    • Returns { 'matches' => !is_not } on success, extracts error details on failure
    • Properly handles both isNot flag and error details from server
  • Error class enhancements: Added support for expect-specific error details

    • Added raw_log and details attributes to Error class
    • Updated lib/playwright/connection.rb to parse and attach errorDetails from server messages
  • API coverage documentation: Updated to reflect deprecated/unimplemented features

    • Marked local_storage, session_storage, and credentials as unimplemented
    • Updated development/api.json with Playwright 1.61.1 schema changes
    • Added artifactsDir parameter to BrowserType#connect_over_cdp

@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch 3 times, most recently from 3f5d099 to 8862204CompareJune 26, 2026 02:13
end

def connect_over_cdp(endpointURL, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)
def connect_over_cdp(endpointURL, artifactsDir: nil, headers: nil, isLocal: nil, noDefaults: nil, slowMo: nil, timeout: nil, &block)

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

attr_reader :name, :message, :stack
attr_reader :name, :message, :stack, :raw_log
# Error details for `expect` failures (received value, timedOut, customErrorMessage).
attr_accessor :details

@kruppelkruppelJun 26, 2026

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

The change isn't captured in the release notes, but came from upstream PR #40801 "chore: throw on Frame.expect / Page.expectScreenshot failure".

Here's the difference in the expect protocol across the two versions:

Playwright 1.60.0 — the command returns the result:

exporttypeFrameExpectResult={matches: boolean,received?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,errorMessage?: string,log?: string[],};// (no FrameExpectErrorDetails type exists)

Playwright 1.61.1 — the result is gone; failure info moved to a reject-path type:

exporttypeFrameExpectResult=void;// ← resolves with NOTHING on a matchexporttypeFrameExpectErrorDetails={// ← NEW; sent on the error/reject pathreceived?: {value?: SerializedValue,ariaSnapshot?: string},timedOut?: boolean,customErrorMessage?: string,};

In 1.60, the Ruby client read result['matches'] / ['received'] / ['log'] off the return value. In 1.61, since the command returns void, assertions break as the expect call comes back as {"id":7} (no result), and raises undefined method 'key?' for nil at frame.rb:738.

To resolve the failing test:

  • details carries the new FrameExpectErrorDetails (received / timedOut / customErrorMessage), which now only exists on the error path.
  • raw_log replaces the old FrameExpectResult.log field (the call-log array), which likewise moved off the result and onto the error's wire log.

Ports Frame#expect to the 1.61 expect protocol: the command now resolves
on a successful match and rejects with FrameExpectErrorDetails on
mismatch/timeout (upstream microsoft/playwright#40801). Carry
errorDetails on Playwright::Error and translate it back into the
assertion result hash.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from 8862204 to cfc42abCompareJune 26, 2026 02:40
Adds the 1.61 WebStorage API: page.local_storage / page.session_storage
expose the current origin's localStorage / sessionStorage via items,
get_item, set_item, remove_item and clear, backed by the page channel's
webStorage* commands.
Registers WebStorage with the API generator and ports the upstream
page-localstorage spec.
Adds the 1.61 WebAuthn API: browser_context.credentials exposes a virtual
authenticator scoped to the context, with install, create, get and delete
backed by the context channel's credentials* commands. Lets tests seed
passkeys and answer navigator.credentials ceremonies without real hardware.
Registers Credentials with the API generator, maps the class doc examples,
and ports the upstream browsercontext-webauthn spec.
Exposes the 1.61 APIResponse fields: security_details returns the TLS
certificate details for HTTPS responses (nil for plain HTTP) and
server_addr returns the resolved IP address and port, both read from the
fetch response initializer.
Ports the upstream global-fetch specs covering these methods.
@kruppel
kruppelforce-pushed the kurt/playwright-1.61.1 branch from c7b94dc to f6583cbCompareJune 26, 2026 02:57
@kruppel
kruppel marked this pull request as ready for review June 26, 2026 02:59
@kruppelkruppel closed this Jun 26, 2026
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.

1 participant

@kruppel