From 9941f08b42c2aed979763e4011c56092d70c6d2b Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Tue, 14 Jul 2026 07:39:34 +0100 Subject: [PATCH 1/5] test: unskip allHeaders() tests in workers.spec after chromium roll (#41756) --- tests/page/workers.spec.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/page/workers.spec.ts b/tests/page/workers.spec.ts index 3da5821b57186..80dd68146160b 100644 --- a/tests/page/workers.spec.ts +++ b/tests/page/workers.spec.ts @@ -383,8 +383,6 @@ it('should resolve worker script allHeaders in main frame', { it('should resolve worker script allHeaders in iframe', { annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/39948' }, }, async function({ page, server, browserName }) { - it.fixme(browserName === 'chromium', 'https://github.com/microsoft/playwright/issues/39948'); - const [request] = await Promise.all([ page.waitForEvent('requestfinished', request => request.url() === server.PREFIX + '/worker/worker.js'), attachFrame(page, 'frame1', server.PREFIX + '/worker/worker.html'), @@ -401,7 +399,6 @@ it('should resolve worker script allHeaders in nested worker inside iframe', { }, async function({ page, server, browserName }) { it.fixme(browserName === 'webkit', 'cannot evaluate in nested worker'); it.fixme(browserName === 'firefox', 'nested worker script request is not reported at all'); - it.fixme(browserName === 'chromium', 'https://github.com/microsoft/playwright/issues/39948'); const [worker] = await Promise.all([ page.waitForEvent('worker'), From 7b02a7a6d85aad2efc5ef46d63bf2f22e276fff2 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Tue, 14 Jul 2026 09:28:45 +0200 Subject: [PATCH 2/5] fix(reporter): expose setup/teardown projects to preprocessSuite (#41731) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/src/test-reporter-api/class-reporter.md | 2 +- packages/playwright/src/common/test.ts | 30 +++-- .../src/reporters/internalReporter.ts | 7 +- packages/playwright/src/runner/loadUtils.ts | 36 ++++-- packages/playwright/types/testReporter.d.ts | 3 +- .../reporter-preprocess-suite.spec.ts | 106 ++++++++++++++++-- 6 files changed, 145 insertions(+), 39 deletions(-) diff --git a/docs/src/test-reporter-api/class-reporter.md b/docs/src/test-reporter-api/class-reporter.md index 26f8d619e22ca..67619c914e1f7 100644 --- a/docs/src/test-reporter-api/class-reporter.md +++ b/docs/src/test-reporter-api/class-reporter.md @@ -317,6 +317,6 @@ Resolved configuration. The root suite that contains the projects, files and test cases that will run. -The suite reflects `--project`, `--grep`/`--grep-invert` and `.only` filtering, so it only contains tests that match the current invocation. It contains only the top-level projects being run — setup and dependency projects are not included and cannot be excluded from here. +The suite reflects `--project`, `--grep`/`--grep-invert` and `.only` filtering, so it only contains tests that match the current invocation. Setup and dependency projects are readonly and cannot be excluded from here. The suite ignores the `--shard` argument: it always contains the full, un-sharded corpus. Playwright applies its built-in sharding after [`method: Reporter.preprocessSuite`] returns, unless the returned `implementsSharding` is `true`. diff --git a/packages/playwright/src/common/test.ts b/packages/playwright/src/common/test.ts index 991ac8304ef0d..598a041d8a81e 100644 --- a/packages/playwright/src/common/test.ts +++ b/packages/playwright/src/common/test.ts @@ -58,7 +58,7 @@ export class Suite extends Base { _parallelMode: 'none' | 'default' | 'serial' | 'parallel' = 'none'; _fullProject: FullProjectInternal | undefined; _fileId: string | undefined; - _preprocessing = false; + _preprocessMode: 'editable' | 'readonly' | undefined = undefined; readonly _type: 'root' | 'project' | 'file' | 'describe'; skip: (reason?: string) => void; @@ -270,22 +270,28 @@ export class Suite extends Base { } private _modifier(type: 'skip' | 'fixme' | 'fail', location: Location, reason: string | undefined): void { - if (!this._rootSuite()._preprocessing) + const mode = this._resolvePreprocessMode(); + if (!mode) throw new Error(`Suite.${type}() can only be called from Reporter.preprocessSuite().`); + if (mode === 'readonly') + throw new Error(`Suite.${type}() cannot be called on a setup or teardown project; these always run in full.`); for (const test of this.allTests()) test._applyPlanAnnotation({ type, description: reason, location }); } exclude(): void { - if (!this._rootSuite()._preprocessing) + const mode = this._resolvePreprocessMode(); + if (!mode) throw new Error(`Suite.exclude() can only be called from Reporter.preprocessSuite().`); if (!this.parent) throw new Error(`Suite.exclude() cannot be called on the root suite.`); + if (mode === 'readonly') + throw new Error(`Suite.exclude() cannot be called on a setup or teardown project; these always run in full.`); this.parent._detach(this); } - _rootSuite(): Suite { - return this.parent?._rootSuite() ?? this; + _resolvePreprocessMode(): 'editable' | 'readonly' | undefined { + return this._preprocessMode ?? this.parent?._resolvePreprocessMode(); } } @@ -353,8 +359,11 @@ export class TestCase extends Base implements reporterTypes.TestCase { } private _modifier(type: 'skip' | 'fixme' | 'fail', location: Location, reason: string | undefined): void { - if (!this._rootSuite()._preprocessing) + const mode = this.parent._resolvePreprocessMode(); + if (!mode) throw new Error(`TestCase.${type}() can only be called from Reporter.preprocessSuite().`); + if (mode === 'readonly') + throw new Error(`TestCase.${type}() cannot be called on a setup or teardown project test; these always run in full.`); this._applyPlanAnnotation({ type, description: reason, location }); } @@ -368,15 +377,14 @@ export class TestCase extends Base implements reporterTypes.TestCase { } exclude(): void { - if (!this._rootSuite()._preprocessing) + const mode = this.parent._resolvePreprocessMode(); + if (!mode) throw new Error(`TestCase.exclude() can only be called from Reporter.preprocessSuite().`); + if (mode === 'readonly') + throw new Error(`TestCase.exclude() cannot be called on a setup or teardown project test; these always run in full.`); this.parent._detach(this); } - _rootSuite(): Suite { - return this.parent._rootSuite(); - } - _serialize(): any { return { kind: 'test', diff --git a/packages/playwright/src/reporters/internalReporter.ts b/packages/playwright/src/reporters/internalReporter.ts index 7766ec11f6f8b..f4f092cd5d9ea 100644 --- a/packages/playwright/src/reporters/internalReporter.ts +++ b/packages/playwright/src/reporters/internalReporter.ts @@ -55,12 +55,7 @@ export class InternalReporter implements ReporterV2 { } async preprocessSuite(config: FullConfig, suite: testNs.Suite) { - suite._preprocessing = true; - try { - return await this._reporter.preprocessSuite?.(config, suite); - } finally { - suite._preprocessing = false; - } + return await this._reporter.preprocessSuite?.(config, suite); } onBegin(suite: testNs.Suite) { diff --git a/packages/playwright/src/runner/loadUtils.ts b/packages/playwright/src/runner/loadUtils.ts index 9485a923ba5a1..9878b14702c8b 100644 --- a/packages/playwright/src/runner/loadUtils.ts +++ b/packages/playwright/src/runner/loadUtils.ts @@ -165,7 +165,30 @@ export async function createRootSuite(testRun: TestRun, errors: TestError[], sho } } - const preprocessResult = await testRun.reporter.preprocessSuite(config.config, rootSuite); + // Temporarily prepend unfiltered dependency projects for preprocessing. + const dependencySuites = new Map(); + for (const [project, type] of projectClosure) { + if (type !== 'dependency') + continue; + const dependencySuite = buildProjectSuite(project, projectSuites.get(project)!); + dependencySuite._preprocessMode = 'readonly'; + dependencySuites.set(project, dependencySuite); + rootSuite._prependSuite(dependencySuite); + } + + rootSuite._preprocessMode = 'editable'; + let preprocessResult: Awaited>; + try { + preprocessResult = await testRun.reporter.preprocessSuite(config.config, rootSuite); + } finally { + // Continue the existing sharding and filtering pipeline with top-level projects only. + rootSuite._preprocessMode = undefined; + for (const dependencySuite of dependencySuites.values()) { + dependencySuite._preprocessMode = undefined; + rootSuite._detach(dependencySuite); + } + } + // Shard only the top-level projects. if (config.config.shard && !preprocessResult?.implementsSharding) { // Create test groups for top-level projects. @@ -193,16 +216,13 @@ export async function createRootSuite(testRun: TestRun, errors: TestError[], sho suiteUtils.filterTestsRemoveEmptySuites(rootSuite, test => testRun.postShardTestFilters.every(filter => filter(test))); const topLevelProjects = []; - // Now prepend dependency projects without filtration. { // Filtering 'only' and sharding might have reduced the number of top-level projects. // Build the project closure to only include dependencies that are still needed. - const projectClosure = new Map(buildProjectsClosure(rootSuite.suites.map(suite => suite._fullProject!))); - - // Clone file suites for dependency projects. - for (const [project, level] of projectClosure.entries()) { - if (level === 'dependency') - rootSuite._prependSuite(buildProjectSuite(project, projectSuites.get(project)!)); + const finalProjectClosure = buildProjectsClosure(rootSuite.suites.map(suite => suite._fullProject!)); + for (const [project, type] of finalProjectClosure) { + if (type === 'dependency') + rootSuite._prependSuite(dependencySuites.get(project)!); else topLevelProjects.push(project); } diff --git a/packages/playwright/types/testReporter.d.ts b/packages/playwright/types/testReporter.d.ts index 47e406bcd1d82..f7809c29c65fe 100644 --- a/packages/playwright/types/testReporter.d.ts +++ b/packages/playwright/types/testReporter.d.ts @@ -153,8 +153,7 @@ export interface Reporter { * @param suite The root suite that contains the projects, files and test cases that will run. * * The suite reflects `--project`, `--grep`/`--grep-invert` and `.only` filtering, so it only contains tests that - * match the current invocation. It contains only the top-level projects being run — setup and dependency projects are - * not included and cannot be excluded from here. + * match the current invocation. Setup and dependency projects are readonly and cannot be excluded from here. * * The suite ignores the `--shard` argument: it always contains the full, un-sharded corpus. Playwright applies its * built-in sharding after diff --git a/tests/playwright-test/reporter-preprocess-suite.spec.ts b/tests/playwright-test/reporter-preprocess-suite.spec.ts index 7e2f16342851e..d9139a34c518d 100644 --- a/tests/playwright-test/reporter-preprocess-suite.spec.ts +++ b/tests/playwright-test/reporter-preprocess-suite.spec.ts @@ -392,15 +392,40 @@ test('multiple reporters declaring implementsSharding throws', async ({ runInlin expect(result.outputLines.join('\n')).toContain(`Multiple reporters declare 'implementsSharding'`); }); -test('plan.suite contains only top-level projects, not dependency/setup projects', async ({ runInlineTest }) => { +test('plan.suite exposes setup/teardown dependency projects but they are read-only', async ({ runInlineTest }) => { const result = await runInlineTest({ 'reporter.ts': ` class Reporter { async preprocessSuite(config, suite) { - // The suite only exposes top-level projects, so a reporter has no handle on - // setup/dependency project tests and therefore cannot exclude them. console.log('%% plan projects: ' + suite.suites.map(s => s.title).join(',')); console.log('%% plan tests: ' + suite.allTests().map(t => t.title).join(',')); + this.preprocessedTests = new Set(suite.allTests()); + const setupTest = suite.allTests().find(t => t.title === 'setup-test'); + for (const method of ['skip', 'fixme', 'fail', 'exclude']) { + try { + setupTest[method](); + console.log('%% dep-' + method + ': no-throw'); + } catch (e) { + console.log('%% dep-' + method + ': ' + e.message); + } + } + const setupProject = suite.suites.find(s => s.title === 'setup'); + try { + setupProject.exclude(); + console.log('%% dep-suite-exclude: no-throw'); + } catch (e) { + console.log('%% dep-suite-exclude: ' + e.message); + } + } + onBegin(config, suite) { + console.log('%% same test objects: ' + suite.allTests().every(test => this.preprocessedTests.has(test))); + const setupTest = suite.allTests().find(t => t.title === 'setup-test'); + try { + setupTest.skip(); + console.log('%% dep-after-preprocess: no-throw'); + } catch (e) { + console.log('%% dep-after-preprocess: ' + e.message); + } } onTestEnd(test, result) { console.log('%% ran ' + test.parent.project().name + '/' + test.title); @@ -412,7 +437,8 @@ test('plan.suite contains only top-level projects, not dependency/setup projects module.exports = { reporter: './reporter.ts', projects: [ - { name: 'setup', testMatch: /a\\.setup\\.ts/ }, + { name: 'setup', testMatch: /a\\.setup\\.ts/, teardown: 'teardown' }, + { name: 'teardown', testMatch: /a\\.teardown\\.ts/ }, { name: 'main', testMatch: /a\\.test\\.ts/, dependencies: ['setup'] }, ], }; @@ -421,6 +447,10 @@ test('plan.suite contains only top-level projects, not dependency/setup projects import { test } from '@playwright/test'; test('setup-test', async () => {}); `, + 'a.teardown.ts': ` + import { test } from '@playwright/test'; + test('teardown-test', async () => {}); + `, 'a.test.ts': ` import { test } from '@playwright/test'; test('main-test', async () => {}); @@ -428,11 +458,65 @@ test('plan.suite contains only top-level projects, not dependency/setup projects }, { reporter: '', workers: 1 }, undefined, { additionalArgs: ['--project=main'] }); expect(result.exitCode).toBe(0); - // plan only sees the top-level 'main' project; the 'setup' dependency is prepended afterwards. - expect(result.outputLines).toContain('plan projects: main'); - // 'setup-test' is absent from the plan suite, proving setup/dependency tests are not exposed. - expect(result.outputLines).toContain('plan tests: main-test'); - // Both the dependency and the main project still run. - expect(result.outputLines).toContain('ran setup/setup-test'); - expect(result.outputLines).toContain('ran main/main-test'); + expect(result.outputLines).toEqual([ + 'plan projects: teardown,setup,main', + 'plan tests: teardown-test,setup-test,main-test', + 'dep-skip: TestCase.skip() cannot be called on a setup or teardown project test; these always run in full.', + 'dep-fixme: TestCase.fixme() cannot be called on a setup or teardown project test; these always run in full.', + 'dep-fail: TestCase.fail() cannot be called on a setup or teardown project test; these always run in full.', + 'dep-exclude: TestCase.exclude() cannot be called on a setup or teardown project test; these always run in full.', + 'dep-suite-exclude: Suite.exclude() cannot be called on a setup or teardown project; these always run in full.', + 'same test objects: true', + 'dep-after-preprocess: TestCase.skip() can only be called from Reporter.preprocessSuite().', + 'ran setup/setup-test', + 'ran main/main-test', + 'ran teardown/teardown-test', + ]); +}); + +test('plan.suite temporarily exposes dependencies without changing final project selection', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'reporter.ts': ` + class Reporter { + async preprocessSuite(config, suite) { + console.log('%% plan projects: ' + suite.suites.map(suite => suite.title).join(',')); + suite.suites.find(suite => suite.title === 'main').exclude(); + } + onTestEnd(test, result) { + console.log('%% ran ' + test.parent.project().name + '/' + test.title); + } + } + module.exports = Reporter; + `, + 'playwright.config.ts': ` + module.exports = { + reporter: './reporter.ts', + projects: [ + { name: 'setup', testMatch: /setup\\.spec\\.ts/ }, + { name: 'main', testMatch: /main\\.spec\\.ts/, dependencies: ['setup'] }, + { name: 'keep', testMatch: /keep\\.spec\\.ts/ }, + ], + }; + `, + 'setup.spec.ts': ` + import { test, expect } from '@playwright/test'; + test('setup-test', async () => { + expect(1).toBe(2); + }); + `, + 'main.spec.ts': ` + import { test } from '@playwright/test'; + test('main-test', async () => {}); + `, + 'keep.spec.ts': ` + import { test } from '@playwright/test'; + test('keep-test', async () => {}); + `, + }, { reporter: '', workers: 1 }, undefined, { additionalArgs: ['setup.spec.ts', 'main.spec.ts', 'keep.spec.ts'] }); + + expect(result.exitCode).toBe(0); + expect(result.outputLines).toEqual([ + 'plan projects: setup,main,keep', + 'ran keep/keep-test', + ]); }); From 34bc4281a9fb9f8ca71dfd5621e9c30521f392f8 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Tue, 14 Jul 2026 11:48:22 +0200 Subject: [PATCH 3/5] fix(core): surface abort reasons in errors (#41752) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../playwright-core/src/server/dispatchers/dispatcher.ts | 2 +- packages/playwright-core/src/server/frames.ts | 5 +---- packages/playwright-core/src/server/progress.ts | 4 +++- tests/page/expect-timeout.spec.ts | 5 +++-- tests/page/page-click.spec.ts | 7 ++++--- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/playwright-core/src/server/dispatchers/dispatcher.ts b/packages/playwright-core/src/server/dispatchers/dispatcher.ts index 1cf7edeb70ac2..3bb60565fa7c5 100644 --- a/packages/playwright-core/src/server/dispatchers/dispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/dispatcher.ts @@ -312,7 +312,7 @@ export class DispatcherConnection { return; } if (method === '__abort__') { - await this._activeProgressControllers.get(`call@${params.id}`)?.abort(new AbortError(undefined, { cause: params.reason })); + await this._activeProgressControllers.get(`call@${params.id}`)?.abort(new AbortError(params.reason)); return; } if (!dispatcher) { diff --git a/packages/playwright-core/src/server/frames.ts b/packages/playwright-core/src/server/frames.ts index 363f7a4edb801..170843cfe6839 100644 --- a/packages/playwright-core/src/server/frames.ts +++ b/packages/playwright-core/src/server/frames.ts @@ -16,7 +16,6 @@ */ import yaml from 'yaml'; -import { assertionAbortedMessage } from '@isomorphic/abortSignal'; import { parseAriaSnapshotUnsafe } from '@isomorphic/ariaSnapshot'; import { isInvalidSelectorError } from '@isomorphic/selectorParser'; import { ManualPromise } from '@isomorphic/manualPromise'; @@ -29,7 +28,7 @@ import { makeWaitForNextTask } from '@utils/task'; import { createGuid } from '@utils/crypto'; import { BrowserContext } from './browserContext'; import * as dom from './dom'; -import { TimeoutError, AbortError, isTargetClosedError } from './errors'; +import { TimeoutError, isTargetClosedError } from './errors'; import { prepareFilesForUpload } from './fileUploadUtils'; import { FrameSelectors } from './frameSelectors'; import { helper } from './helper'; @@ -1546,8 +1545,6 @@ export class Frame extends SdkObject { progress.log(e.message); if (e instanceof TimeoutError) details.timedOut = true; - if (e instanceof AbortError) - details.customErrorMessage = assertionAbortedMessage(e.cause); throw new ExpectError(details); } } diff --git a/packages/playwright-core/src/server/progress.ts b/packages/playwright-core/src/server/progress.ts index 8e97ce83aa083..78d3298257238 100644 --- a/packages/playwright-core/src/server/progress.ts +++ b/packages/playwright-core/src/server/progress.ts @@ -62,14 +62,16 @@ export class ProgressController { }); } - async abort(error: Error) { + const logMessage = `operation was aborted: ${error.message}`; if (this._state === 'running') { + this.metadata.log.push(logMessage); (error as any)[kAbortErrorSymbol] = true; this._state = { error }; this._forceAbortPromise.reject(error); this._controller.abort(error); } else if (this._state === 'before') { + this.metadata.log.push(logMessage); (error as any)[kAbortErrorSymbol] = true; this._pendingAbortError = error; } diff --git a/tests/page/expect-timeout.spec.ts b/tests/page/expect-timeout.spec.ts index 6615cbbc46a89..6753716a1c25b 100644 --- a/tests/page/expect-timeout.spec.ts +++ b/tests/page/expect-timeout.spec.ts @@ -133,11 +133,12 @@ test('should fail like a timeout when the signal is aborted mid-assertion', asyn Locator: locator('span') Expected: visible -Error: The assertion was aborted: stop it +Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - - waiting for locator('span')`); + - waiting for locator('span') + - operation was aborted: stop it`); }); test('should fail like a timeout when toHaveText is aborted mid-assertion', async ({ page }) => { diff --git a/tests/page/page-click.spec.ts b/tests/page/page-click.spec.ts index 8649e738ac1e8..30416d9dd3a5b 100644 --- a/tests/page/page-click.spec.ts +++ b/tests/page/page-click.spec.ts @@ -1368,11 +1368,11 @@ it('should abort via signal', async ({ page }) => { // Give the action time to start and emit call log entries before aborting. await page.waitForTimeout(500); - const reason = new Error('Aborted by user'); + const reason = new Error('foo bar'); controller.abort(reason); const error = await promise; - expect(error.message).toContain('The operation was aborted'); - expect(error.message).toContain(`Call log:`); + expect(error.message).toContain('locator.click: foo bar'); + expect(error.message).toMatch(/Call log:[\s\S]*operation was aborted: foo bar/); expect(error.name).toBe('AbortError'); expect(error.cause).toBe(reason); }); @@ -1384,6 +1384,7 @@ it('should throw an Error when aborted in-flight with a string reason', async ({ controller.abort('aborted by user'); const error = await promise.catch(e => e); expect(error).toBeInstanceOf(Error); + expect(error.message).toContain('locator.click: aborted by user'); expect(error.name).toBe('AbortError'); expect(error.cause).toBe('aborted by user'); }); From a553b746e846eb2b5efb5749c43ddbf43da1eaba Mon Sep 17 00:00:00 2001 From: "microsoft-playwright-automation[bot]" <203992400+microsoft-playwright-automation[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:14:44 +0100 Subject: [PATCH 4/5] feat(webkit): roll to r2330 (#41763) Co-authored-by: microsoft-playwright-automation[bot] <203992400+microsoft-playwright-automation[bot]@users.noreply.github.com> --- packages/playwright-core/browsers.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playwright-core/browsers.json b/packages/playwright-core/browsers.json index 71727eeb6aec2..61cbde26a3ec7 100644 --- a/packages/playwright-core/browsers.json +++ b/packages/playwright-core/browsers.json @@ -45,7 +45,7 @@ }, { "name": "webkit", - "revision": "2328", + "revision": "2330", "installByDefault": true, "revisionOverrides": { "mac14": "2251", From f584135f51c16e0220313bf6bd6e54fb1a135bc0 Mon Sep 17 00:00:00 2001 From: "microsoft-playwright-automation[bot]" <203992400+microsoft-playwright-automation[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:17:36 +0100 Subject: [PATCH 5/5] test: roll stable-test-runner to 1.62.0-alpha-2026-07-13 (#41753) Co-authored-by: microsoft-playwright-automation[bot] <203992400+microsoft-playwright-automation[bot]@users.noreply.github.com> --- .../stable-test-runner/package-lock.json | 24 +++++++++---------- .../stable-test-runner/package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/playwright-test/stable-test-runner/package-lock.json b/tests/playwright-test/stable-test-runner/package-lock.json index 052d2f9a2612a..49ea9b11cd10a 100644 --- a/tests/playwright-test/stable-test-runner/package-lock.json +++ b/tests/playwright-test/stable-test-runner/package-lock.json @@ -5,16 +5,16 @@ "packages": { "": { "dependencies": { - "@playwright/test": "^1.62.0-alpha-2026-07-06" + "@playwright/test": "^1.62.0-alpha-2026-07-13" } }, "node_modules/@playwright/test": { - "version": "1.62.0-alpha-2026-07-06", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.0-alpha-2026-07-06.tgz", - "integrity": "sha512-tNsihJtAWjTsDy/O+UyTMAaGnPCEb+tuynXS6kD1XKis8HXpeG0aq0AC8LgIjsnN4hFSrLuTD1vpWmJ5HUoLiQ==", + "version": "1.62.0-alpha-2026-07-13", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.0-alpha-2026-07-13.tgz", + "integrity": "sha512-hXwzo/vFwJjcUl7up6ARuc1BXkWHcJl28JIkmizbRCqj3f0FPVLlaru1Ov3Eh+pITLVh6sv1W3RAqA8W4+9q7A==", "license": "Apache-2.0", "dependencies": { - "playwright": "1.62.0-alpha-2026-07-06" + "playwright": "1.62.0-alpha-2026-07-13" }, "bin": { "playwright": "cli.js" @@ -38,12 +38,12 @@ } }, "node_modules/playwright": { - "version": "1.62.0-alpha-2026-07-06", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.0-alpha-2026-07-06.tgz", - "integrity": "sha512-M8JUIAGzM8hRbtmoS8GIirVowegGdYadarL5piCeJA+4JkPwmZkyQnvR/T1LZQBb/eq66p+K1H71D2jGzaIBkQ==", + "version": "1.62.0-alpha-2026-07-13", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.0-alpha-2026-07-13.tgz", + "integrity": "sha512-ddzhR5k8rI5VnPxzrLENDZaf4JX5RVtBB5XoWcMEC8paVEyg7HziRTnW8pxfjObiwMttuuAjTfamkiVxEh50vg==", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.62.0-alpha-2026-07-06" + "playwright-core": "1.62.0-alpha-2026-07-13" }, "bin": { "playwright": "cli.js" @@ -56,9 +56,9 @@ } }, "node_modules/playwright-core": { - "version": "1.62.0-alpha-2026-07-06", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.0-alpha-2026-07-06.tgz", - "integrity": "sha512-kHvSsUXFy2VsU6AZQTY+5vj/1ZytyoYV9b7PTwu2Bv+Lt2IGs97iRC1fsVwIlBIpRDd/mO/B1FWuK6fEWU7hBQ==", + "version": "1.62.0-alpha-2026-07-13", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.0-alpha-2026-07-13.tgz", + "integrity": "sha512-N9RL+OvjdgsagiP/SZVW7raWT9htr8sgNloP8AemhtBT8c4nMabDSWkRjJHjkjYGyIBzley7UbA4nqEsbEvMMQ==", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" diff --git a/tests/playwright-test/stable-test-runner/package.json b/tests/playwright-test/stable-test-runner/package.json index 5b483b3ba3d44..5dee430b3c940 100644 --- a/tests/playwright-test/stable-test-runner/package.json +++ b/tests/playwright-test/stable-test-runner/package.json @@ -1,6 +1,6 @@ { "private": true, "dependencies": { - "@playwright/test": "^1.62.0-alpha-2026-07-06" + "@playwright/test": "^1.62.0-alpha-2026-07-13" } }