diff --git a/.github/workflows/tests_bidi.yml b/.github/workflows/tests_bidi.yml index 8224d24883..34af9e7096 100644 --- a/.github/workflows/tests_bidi.yml +++ b/.github/workflows/tests_bidi.yml @@ -26,7 +26,7 @@ jobs: strategy: fail-fast: false matrix: - channel: [bidi-chromium, bidi-firefox-beta] + channel: [bidi-chromium, bidi-firefox-nightly] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -38,8 +38,8 @@ jobs: - run: npm run build - run: npx playwright install --with-deps chromium if: matrix.channel == 'bidi-chromium' - - run: npx -y @puppeteer/browsers install firefox@beta - if: matrix.channel == 'bidi-firefox-beta' + - run: npx -y @puppeteer/browsers install firefox@nightly + if: matrix.channel == 'bidi-firefox-nightly' - name: Run tests run: xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run biditest -- --project=${{ matrix.channel }}* env: diff --git a/packages/playwright-core/src/cli/program.ts b/packages/playwright-core/src/cli/program.ts index fb27b14231..1895f2dfcf 100644 --- a/packages/playwright-core/src/cli/program.ts +++ b/packages/playwright-core/src/cli/program.ts @@ -397,7 +397,7 @@ async function launchContext(options: Options, extraOptions: LaunchOptions): Pro process.stdout.write('\n-------------8<-------------\n'); const autoExitCondition = process.env.PWTEST_CLI_AUTO_EXIT_WHEN; if (autoExitCondition && text.includes(autoExitCondition)) - Promise.all(context.pages().map(async p => p.close())); + closeBrowser(); }; // Make sure we exit abnormally when browser crashes. const logs: string[] = []; @@ -504,7 +504,7 @@ async function launchContext(options: Options, extraOptions: LaunchOptions): Pro if (hasPage) return; // Avoid the error when the last page is closed because the browser has been closed. - closeBrowser().catch(e => null); + closeBrowser().catch(() => {}); }); }); process.on('SIGINT', async () => { @@ -560,7 +560,7 @@ async function open(options: Options, url: string | undefined, language: string) async function codegen(options: Options & { target: string, output?: string, testIdAttribute?: string }, url: string | undefined) { const { target: language, output: outputFile, testIdAttribute: testIdAttributeName } = options; - const tracesDir = path.join(os.tmpdir(), `recorder-trace-${Date.now()}`); + const tracesDir = path.join(os.tmpdir(), `playwright-recorder-trace-${Date.now()}`); const { context, launchOptions, contextOptions } = await launchContext(options, { headless: !!process.env.PWTEST_CLI_HEADLESS, executablePath: process.env.PWTEST_CLI_EXECUTABLE_PATH, @@ -574,6 +574,7 @@ async function codegen(options: Options & { target: string, output?: string, tes device: options.device, saveStorage: options.saveStorage, mode: 'recording', + codegenMode: process.env.PW_RECORDER_IS_TRACE_VIEWER ? 'trace-events' : 'actions', testIdAttributeName, outputFile: outputFile ? path.resolve(outputFile) : undefined, }); diff --git a/packages/playwright-core/src/client/browserContext.ts b/packages/playwright-core/src/client/browserContext.ts index 6b3de08c8e..72ef29d6a6 100644 --- a/packages/playwright-core/src/client/browserContext.ts +++ b/packages/playwright-core/src/client/browserContext.ts @@ -220,7 +220,7 @@ export class BrowserContext extends ChannelOwner } // If the page is closed or unrouteAll() was called without waiting and interception disabled, // the method will throw an error - silence it. - await route._innerContinue(true).catch(() => {}); + await route._innerContinue(true /* isFallback */).catch(() => {}); } async _onWebSocketRoute(webSocketRoute: network.WebSocketRoute) { @@ -492,17 +492,8 @@ export class BrowserContext extends ChannelOwner await this._closedPromise; } - async _enableRecorder(params: { - language: string, - launchOptions?: LaunchOptions, - contextOptions?: BrowserContextOptions, - device?: string, - saveStorage?: string, - mode?: 'recording' | 'inspecting', - testIdAttributeName?: string, - outputFile?: string, - }) { - await this._channel.recorderSupplementEnable(params); + async _enableRecorder(params: channels.BrowserContextEnableRecorderParams) { + await this._channel.enableRecorder(params); } } diff --git a/packages/playwright-core/src/client/channelOwner.ts b/packages/playwright-core/src/client/channelOwner.ts index abe1cbf254..89f3edced3 100644 --- a/packages/playwright-core/src/client/channelOwner.ts +++ b/packages/playwright-core/src/client/channelOwner.ts @@ -40,6 +40,7 @@ export abstract class ChannelOwner = new Map(); + private _isInternalType = false; _wasCollected: boolean = false; constructor(parent: ChannelOwner | Connection, type: string, guid: string, initializer: channels.InitializerTraits) { @@ -61,6 +62,10 @@ export abstract class ChannelOwner) { this._eventToSubscriptionMapping = mapping; } @@ -173,7 +178,7 @@ export abstract class ChannelOwner { constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.LocalUtilsInitializer) { super(parent, type, guid, initializer); + this.markAsInternalType(); this.devices = {}; for (const { name, descriptor } of initializer.deviceDescriptors) this.devices[name] = descriptor; diff --git a/packages/playwright-core/src/client/network.ts b/packages/playwright-core/src/client/network.ts index 98d4fe7554..85bec1bf8d 100644 --- a/packages/playwright-core/src/client/network.ts +++ b/packages/playwright-core/src/client/network.ts @@ -299,6 +299,7 @@ export class Route extends ChannelOwner implements api.Ro constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.RouteInitializer) { super(parent, type, guid, initializer); + this.markAsInternalType(); } request(): Request { @@ -325,7 +326,7 @@ export class Route extends ChannelOwner implements api.Ro async abort(errorCode?: string) { await this._handleRoute(async () => { - await this._raceWithTargetClose(this._channel.abort({ requestUrl: this.request()._initializer.url, errorCode })); + await this._raceWithTargetClose(this._channel.abort({ errorCode })); }); } @@ -409,7 +410,6 @@ export class Route extends ChannelOwner implements api.Ro headers['content-length'] = String(length); await this._raceWithTargetClose(this._channel.fulfill({ - requestUrl: this.request()._initializer.url, status: statusOption || 200, headers: headersObjectToArray(headers), body, @@ -421,7 +421,7 @@ export class Route extends ChannelOwner implements api.Ro async continue(options: FallbackOverrides = {}) { await this._handleRoute(async () => { this.request()._applyFallbackOverrides(options); - await this._innerContinue(); + await this._innerContinue(false /* isFallback */); }); } @@ -436,18 +436,15 @@ export class Route extends ChannelOwner implements api.Ro chain.resolve(done); } - async _innerContinue(internal = false) { + async _innerContinue(isFallback: boolean) { const options = this.request()._fallbackOverridesForContinue(); - return await this._wrapApiCall(async () => { - await this._raceWithTargetClose(this._channel.continue({ - requestUrl: this.request()._initializer.url, - url: options.url, - method: options.method, - headers: options.headers ? headersObjectToArray(options.headers) : undefined, - postData: options.postDataBuffer, - isFallback: internal, - })); - }, !!internal); + return await this._raceWithTargetClose(this._channel.continue({ + url: options.url, + method: options.method, + headers: options.headers ? headersObjectToArray(options.headers) : undefined, + postData: options.postDataBuffer, + isFallback, + })); } } diff --git a/packages/playwright-core/src/client/tracing.ts b/packages/playwright-core/src/client/tracing.ts index 7330cd9f26..b5c411cc65 100644 --- a/packages/playwright-core/src/client/tracing.ts +++ b/packages/playwright-core/src/client/tracing.ts @@ -31,20 +31,18 @@ export class Tracing extends ChannelOwner implements ap constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.TracingInitializer) { super(parent, type, guid, initializer); + this.markAsInternalType(); } async start(options: { name?: string, title?: string, snapshots?: boolean, screenshots?: boolean, sources?: boolean, _live?: boolean } = {}) { this._includeSources = !!options.sources; - const traceName = await this._wrapApiCall(async () => { - await this._channel.tracingStart({ - name: options.name, - snapshots: options.snapshots, - screenshots: options.screenshots, - live: options._live, - }); - const response = await this._channel.tracingStartChunk({ name: options.name, title: options.title }); - return response.traceName; - }, true); + await this._channel.tracingStart({ + name: options.name, + snapshots: options.snapshots, + screenshots: options.screenshots, + live: options._live, + }); + const { traceName } = await this._channel.tracingStartChunk({ name: options.name, title: options.title }); await this._startCollectingStacks(traceName); } @@ -63,16 +61,12 @@ export class Tracing extends ChannelOwner implements ap } async stopChunk(options: { path?: string } = {}) { - await this._wrapApiCall(async () => { - await this._doStopChunk(options.path); - }, true); + await this._doStopChunk(options.path); } async stop(options: { path?: string } = {}) { - await this._wrapApiCall(async () => { - await this._doStopChunk(options.path); - await this._channel.tracingStop(); - }, true); + await this._doStopChunk(options.path); + await this._channel.tracingStop(); } private async _doStopChunk(filePath: string | undefined) { diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index dcf0433b1c..9b36ad8883 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -965,9 +965,10 @@ scheme.BrowserContextStorageStateResult = tObject({ }); scheme.BrowserContextPauseParams = tOptional(tObject({})); scheme.BrowserContextPauseResult = tOptional(tObject({})); -scheme.BrowserContextRecorderSupplementEnableParams = tObject({ +scheme.BrowserContextEnableRecorderParams = tObject({ language: tOptional(tString), mode: tOptional(tEnum(['inspecting', 'recording'])), + codegenMode: tOptional(tEnum(['actions', 'trace-events'])), pauseOnNextStatement: tOptional(tBoolean), testIdAttributeName: tOptional(tString), launchOptions: tOptional(tAny), @@ -977,7 +978,7 @@ scheme.BrowserContextRecorderSupplementEnableParams = tObject({ outputFile: tOptional(tString), omitCallTracking: tOptional(tBoolean), }); -scheme.BrowserContextRecorderSupplementEnableResult = tOptional(tObject({})); +scheme.BrowserContextEnableRecorderResult = tOptional(tObject({})); scheme.BrowserContextNewCDPSessionParams = tObject({ page: tOptional(tChannel(['Page'])), frame: tOptional(tChannel(['Frame'])), @@ -2115,7 +2116,6 @@ scheme.RouteRedirectNavigationRequestParams = tObject({ scheme.RouteRedirectNavigationRequestResult = tOptional(tObject({})); scheme.RouteAbortParams = tObject({ errorCode: tOptional(tString), - requestUrl: tString, }); scheme.RouteAbortResult = tOptional(tObject({})); scheme.RouteContinueParams = tObject({ @@ -2123,7 +2123,6 @@ scheme.RouteContinueParams = tObject({ method: tOptional(tString), headers: tOptional(tArray(tType('NameValue'))), postData: tOptional(tBinary), - requestUrl: tString, isFallback: tBoolean, }); scheme.RouteContinueResult = tOptional(tObject({})); @@ -2133,7 +2132,6 @@ scheme.RouteFulfillParams = tObject({ body: tOptional(tString), isBase64: tOptional(tBoolean), fetchResponseUid: tOptional(tString), - requestUrl: tString, }); scheme.RouteFulfillResult = tOptional(tObject({})); scheme.WebSocketRouteInitializer = tObject({ diff --git a/packages/playwright-core/src/server/browserContext.ts b/packages/playwright-core/src/server/browserContext.ts index 499356ca49..025bd0f388 100644 --- a/packages/playwright-core/src/server/browserContext.ts +++ b/packages/playwright-core/src/server/browserContext.ts @@ -131,15 +131,15 @@ export abstract class BrowserContext extends SdkObject { // When PWDEBUG=1, show inspector for each context. if (debugMode() === 'inspector') - await Recorder.show(this, RecorderApp.factory(this), { pauseOnNextStatement: true }); + await Recorder.show('actions', this, RecorderApp.factory(this), { pauseOnNextStatement: true }); // When paused, show inspector. if (this._debugger.isPaused()) - Recorder.showInspector(this, RecorderApp.factory(this)); + Recorder.showInspectorNoReply(this, RecorderApp.factory(this)); this._debugger.on(Debugger.Events.PausedStateChanged, () => { if (this._debugger.isPaused()) - Recorder.showInspector(this, RecorderApp.factory(this)); + Recorder.showInspectorNoReply(this, RecorderApp.factory(this)); }); if (debugMode() === 'console') @@ -525,7 +525,7 @@ export abstract class BrowserContext extends SdkObject { const internalMetadata = serverSideCallMetadata(); const page = await this.newPage(internalMetadata); await page._setServerRequestInterceptor(handler => { - handler.fulfill({ body: '', requestUrl: handler.request().url() }).catch(() => {}); + handler.fulfill({ body: '' }).catch(() => {}); return true; }); for (const origin of originsToSave) { @@ -559,7 +559,7 @@ export abstract class BrowserContext extends SdkObject { isServerSide: false, }); await page._setServerRequestInterceptor(handler => { - handler.fulfill({ body: '', requestUrl: handler.request().url() }).catch(() => {}); + handler.fulfill({ body: '' }).catch(() => {}); return true; }); @@ -594,7 +594,7 @@ export abstract class BrowserContext extends SdkObject { const internalMetadata = serverSideCallMetadata(); const page = await this.newPage(internalMetadata); await page._setServerRequestInterceptor(handler => { - handler.fulfill({ body: '', requestUrl: handler.request().url() }).catch(() => {}); + handler.fulfill({ body: '' }).catch(() => {}); return true; }); for (const originState of state.origins) { diff --git a/packages/playwright-core/src/server/debugController.ts b/packages/playwright-core/src/server/debugController.ts index 2a950d7c6a..53c6c3d99e 100644 --- a/packages/playwright-core/src/server/debugController.ts +++ b/packages/playwright-core/src/server/debugController.ts @@ -197,7 +197,7 @@ export class DebugController extends SdkObject { const contexts = new Set(); for (const page of this._playwright.allPages()) contexts.add(page.context()); - const result = await Promise.all([...contexts].map(c => Recorder.show(c, () => Promise.resolve(new InspectingRecorderApp(this)), { omitCallTracking: true }))); + const result = await Promise.all([...contexts].map(c => Recorder.showInspector(c, { omitCallTracking: true }, () => Promise.resolve(new InspectingRecorderApp(this))))); return result.filter(Boolean) as Recorder[]; } diff --git a/packages/playwright-core/src/server/dialog.ts b/packages/playwright-core/src/server/dialog.ts index 51dcfc2fc9..f0793d43fb 100644 --- a/packages/playwright-core/src/server/dialog.ts +++ b/packages/playwright-core/src/server/dialog.ts @@ -39,6 +39,7 @@ export class Dialog extends SdkObject { this._onHandle = onHandle; this._defaultValue = defaultValue || ''; this._page._frameManager.dialogDidOpen(this); + this.instrumentation.onDialog(this); } page() { diff --git a/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts b/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts index ae0b722dfc..c6ffce49f7 100644 --- a/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts @@ -41,7 +41,6 @@ import { serializeError } from '../errors'; import { ElementHandleDispatcher } from './elementHandlerDispatcher'; import { RecorderInTraceViewer } from '../recorder/recorderInTraceViewer'; import { RecorderApp } from '../recorder/recorderApp'; -import type { IRecorderAppFactory } from '../recorder/recorderFrontend'; import { WebSocketRouteDispatcher } from './webSocketRouteDispatcher'; export class BrowserContextDispatcher extends Dispatcher implements channels.BrowserContextChannel { @@ -301,21 +300,18 @@ export class BrowserContextDispatcher extends Dispatcher { - let factory: IRecorderAppFactory; - if (process.env.PW_RECORDER_IS_TRACE_VIEWER) { - factory = RecorderInTraceViewer.factory(this._context); + async enableRecorder(params: channels.BrowserContextEnableRecorderParams): Promise { + if (params.codegenMode === 'trace-events') { await this._context.tracing.start({ name: 'trace', snapshots: true, - screenshots: false, + screenshots: true, live: true, }); - await this._context.tracing.startChunk({ name: 'trace', title: 'trace' }); + await Recorder.show('trace-events', this._context, RecorderInTraceViewer.factory(this._context), params); } else { - factory = RecorderApp.factory(this._context); + await Recorder.show('actions', this._context, RecorderApp.factory(this._context), params); } - await Recorder.show(this._context, factory, params); } async pause(params: channels.BrowserContextPauseParams, metadata: CallMetadata) { diff --git a/packages/playwright-core/src/server/download.ts b/packages/playwright-core/src/server/download.ts index f7a92c8c7d..78a9c015dc 100644 --- a/packages/playwright-core/src/server/download.ts +++ b/packages/playwright-core/src/server/download.ts @@ -35,16 +35,25 @@ export class Download { this._suggestedFilename = suggestedFilename; page._browserContext._downloads.add(this); if (suggestedFilename !== undefined) - this._page.emit(Page.Events.Download, this); + this._fireDownloadEvent(); + } + + page(): Page { + return this._page; } _filenameSuggested(suggestedFilename: string) { assert(this._suggestedFilename === undefined); this._suggestedFilename = suggestedFilename; - this._page.emit(Page.Events.Download, this); + this._fireDownloadEvent(); } suggestedFilename(): string { return this._suggestedFilename!; } + + private _fireDownloadEvent() { + this._page.instrumentation.onDownload(this._page, this); + this._page.emit(Page.Events.Download, this); + } } diff --git a/packages/playwright-core/src/server/instrumentation.ts b/packages/playwright-core/src/server/instrumentation.ts index b4628ac904..4d29be0284 100644 --- a/packages/playwright-core/src/server/instrumentation.ts +++ b/packages/playwright-core/src/server/instrumentation.ts @@ -35,6 +35,8 @@ export type Attribution = { }; import type { CallMetadata } from '@protocol/callMetadata'; +import type { Dialog } from './dialog'; +import type { Download } from './download'; export type { CallMetadata } from '@protocol/callMetadata'; export class SdkObject extends EventEmitter { @@ -62,6 +64,8 @@ export interface Instrumentation { onPageClose(page: Page): void; onBrowserOpen(browser: Browser): void; onBrowserClose(browser: Browser): void; + onDialog(dialog: Dialog): void; + onDownload(page: Page, download: Download): void; } export interface InstrumentationListener { @@ -73,6 +77,8 @@ export interface InstrumentationListener { onPageClose?(page: Page): void; onBrowserOpen?(browser: Browser): void; onBrowserClose?(browser: Browser): void; + onDialog?(dialog: Dialog): void; + onDownload?(page: Page, download: Download): void; } export function createInstrumentation(): Instrumentation { diff --git a/packages/playwright-core/src/server/recorder.ts b/packages/playwright-core/src/server/recorder.ts index ddaa035811..19776c8a29 100644 --- a/packages/playwright-core/src/server/recorder.ts +++ b/packages/playwright-core/src/server/recorder.ts @@ -45,32 +45,35 @@ export class Recorder implements InstrumentationListener, IRecorder { private _omitCallTracking = false; private _currentLanguage: Language; - static showInspector(context: BrowserContext, recorderAppFactory: IRecorderAppFactory) { - const params: channels.BrowserContextRecorderSupplementEnableParams = {}; + static async showInspector(context: BrowserContext, params: channels.BrowserContextEnableRecorderParams, recorderAppFactory: IRecorderAppFactory) { if (isUnderTest()) params.language = process.env.TEST_INSPECTOR_LANGUAGE; - Recorder.show(context, recorderAppFactory, params).catch(() => {}); + return await Recorder.show('actions', context, recorderAppFactory, params); } - static show(context: BrowserContext, recorderAppFactory: IRecorderAppFactory, params: channels.BrowserContextRecorderSupplementEnableParams = {}): Promise { + static showInspectorNoReply(context: BrowserContext, recorderAppFactory: IRecorderAppFactory) { + Recorder.showInspector(context, {}, recorderAppFactory).catch(() => {}); + } + + static show(codegenMode: 'actions' | 'trace-events', context: BrowserContext, recorderAppFactory: IRecorderAppFactory, params: channels.BrowserContextEnableRecorderParams): Promise { let recorderPromise = (context as any)[recorderSymbol] as Promise; if (!recorderPromise) { - recorderPromise = Recorder._create(context, recorderAppFactory, params); + recorderPromise = Recorder._create(codegenMode, context, recorderAppFactory, params); (context as any)[recorderSymbol] = recorderPromise; } return recorderPromise; } - private static async _create(context: BrowserContext, recorderAppFactory: IRecorderAppFactory, params: channels.BrowserContextRecorderSupplementEnableParams = {}): Promise { - const recorder = new Recorder(context, params); + private static async _create(codegenMode: 'actions' | 'trace-events', context: BrowserContext, recorderAppFactory: IRecorderAppFactory, params: channels.BrowserContextEnableRecorderParams = {}): Promise { + const recorder = new Recorder(codegenMode, context, params); const recorderApp = await recorderAppFactory(recorder); await recorder._install(recorderApp); return recorder; } - constructor(context: BrowserContext, params: channels.BrowserContextRecorderSupplementEnableParams) { + constructor(codegenMode: 'actions' | 'trace-events', context: BrowserContext, params: channels.BrowserContextEnableRecorderParams) { this._mode = params.mode || 'none'; - this._contextRecorder = new ContextRecorder(context, params, {}); + this._contextRecorder = new ContextRecorder(codegenMode, context, params, {}); this._context = context; this._omitCallTracking = !!params.omitCallTracking; this._debugger = context.debugger(); diff --git a/packages/playwright-core/src/server/recorder/contextRecorder.ts b/packages/playwright-core/src/server/recorder/contextRecorder.ts index 856305f300..dc38866167 100644 --- a/packages/playwright-core/src/server/recorder/contextRecorder.ts +++ b/packages/playwright-core/src/server/recorder/contextRecorder.ts @@ -48,14 +48,14 @@ export class ContextRecorder extends EventEmitter { private _lastDialogOrdinal = -1; private _lastDownloadOrdinal = -1; private _context: BrowserContext; - private _params: channels.BrowserContextRecorderSupplementEnableParams; + private _params: channels.BrowserContextEnableRecorderParams; private _delegate: ContextRecorderDelegate; private _recorderSources: Source[]; private _throttledOutputFile: ThrottledFile | null = null; private _orderedLanguages: LanguageGenerator[] = []; private _listeners: RegisteredListener[] = []; - constructor(context: BrowserContext, params: channels.BrowserContextRecorderSupplementEnableParams, delegate: ContextRecorderDelegate) { + constructor(codegenMode: 'actions' | 'trace-events', context: BrowserContext, params: channels.BrowserContextEnableRecorderParams, delegate: ContextRecorderDelegate) { super(); this._context = context; this._params = params; @@ -73,8 +73,8 @@ export class ContextRecorder extends EventEmitter { saveStorage: params.saveStorage, }; - const collection = new RecorderCollection(context, this._pageAliases, params.mode === 'recording'); - collection.on('change', (actions: ActionInContext[]) => { + this._collection = new RecorderCollection(codegenMode, context, this._pageAliases); + this._collection.on('change', (actions: ActionInContext[]) => { this._recorderSources = []; for (const languageGenerator of this._orderedLanguages) { const { header, footer, actionTexts, text } = generateCode(actions, languageGenerator, languageGeneratorOptions); @@ -103,7 +103,7 @@ export class ContextRecorder extends EventEmitter { this._listeners.push(eventsHelper.addEventListener(process, 'exit', () => { this._throttledOutputFile?.flush(); })); - this._collection = collection; + this.setEnabled(true); } setOutput(codegenId: string, outputFile?: string) { @@ -145,6 +145,10 @@ export class ContextRecorder extends EventEmitter { setEnabled(enabled: boolean) { this._collection.setEnabled(enabled); + if (enabled) + this._context.tracing.startChunk({ name: 'trace', title: 'trace' }).catch(() => {}); + else + this._context.tracing.stopChunk({ mode: 'discard' }).catch(() => {}); } dispose() { diff --git a/packages/playwright-core/src/server/recorder/recorderApp.ts b/packages/playwright-core/src/server/recorder/recorderApp.ts index c7120ef408..41c92a3198 100644 --- a/packages/playwright-core/src/server/recorder/recorderApp.ts +++ b/packages/playwright-core/src/server/recorder/recorderApp.ts @@ -81,7 +81,6 @@ export class RecorderApp extends EventEmitter implements IRecorderApp { const file = require.resolve('../../vite/recorder/' + uri); fs.promises.readFile(file).then(buffer => { route.fulfill({ - requestUrl: route.request().url(), status: 200, headers: [ { name: 'Content-Type', value: mime.getType(path.extname(file)) || 'application/octet-stream' } @@ -162,8 +161,10 @@ export class RecorderApp extends EventEmitter implements IRecorderApp { }).toString(), { isFunction: true }, sources).catch(() => {}); // Testing harness for runCLI mode. - if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) - (process as any)._didSetSourcesForTest(sources[0].text); + if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) { + if ((process as any)._didSetSourcesForTest(sources[0].text)) + this.close(); + } } async setSelector(selector: string, userGesture?: boolean): Promise { diff --git a/packages/playwright-core/src/server/recorder/recorderCollection.ts b/packages/playwright-core/src/server/recorder/recorderCollection.ts index 5b0d0b5b9e..1706de39ee 100644 --- a/packages/playwright-core/src/server/recorder/recorderCollection.ts +++ b/packages/playwright-core/src/server/recorder/recorderCollection.ts @@ -29,17 +29,16 @@ import type { BrowserContext } from '../browserContext'; export class RecorderCollection extends EventEmitter { private _actions: ActionInContext[] = []; - private _enabled: boolean; + private _enabled = false; private _pageAliases: Map; private _context: BrowserContext; - constructor(context: BrowserContext, pageAliases: Map, enabled: boolean) { + constructor(codegenMode: 'actions' | 'trace-events', context: BrowserContext, pageAliases: Map) { super(); this._context = context; - this._enabled = enabled; this._pageAliases = pageAliases; - if (process.env.PW_RECORDER_IS_TRACE_VIEWER) { + if (codegenMode === 'trace-events') { this._context.tracing.onMemoryEvents(events => { this._actions = traceEventsToAction(events); this._fireChange(); diff --git a/packages/playwright-core/src/server/recorder/recorderInTraceViewer.ts b/packages/playwright-core/src/server/recorder/recorderInTraceViewer.ts index 8f08b969e1..8da0896497 100644 --- a/packages/playwright-core/src/server/recorder/recorderInTraceViewer.ts +++ b/packages/playwright-core/src/server/recorder/recorderInTraceViewer.ts @@ -21,77 +21,97 @@ import type { IRecorder, IRecorderApp, IRecorderAppFactory } from './recorderFro import { installRootRedirect, openTraceViewerApp, startTraceViewerServer } from '../trace/viewer/traceViewer'; import type { TraceViewerServerOptions } from '../trace/viewer/traceViewer'; import type { BrowserContext } from '../browserContext'; -import { gracefullyProcessExitDoNotHang } from '../../utils/processLauncher'; -import type { Transport } from '../../utils/httpServer'; +import type { HttpServer, Transport } from '../../utils/httpServer'; +import type { Page } from '../page'; +import { ManualPromise } from '../../utils/manualPromise'; export class RecorderInTraceViewer extends EventEmitter implements IRecorderApp { readonly wsEndpointForTest: string | undefined; - private _recorder: IRecorder; - private _transport: Transport; + private _transport: RecorderTransport; + private _tracePage: Page; + private _traceServer: HttpServer; static factory(context: BrowserContext): IRecorderAppFactory { return async (recorder: IRecorder) => { const transport = new RecorderTransport(); const trace = path.join(context._browser.options.tracesDir, 'trace'); - const wsEndpointForTest = await openApp(trace, { transport, headless: !context._browser.options.headful }); - return new RecorderInTraceViewer(context, recorder, transport, wsEndpointForTest); + const { wsEndpointForTest, tracePage, traceServer } = await openApp(trace, { transport, headless: !context._browser.options.headful }); + return new RecorderInTraceViewer(transport, tracePage, traceServer, wsEndpointForTest); }; } - constructor(context: BrowserContext, recorder: IRecorder, transport: Transport, wsEndpointForTest: string | undefined) { + constructor(transport: RecorderTransport, tracePage: Page, traceServer: HttpServer, wsEndpointForTest: string | undefined) { super(); - this._recorder = recorder; this._transport = transport; + this._tracePage = tracePage; + this._traceServer = traceServer; this.wsEndpointForTest = wsEndpointForTest; + this._tracePage.once('close', () => { + this.close(); + }); } async close(): Promise { - this._transport.sendEvent?.('close', {}); + await this._tracePage.context().close({ reason: 'Recorder window closed' }); + await this._traceServer.stop(); } async setPaused(paused: boolean): Promise { - this._transport.sendEvent?.('setPaused', { paused }); + this._transport.deliverEvent('setPaused', { paused }); } async setMode(mode: Mode): Promise { - this._transport.sendEvent?.('setMode', { mode }); + this._transport.deliverEvent('setMode', { mode }); } async setFile(file: string): Promise { - this._transport.sendEvent?.('setFileIfNeeded', { file }); + this._transport.deliverEvent('setFileIfNeeded', { file }); } async setSelector(selector: string, userGesture?: boolean): Promise { - this._transport.sendEvent?.('setSelector', { selector, userGesture }); + this._transport.deliverEvent('setSelector', { selector, userGesture }); } async updateCallLogs(callLogs: CallLog[]): Promise { - this._transport.sendEvent?.('updateCallLogs', { callLogs }); + this._transport.deliverEvent('updateCallLogs', { callLogs }); } async setSources(sources: Source[]): Promise { - this._transport.sendEvent?.('setSources', { sources }); + this._transport.deliverEvent('setSources', { sources }); + if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) { + if ((process as any)._didSetSourcesForTest(sources[0].text)) + this.close(); + } } } -async function openApp(trace: string, options?: TraceViewerServerOptions & { headless?: boolean }): Promise { - const server = await startTraceViewerServer(options); - await installRootRedirect(server, [trace], { ...options, webApp: 'recorder.html' }); - const page = await openTraceViewerApp(server.urlPrefix('precise'), 'chromium', options); - page.on('close', () => gracefullyProcessExitDoNotHang(0)); - return page.context()._browser.options.wsEndpoint; +async function openApp(trace: string, options?: TraceViewerServerOptions & { headless?: boolean }): Promise<{ wsEndpointForTest: string | undefined, tracePage: Page, traceServer: HttpServer }> { + const traceServer = await startTraceViewerServer(options); + await installRootRedirect(traceServer, [trace], { ...options, webApp: 'recorder.html' }); + const page = await openTraceViewerApp(traceServer.urlPrefix('precise'), 'chromium', options); + return { wsEndpointForTest: page.context()._browser.options.wsEndpoint, tracePage: page, traceServer }; } class RecorderTransport implements Transport { + private _connected = new ManualPromise(); + constructor() { } - async dispatch(method: string, params: any) { + onconnect() { + this._connected.resolve(); + } + + async dispatch(method: string, params: any): Promise { } onclose() { } + deliverEvent(method: string, params: any) { + this._connected.then(() => this.sendEvent?.(method, params)); + } + sendEvent?: (method: string, params: any) => void; close?: () => void; } diff --git a/packages/playwright-core/src/server/recorder/recorderUtils.ts b/packages/playwright-core/src/server/recorder/recorderUtils.ts index 29186e9f96..3cde57052a 100644 --- a/packages/playwright-core/src/server/recorder/recorderUtils.ts +++ b/packages/playwright-core/src/server/recorder/recorderUtils.ts @@ -25,7 +25,7 @@ import type * as trace from '@trace/trace'; import { fromKeyboardModifiers, toKeyboardModifiers } from '../codegen/language'; import { serializeExpectedTextValues } from '../../utils/expectUtils'; import { createGuid, monotonicTime } from '../../utils'; -import { serializeValue } from '../../protocol/serializers'; +import { parseSerializedValue, serializeValue } from '../../protocol/serializers'; import type { SmartKeyboardModifier } from '../types'; export function metadataToCallLog(metadata: CallMetadata, status: CallLogStatus): CallLog { @@ -158,7 +158,7 @@ export function traceParamsForAction(actionInContext: ActionInContext): { method const params: channels.FrameExpectParams = { selector: action.selector, expression: 'to.be.checked', - isNot: action.checked, + isNot: !action.checked, }; return { method: 'expect', params }; } @@ -166,7 +166,7 @@ export function traceParamsForAction(actionInContext: ActionInContext): { method const params: channels.FrameExpectParams = { selector, expression: 'to.have.text', - expectedText: serializeExpectedTextValues([action.text], { matchSubstring: true, normalizeWhiteSpace: true }), + expectedText: serializeExpectedTextValues([action.text], { matchSubstring: action.substring, normalizeWhiteSpace: true }), isNot: false, }; return { method: 'expect', params }; @@ -193,12 +193,12 @@ export function traceParamsForAction(actionInContext: ActionInContext): { method export function callMetadataForAction(pageAliases: Map, actionInContext: ActionInContext): { callMetadata: CallMetadata, mainFrame: Frame } { const mainFrame = mainFrameForAction(pageAliases, actionInContext); - const { action } = actionInContext; const { method, params } = traceParamsForAction(actionInContext); + const callMetadata: CallMetadata = { id: `call@${createGuid()}`, stepId: `recorder@${createGuid()}`, - apiName: 'frame.' + action.name, + apiName: 'page.' + method, objectId: mainFrame.guid, pageId: mainFrame._page.guid, frameId: mainFrame.guid, @@ -215,38 +215,70 @@ export function callMetadataForAction(pageAliases: Map, actionInCo export function traceEventsToAction(events: trace.TraceEvent[]): ActionInContext[] { const result: ActionInContext[] = []; const pageAliases = new Map(); + let lastDownloadOrdinal = 0; + let lastDialogOrdinal = 0; + + const addSignal = (signal: actions.Signal) => { + const lastAction = result[result.length - 1]; + if (!lastAction) + return; + lastAction.action.signals.push(signal); + }; for (const event of events) { - if (event.type === 'event' && event.class === 'BrowserContext' && event.method === 'page') { - const pageAlias = 'page' + pageAliases.size; - pageAliases.set(event.params.pageId, pageAlias); - const lastAction = result[result.length - 1]; - lastAction.action.signals.push({ - name: 'popup', - popupAlias: pageAlias, - }); - result.push({ - frame: { pageAlias, framePath: [] }, - action: { - name: 'openPage', - url: '', - signals: [], - }, - timestamp: event.time, - }); - continue; - } + if (event.type === 'event' && event.class === 'BrowserContext') { + const { method, params } = event; + if (method === 'page') { + const pageAlias = 'page' + (pageAliases.size || ''); + pageAliases.set(params.pageId, pageAlias); + addSignal({ + name: 'popup', + popupAlias: pageAlias, + }); + result.push({ + frame: { pageAlias, framePath: [] }, + action: { + name: 'openPage', + url: '', + signals: [], + }, + timestamp: event.time, + }); + continue; + } - if (event.type === 'event' && event.class === 'BrowserContext' && event.method === 'pageClosed') { - const pageAlias = pageAliases.get(event.params.pageId) || 'page'; - result.push({ - frame: { pageAlias, framePath: [] }, - action: { - name: 'closePage', - signals: [], - }, - timestamp: event.time, - }); + if (method === 'pageClosed') { + const pageAlias = pageAliases.get(event.params.pageId) || 'page'; + result.push({ + frame: { pageAlias, framePath: [] }, + action: { + name: 'closePage', + signals: [], + }, + timestamp: event.time, + }); + continue; + } + + if (method === 'download') { + const downloadAlias = lastDownloadOrdinal ? String(lastDownloadOrdinal) : ''; + ++lastDownloadOrdinal; + addSignal({ + name: 'download', + downloadAlias, + }); + continue; + } + + if (method === 'dialog') { + const dialogAlias = lastDialogOrdinal ? String(lastDialogOrdinal) : ''; + ++lastDialogOrdinal; + addSignal({ + name: 'dialog', + dialogAlias, + }); + continue; + } continue; } @@ -389,6 +421,67 @@ export function traceEventsToAction(events: trace.TraceEvent[]): ActionInContext }); continue; } + if (method === 'expect') { + const params = untypedParams as channels.FrameExpectParams; + if (params.expression === 'to.have.text') { + const entry = params.expectedText?.[0]; + result.push({ + frame: { pageAlias, framePath: [] }, + action: { + name: 'assertText', + selector: params.selector, + signals: [], + text: entry?.string!, + substring: !!entry?.matchSubstring, + }, + timestamp: event.startTime + }); + continue; + } + + if (params.expression === 'to.have.value') { + result.push({ + frame: { pageAlias, framePath: [] }, + action: { + name: 'assertValue', + selector: params.selector, + signals: [], + value: parseSerializedValue(params.expectedValue!.value, params.expectedValue!.handles), + }, + timestamp: event.startTime + }); + continue; + } + + if (params.expression === 'to.be.checked') { + result.push({ + frame: { pageAlias, framePath: [] }, + action: { + name: 'assertChecked', + selector: params.selector, + signals: [], + checked: !params.isNot, + }, + timestamp: event.startTime + }); + continue; + } + + if (params.expression === 'to.be.visible') { + result.push({ + frame: { pageAlias, framePath: [] }, + action: { + name: 'assertVisible', + selector: params.selector, + signals: [], + }, + timestamp: event.startTime + }); + continue; + } + + continue; + } } return result; diff --git a/packages/playwright-core/src/server/trace/recorder/tracing.ts b/packages/playwright-core/src/server/trace/recorder/tracing.ts index 44e6bd7f1f..83b7fe6120 100644 --- a/packages/playwright-core/src/server/trace/recorder/tracing.ts +++ b/packages/playwright-core/src/server/trace/recorder/tracing.ts @@ -38,6 +38,8 @@ import { Snapshotter } from './snapshotter'; import type { ConsoleMessage } from '../../console'; import { Dispatcher } from '../../dispatchers/dispatcher'; import { serializeError } from '../../errors'; +import type { Dialog } from '../../dialog'; +import type { Download } from '../../download'; const version: trace.VERSION = 7; @@ -454,6 +456,28 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps this._appendTraceEvent(event); } + onDialog(dialog: Dialog) { + const event: trace.EventTraceEvent = { + type: 'event', + time: monotonicTime(), + class: 'BrowserContext', + method: 'dialog', + params: { pageId: dialog.page().guid, type: dialog.type(), message: dialog.message(), defaultValue: dialog.defaultValue() }, + }; + this._appendTraceEvent(event); + } + + onDownload(page: Page, download: Download) { + const event: trace.EventTraceEvent = { + type: 'event', + time: monotonicTime(), + class: 'BrowserContext', + method: 'download', + params: { pageId: page.guid, url: download.url, suggestedFilename: download.suggestedFilename() }, + }; + this._appendTraceEvent(event); + } + onPageOpen(page: Page) { const event: trace.EventTraceEvent = { type: 'event', diff --git a/packages/playwright-core/src/server/trace/viewer/traceViewer.ts b/packages/playwright-core/src/server/trace/viewer/traceViewer.ts index 6ca0319aa3..ee2ccac593 100644 --- a/packages/playwright-core/src/server/trace/viewer/traceViewer.ts +++ b/packages/playwright-core/src/server/trace/viewer/traceViewer.ts @@ -223,6 +223,9 @@ class StdinServer implements Transport { process.stdin.on('close', () => gracefullyProcessExitDoNotHang(0)); } + onconnect() { + } + async dispatch(method: string, params: any) { if (method === 'initialize') { if (this._traceUrl) diff --git a/packages/playwright-core/src/utils/httpServer.ts b/packages/playwright-core/src/utils/httpServer.ts index 24a84ea502..8da2a0e0d0 100644 --- a/packages/playwright-core/src/utils/httpServer.ts +++ b/packages/playwright-core/src/utils/httpServer.ts @@ -27,8 +27,9 @@ export type ServerRouteHandler = (request: http.IncomingMessage, response: http. export type Transport = { sendEvent?: (method: string, params: any) => void; - dispatch: (method: string, params: any) => Promise; close?: () => void; + onconnect: () => void; + dispatch: (method: string, params: any) => Promise; onclose: () => void; }; @@ -82,6 +83,7 @@ export class HttpServer { this._wsGuid = guid || createGuid(); const wss = new wsServer({ server: this._server, path: '/' + this._wsGuid }); wss.on('connection', ws => { + transport.onconnect(); transport.sendEvent = (method, params) => ws.send(JSON.stringify({ method, params })); transport.close = () => ws.close(); ws.on('message', async message => { diff --git a/packages/playwright/src/runner/testServer.ts b/packages/playwright/src/runner/testServer.ts index 5d67385dc5..d4433b2d85 100644 --- a/packages/playwright/src/runner/testServer.ts +++ b/packages/playwright/src/runner/testServer.ts @@ -84,6 +84,7 @@ export class TestServerDispatcher implements TestServerInterface { constructor(configLocation: ConfigLocation) { this._configLocation = configLocation; this.transport = { + onconnect: () => {}, dispatch: (method, params) => (this as any)[method](params), onclose: () => { if (this._closeOnDisconnect) diff --git a/packages/protocol/src/channels.ts b/packages/protocol/src/channels.ts index d7df4e0157..66cf417c87 100644 --- a/packages/protocol/src/channels.ts +++ b/packages/protocol/src/channels.ts @@ -1526,7 +1526,7 @@ export interface BrowserContextChannel extends BrowserContextEventTarget, EventT setOffline(params: BrowserContextSetOfflineParams, metadata?: CallMetadata): Promise; storageState(params?: BrowserContextStorageStateParams, metadata?: CallMetadata): Promise; pause(params?: BrowserContextPauseParams, metadata?: CallMetadata): Promise; - recorderSupplementEnable(params: BrowserContextRecorderSupplementEnableParams, metadata?: CallMetadata): Promise; + enableRecorder(params: BrowserContextEnableRecorderParams, metadata?: CallMetadata): Promise; newCDPSession(params: BrowserContextNewCDPSessionParams, metadata?: CallMetadata): Promise; harStart(params: BrowserContextHarStartParams, metadata?: CallMetadata): Promise; harExport(params: BrowserContextHarExportParams, metadata?: CallMetadata): Promise; @@ -1766,9 +1766,10 @@ export type BrowserContextStorageStateResult = { export type BrowserContextPauseParams = {}; export type BrowserContextPauseOptions = {}; export type BrowserContextPauseResult = void; -export type BrowserContextRecorderSupplementEnableParams = { +export type BrowserContextEnableRecorderParams = { language?: string, mode?: 'inspecting' | 'recording', + codegenMode?: 'actions' | 'trace-events', pauseOnNextStatement?: boolean, testIdAttributeName?: string, launchOptions?: any, @@ -1778,9 +1779,10 @@ export type BrowserContextRecorderSupplementEnableParams = { outputFile?: string, omitCallTracking?: boolean, }; -export type BrowserContextRecorderSupplementEnableOptions = { +export type BrowserContextEnableRecorderOptions = { language?: string, mode?: 'inspecting' | 'recording', + codegenMode?: 'actions' | 'trace-events', pauseOnNextStatement?: boolean, testIdAttributeName?: string, launchOptions?: any, @@ -1790,7 +1792,7 @@ export type BrowserContextRecorderSupplementEnableOptions = { outputFile?: string, omitCallTracking?: boolean, }; -export type BrowserContextRecorderSupplementEnableResult = void; +export type BrowserContextEnableRecorderResult = void; export type BrowserContextNewCDPSessionParams = { page?: PageChannel, frame?: FrameChannel, @@ -3769,7 +3771,6 @@ export type RouteRedirectNavigationRequestOptions = { export type RouteRedirectNavigationRequestResult = void; export type RouteAbortParams = { errorCode?: string, - requestUrl: string, }; export type RouteAbortOptions = { errorCode?: string, @@ -3780,7 +3781,6 @@ export type RouteContinueParams = { method?: string, headers?: NameValue[], postData?: Binary, - requestUrl: string, isFallback: boolean, }; export type RouteContinueOptions = { @@ -3796,7 +3796,6 @@ export type RouteFulfillParams = { body?: string, isBase64?: boolean, fetchResponseUid?: string, - requestUrl: string, }; export type RouteFulfillOptions = { status?: number, diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index 9532e9f07f..5133c0672e 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -1187,7 +1187,7 @@ BrowserContext: pause: experimental: True - recorderSupplementEnable: + enableRecorder: experimental: True parameters: language: string? @@ -1196,6 +1196,11 @@ BrowserContext: literals: - inspecting - recording + codegenMode: + type: enum? + literals: + - actions + - trace-events pauseOnNextStatement: boolean? testIdAttributeName: string? launchOptions: json? @@ -2941,7 +2946,6 @@ Route: abort: parameters: errorCode: string? - requestUrl: string continue: parameters: @@ -2951,7 +2955,6 @@ Route: type: array? items: NameValue postData: binary? - requestUrl: string isFallback: boolean fulfill: @@ -2964,7 +2967,6 @@ Route: body: string? isBase64: boolean? fetchResponseUid: string? - requestUrl: string WebSocketRoute: diff --git a/packages/trace-viewer/src/sw.ts b/packages/trace-viewer/src/sw.ts index 7888aa6a30..43029ed5bb 100644 --- a/packages/trace-viewer/src/sw.ts +++ b/packages/trace-viewer/src/sw.ts @@ -47,12 +47,14 @@ async function loadTrace(traceUrl: string, traceFileName: string | null, clientI } set.add(traceUrl); + const isRecorderMode = traceUrl.includes('/playwright-recorder-trace-'); + const traceModel = new TraceModel(); try { // Allow 10% to hop from sw to page. const [fetchProgress, unzipProgress] = splitProgress(progress, [0.5, 0.4, 0.1]); const backend = traceUrl.endsWith('json') ? new FetchTraceModelBackend(traceUrl) : new ZipTraceModelBackend(traceUrl, fetchProgress); - await traceModel.load(backend, unzipProgress); + await traceModel.load(backend, isRecorderMode, unzipProgress); } catch (error: any) { // eslint-disable-next-line no-console console.error(error); diff --git a/packages/trace-viewer/src/traceModel.ts b/packages/trace-viewer/src/traceModel.ts index 87a3d42491..893e928691 100644 --- a/packages/trace-viewer/src/traceModel.ts +++ b/packages/trace-viewer/src/traceModel.ts @@ -15,7 +15,7 @@ */ import { parseClientSideCallMetadata } from '../../../packages/playwright-core/src/utils/isomorphic/traceUtils'; -import type { ContextEntry } from './entries'; +import type { ActionEntry, ContextEntry } from './entries'; import { createEmptyContext } from './entries'; import { SnapshotStorage } from './snapshotStorage'; import { TraceModernizer } from './traceModernizer'; @@ -38,7 +38,7 @@ export class TraceModel { constructor() { } - async load(backend: TraceModelBackend, unzipProgress: (done: number, total: number) => void) { + async load(backend: TraceModelBackend, isRecorderMode: boolean, unzipProgress: (done: number, total: number) => void) { this._backend = backend; const ordinals: string[] = []; @@ -72,7 +72,8 @@ export class TraceModel { modernizer.appendTrace(network); unzipProgress(++done, total); - contextEntry.actions = modernizer.actions().sort((a1, a2) => a1.startTime - a2.startTime); + const actions = modernizer.actions().sort((a1, a2) => a1.startTime - a2.startTime); + contextEntry.actions = isRecorderMode ? collapseActionsForRecorder(actions) : actions; if (!backend.isLive()) { // Terminate actions w/o after event gracefully. @@ -133,3 +134,19 @@ function stripEncodingFromContentType(contentType: string) { return charset[1]; return contentType; } + +function collapseActionsForRecorder(actions: ActionEntry[]): ActionEntry[] { + const result: ActionEntry[] = []; + for (const action of actions) { + const lastAction = result[result.length - 1]; + const isSameAction = lastAction && lastAction.method === action.method && lastAction.pageId === action.pageId; + const isSameSelector = lastAction && 'selector' in lastAction.params && 'selector' in action.params && action.params.selector === lastAction.params.selector; + const shouldMerge = isSameAction && (action.method === 'goto' || (action.method === 'fill' && isSameSelector)); + if (!shouldMerge) { + result.push(action); + continue; + } + result[result.length - 1] = action; + } + return result; +} diff --git a/packages/trace-viewer/src/ui/callTab.css b/packages/trace-viewer/src/ui/callTab.css index 56928088b5..f57f3f1529 100644 --- a/packages/trace-viewer/src/ui/callTab.css +++ b/packages/trace-viewer/src/ui/callTab.css @@ -36,6 +36,8 @@ .call-section { padding-left: 6px; + padding-top: 2px; + margin-top: 2px; font-weight: bold; text-transform: uppercase; font-size: 10px; @@ -53,9 +55,8 @@ align-items: center; text-overflow: ellipsis; overflow: hidden; - line-height: 18px; + line-height: 20px; white-space: nowrap; - max-height: 18px; } .call-line:not(:hover) .toolbar-button.copy { @@ -64,7 +65,8 @@ .call-line .toolbar-button.copy { margin-left: 5px; - transform: scale(0.8); + margin-top: -2px; + margin-bottom: -2px; } .call-value { diff --git a/packages/trace-viewer/src/ui/recorderView.tsx b/packages/trace-viewer/src/ui/recorderView.tsx index 4d8ec8d297..945ac86fc0 100644 --- a/packages/trace-viewer/src/ui/recorderView.tsx +++ b/packages/trace-viewer/src/ui/recorderView.tsx @@ -45,8 +45,6 @@ export const RecorderView: React.FunctionComponent = () => { connection.setMode('recording'); }, [connection]); - window.playwrightSourcesEchoForTest = sources; - return
; }; @@ -165,6 +164,7 @@ class Connection { if (method === 'setSources') { const { sources } = params as { sources: Source[] }; this._options.setSources(sources); + window.playwrightSourcesEchoForTest = sources; } } } diff --git a/packages/trace-viewer/src/ui/uiModeView.tsx b/packages/trace-viewer/src/ui/uiModeView.tsx index a97716bdc4..ba74e60092 100644 --- a/packages/trace-viewer/src/ui/uiModeView.tsx +++ b/packages/trace-viewer/src/ui/uiModeView.tsx @@ -105,7 +105,6 @@ export const UIModeView: React.FC<{}> = ({ const [singleWorker, setSingleWorker] = React.useState(queryParams.workers === '1'); const [showBrowser, setShowBrowser] = React.useState(queryParams.headed); const [updateSnapshots, setUpdateSnapshots] = React.useState(queryParams.updateSnapshots === 'all'); - const [showRouteActions, setShowRouteActions] = useSetting('show-route-actions', true); const [darkMode, setDarkMode] = useDarkModeSetting(); const [showScreenshot, setShowScreenshot] = useSetting('screenshot-instead-of-snapshot', false); @@ -526,7 +525,6 @@ export const UIModeView: React.FC<{}> = ({ {settingsVisible && }
diff --git a/packages/trace-viewer/src/ui/workbench.tsx b/packages/trace-viewer/src/ui/workbench.tsx index e1ce2298ae..95c18d8d0a 100644 --- a/packages/trace-viewer/src/ui/workbench.tsx +++ b/packages/trace-viewer/src/ui/workbench.tsx @@ -24,7 +24,6 @@ import type { ErrorDescription } from './errorsTab'; import type { ConsoleEntry } from './consoleTab'; import { ConsoleTab, useConsoleTabModel } from './consoleTab'; import type * as modelUtil from './modelUtil'; -import { isRouteAction } from './modelUtil'; import { NetworkTab, useNetworkTabModel } from './networkTab'; import { SnapshotTab } from './snapshotTab'; import { SourceTab } from './sourceTab'; @@ -50,6 +49,7 @@ export const Workbench: React.FunctionComponent<{ rootDir?: string, fallbackLocation?: modelUtil.SourceLocation, isLive?: boolean, + hideTimeline?: boolean, status?: UITestStatus, annotations?: { type: string; description?: string; }[]; inert?: boolean, @@ -57,7 +57,7 @@ export const Workbench: React.FunctionComponent<{ onOpenExternally?: (location: modelUtil.SourceLocation) => void, revealSource?: boolean, showSettings?: boolean, -}> = ({ model, showSourcesFirst, rootDir, fallbackLocation, isLive, status, annotations, inert, openPage, onOpenExternally, revealSource, showSettings }) => { +}> = ({ model, showSourcesFirst, rootDir, fallbackLocation, isLive, hideTimeline, status, annotations, inert, openPage, onOpenExternally, revealSource, showSettings }) => { const [selectedCallId, setSelectedCallId] = React.useState(undefined); const [revealedError, setRevealedError] = React.useState(undefined); @@ -70,13 +70,8 @@ export const Workbench: React.FunctionComponent<{ const [highlightedLocator, setHighlightedLocator] = React.useState(''); const [selectedTime, setSelectedTime] = React.useState(); const [sidebarLocation, setSidebarLocation] = useSetting<'bottom' | 'right'>('propertiesSidebarLocation', 'bottom'); - const [showRouteActions, setShowRouteActions] = useSetting('show-route-actions', true); const [showScreenshot, setShowScreenshot] = useSetting('screenshot-instead-of-snapshot', false); - const filteredActions = React.useMemo(() => { - return (model?.actions || []).filter(action => showRouteActions || !isRouteAction(action)); - }, [model, showRouteActions]); - const setSelectedAction = React.useCallback((action: modelUtil.ActionTraceEventInContext | undefined) => { setSelectedCallId(action?.callId); setRevealedError(undefined); @@ -291,7 +286,7 @@ export const Workbench: React.FunctionComponent<{ } , }; return
- + />} local -> remote transitions [pass] +library/chromium/oopif.spec.ts › should intercept response body from oopif [fail] +library/chromium/oopif.spec.ts › should load oopif iframes with subresources and route [pass] +library/chromium/oopif.spec.ts › should not throw on exposeFunction when oopif detaches [pass] +library/chromium/oopif.spec.ts › should report google.com frame with headed [pass] +library/chromium/oopif.spec.ts › should report main requests [pass] +library/chromium/oopif.spec.ts › should report oopif frames [pass] +library/chromium/oopif.spec.ts › should respect route [pass] +library/chromium/oopif.spec.ts › should support addInitScript [pass] +library/chromium/oopif.spec.ts › should support context options [fail] +library/chromium/oopif.spec.ts › should support exposeFunction [fail] +library/chromium/oopif.spec.ts › should take screenshot [fail] +library/chromium/session.spec.ts › should be able to detach session [fail] +library/chromium/session.spec.ts › should detach when page closes [fail] +library/chromium/session.spec.ts › should enable and disable domains independently [fail] +library/chromium/session.spec.ts › should not break page.close() [fail] +library/chromium/session.spec.ts › should only accept a page or frame [pass] +library/chromium/session.spec.ts › should reject protocol calls when page closes [fail] +library/chromium/session.spec.ts › should send events [fail] +library/chromium/session.spec.ts › should throw if target is part of main [fail] +library/chromium/session.spec.ts › should throw nice errors [fail] +library/chromium/session.spec.ts › should work [fail] +library/chromium/session.spec.ts › should work with main frame [fail] +library/chromium/session.spec.ts › should work with newBrowserCDPSession [fail] +library/chromium/tracing.spec.ts › should create directories as needed [fail] +library/chromium/tracing.spec.ts › should output a trace [fail] +library/chromium/tracing.spec.ts › should return a buffer [fail] +library/chromium/tracing.spec.ts › should run with custom categories if provided [fail] +library/chromium/tracing.spec.ts › should support a buffer without a path [fail] +library/chromium/tracing.spec.ts › should throw if tracing on two pages [fail] +library/chromium/tracing.spec.ts › should work without options [fail] +library/client-certificates.spec.ts › browser › persistentContext › should pass with matching certificates [fail] +library/client-certificates.spec.ts › browser › persistentContext › validate input [pass] +library/client-certificates.spec.ts › browser › should fail with matching certificates in legacy pfx format [pass] +library/client-certificates.spec.ts › browser › should fail with no client certificates [fail] +library/client-certificates.spec.ts › browser › should fail with self-signed client certificates [fail] +library/client-certificates.spec.ts › browser › should handle TLS renegotiation with client certificates [fail] +library/client-certificates.spec.ts › browser › should handle rejected certificate in handshake with HTTP/2 [pass] +library/client-certificates.spec.ts › browser › should have ignoreHTTPSErrors=false by default [fail] +library/client-certificates.spec.ts › browser › should keep supporting http [pass] +library/client-certificates.spec.ts › browser › should not hang on tls errors during TLS 1.2 handshake [fail] +library/client-certificates.spec.ts › browser › should pass with matching certificates [fail] +library/client-certificates.spec.ts › browser › should pass with matching certificates and trailing slash [fail] +library/client-certificates.spec.ts › browser › should pass with matching certificates and when a http proxy is used [fail] +library/client-certificates.spec.ts › browser › should pass with matching certificates and when a socks proxy is used [fail] +library/client-certificates.spec.ts › browser › should pass with matching certificates in pfx format [fail] +library/client-certificates.spec.ts › browser › should pass with matching certificates in pfx format when passing as content [fail] +library/client-certificates.spec.ts › browser › should pass with matching certificates on context APIRequestContext instance [pass] +library/client-certificates.spec.ts › browser › should pass with matching certificates when passing as content [fail] +library/client-certificates.spec.ts › browser › should return target connection errors when using http2 [unknown] +library/client-certificates.spec.ts › browser › should throw a http error if the pfx passphrase is incorect [pass] +library/client-certificates.spec.ts › browser › support http2 [fail] +library/client-certificates.spec.ts › browser › support http2 if the browser only supports http1.1 [unknown] +library/client-certificates.spec.ts › browser › validate input [pass] +library/client-certificates.spec.ts › fetch › pass with trusted client certificates [pass] +library/client-certificates.spec.ts › fetch › pass with trusted client certificates and when a http proxy is used [pass] +library/client-certificates.spec.ts › fetch › pass with trusted client certificates and when a socks proxy is used [pass] +library/client-certificates.spec.ts › fetch › pass with trusted client certificates in pfx format [pass] +library/client-certificates.spec.ts › fetch › should fail with matching certificates in legacy pfx format [pass] +library/client-certificates.spec.ts › fetch › should fail with no client certificates provided [pass] +library/client-certificates.spec.ts › fetch › should keep supporting http [pass] +library/client-certificates.spec.ts › fetch › should throw a http error if the pfx passphrase is incorect [pass] +library/client-certificates.spec.ts › fetch › should throw with untrusted client certs [pass] +library/client-certificates.spec.ts › fetch › should work in the browser with request interception [pass] +library/client-certificates.spec.ts › fetch › validate input [pass] +library/clock.spec.ts › Intl API › Creates a RelativeTimeFormat like normal [pass] +library/clock.spec.ts › Intl API › Executes formatRange like normal [pass] +library/clock.spec.ts › Intl API › Executes formatRangeToParts like normal [pass] +library/clock.spec.ts › Intl API › Executes resolvedOptions like normal [pass] +library/clock.spec.ts › Intl API › Executes supportedLocalesOf like normal [pass] +library/clock.spec.ts › Intl API › formatToParts via isFirstOfMonth -> Returns false when passed a timestamp argument that is not first of the month [pass] +library/clock.spec.ts › Intl API › formatToParts via isFirstOfMonth -> Returns false when passed no timestamp and system time is not first of the month [pass] +library/clock.spec.ts › Intl API › formatToParts via isFirstOfMonth -> Returns true when passed a timestamp argument that is first of the month [pass] +library/clock.spec.ts › Intl API › formatToParts via isFirstOfMonth -> Returns true when passed no timestamp and system time is first of the month [pass] +library/clock.spec.ts › cancelAnimationFrame › does not remove interval [pass] +library/clock.spec.ts › cancelAnimationFrame › does not remove timeout [pass] +library/clock.spec.ts › cancelAnimationFrame › ignores null argument [pass] +library/clock.spec.ts › cancelAnimationFrame › removes animation frame [pass] +library/clock.spec.ts › cancelIdleCallback › removes idle callback [pass] +library/clock.spec.ts › clearInterval › ignores null argument [pass] +library/clock.spec.ts › clearInterval › removes interval [pass] +library/clock.spec.ts › clearInterval › removes interval with undefined interval [pass] +library/clock.spec.ts › clearInterval › removes timeout [pass] +library/clock.spec.ts › clearTimeout › ignores null argument [pass] +library/clock.spec.ts › clearTimeout › removes interval [pass] +library/clock.spec.ts › clearTimeout › removes interval with undefined interval [pass] +library/clock.spec.ts › clearTimeout › removes timeout [pass] +library/clock.spec.ts › date › creates Date objects representing clock time [pass] +library/clock.spec.ts › date › creates real Date objects [pass] +library/clock.spec.ts › date › creates regular date when passing a date as RFC 2822 string [pass] +library/clock.spec.ts › date › creates regular date when passing a date as string [pass] +library/clock.spec.ts › date › creates regular date when passing timestamp [pass] +library/clock.spec.ts › date › creates regular date when passing y, m, d [pass] +library/clock.spec.ts › date › creates regular date when passing y, m, d, h [pass] +library/clock.spec.ts › date › creates regular date when passing y, m, d, h, m [pass] +library/clock.spec.ts › date › creates regular date when passing y, m, d, h, m, s [pass] +library/clock.spec.ts › date › creates regular date when passing y, m, d, h, m, s, ms [pass] +library/clock.spec.ts › date › creates regular date when passing year, month [pass] +library/clock.spec.ts › date › listens to system clock changes [pass] +library/clock.spec.ts › date › listens to ticking clock [pass] +library/clock.spec.ts › date › mirrors UTC method [pass] +library/clock.spec.ts › date › mirrors native Date.prototype [pass] +library/clock.spec.ts › date › mirrors parse method [pass] +library/clock.spec.ts › date › mirrors toUTCString method [pass] +library/clock.spec.ts › date › provides date constructor [pass] +library/clock.spec.ts › date › returns clock.now() [pass] +library/clock.spec.ts › date › returns date as string representing clock time [pass] +library/clock.spec.ts › date › returns date as string when called as function [pass] +library/clock.spec.ts › date › returns date as string when calling with arguments [pass] +library/clock.spec.ts › date › returns date as string when calling with timestamp [pass] +library/clock.spec.ts › date › supports now method if present [pass] +library/clock.spec.ts › fastForward › handles multiple pending timers and types [pass] +library/clock.spec.ts › fastForward › ignores timers which wouldn't be run [pass] +library/clock.spec.ts › fastForward › pushes back execution time for skipped timers [pass] +library/clock.spec.ts › pauseAt › fire target timers [pass] +library/clock.spec.ts › pauseAt › pause at target time [pass] +library/clock.spec.ts › pauseAt › returns consumed clicks [pass] +library/clock.spec.ts › performance.now() › should listen to multiple ticks in performance.now [pass] +library/clock.spec.ts › performance.now() › should run along with clock.tick [pass] +library/clock.spec.ts › performance.now() › should run with ticks with timers set [pass] +library/clock.spec.ts › performance.now() › should start at 0 [pass] +library/clock.spec.ts › requestAnimationFrame › returns numeric id or object with numeric id [pass] +library/clock.spec.ts › requestAnimationFrame › returns unique id [pass] +library/clock.spec.ts › requestAnimationFrame › should be called with performance.now() even when performance unavailable [pass] +library/clock.spec.ts › requestAnimationFrame › should be called with performance.now() when available [pass] +library/clock.spec.ts › requestAnimationFrame › should call callback once [pass] +library/clock.spec.ts › requestAnimationFrame › should properly schedule callback for 3rd frame [pass] +library/clock.spec.ts › requestAnimationFrame › should run every 16ms [pass] +library/clock.spec.ts › requestAnimationFrame › should schedule for next frame if on current frame [pass] +library/clock.spec.ts › requestAnimationFrame › should schedule two callbacks before the next frame at the same time [pass] +library/clock.spec.ts › requestAnimationFrame › throws if no arguments [pass] +library/clock.spec.ts › requestIdleCallback › doesn't runs if there are any timers and no timeout option [pass] +library/clock.spec.ts › requestIdleCallback › returns numeric id [pass] +library/clock.spec.ts › requestIdleCallback › returns unique id [pass] +library/clock.spec.ts › requestIdleCallback › runs after all timers [pass] +library/clock.spec.ts › requestIdleCallback › runs no later than timeout option even if there are any timers [pass] +library/clock.spec.ts › requestIdleCallback › throws if no arguments [pass] +library/clock.spec.ts › runFor › calls function with global object or null (strict mode) as this [pass] +library/clock.spec.ts › runFor › creates updated Date while ticking [pass] +library/clock.spec.ts › runFor › creates updated Date while ticking promises [pass] +library/clock.spec.ts › runFor › does not fire canceled intervals [pass] +library/clock.spec.ts › runFor › does not fire intervals canceled in a promise [pass] +library/clock.spec.ts › runFor › does not silently catch errors [pass] +library/clock.spec.ts › runFor › does not trigger without sufficient delay [pass] +library/clock.spec.ts › runFor › fires nested setTimeout calls in user-created promises properly [pass] +library/clock.spec.ts › runFor › fires nested setTimeout calls properly [pass] +library/clock.spec.ts › runFor › fires promise timers in correct order [pass] +library/clock.spec.ts › runFor › fires timer in intervals of "13" [pass] +library/clock.spec.ts › runFor › fires timer in intervals of 13 [pass] +library/clock.spec.ts › runFor › fires timers in correct order [pass] +library/clock.spec.ts › runFor › is not influenced by forward system clock changes [pass] +library/clock.spec.ts › runFor › is not influenced by forward system clock changes 2 [pass] +library/clock.spec.ts › runFor › is not influenced by forward system clock changes in promises [pass] +library/clock.spec.ts › runFor › is not influenced by forward system clock changes when an error is thrown [pass] +library/clock.spec.ts › runFor › is not influenced by forward system clock changes when an error is thrown 2 [pass] +library/clock.spec.ts › runFor › mini integration test [pass] +library/clock.spec.ts › runFor › should settle chained user-created promises [pass] +library/clock.spec.ts › runFor › should settle local nested promises before calling timeouts [pass] +library/clock.spec.ts › runFor › should settle local promises before calling timeouts [pass] +library/clock.spec.ts › runFor › should settle multiple user-created promises [pass] +library/clock.spec.ts › runFor › should settle nested user-created promises [pass] +library/clock.spec.ts › runFor › should settle user-created promises [pass] +library/clock.spec.ts › runFor › should settle user-created promises before calling more timeouts [pass] +library/clock.spec.ts › runFor › should settle user-created promises even if some throw [pass] +library/clock.spec.ts › runFor › throws for negative minutes [pass] +library/clock.spec.ts › runFor › throws on negative ticks [pass] +library/clock.spec.ts › runFor › triggers after sufficient delay [pass] +library/clock.spec.ts › runFor › triggers even when some throw [pass] +library/clock.spec.ts › runFor › triggers immediately without specified delay [pass] +library/clock.spec.ts › runFor › triggers in the order scheduled [pass] +library/clock.spec.ts › runFor › triggers multiple simultaneous timers [pass] +library/clock.spec.ts › runFor › triggers multiple simultaneous timers with zero callAt [pass] +library/clock.spec.ts › runFor › triggers simultaneous timers [pass] +library/clock.spec.ts › runFor › triggers timeouts and intervals in the order scheduled [pass] +library/clock.spec.ts › runFor › waits after setTimeout was called [pass] +library/clock.spec.ts › setInterval › does not schedule recurring timeout when cleared [pass] +library/clock.spec.ts › setInterval › does not throw if |undefined| or |null| is passed as a callback [pass] +library/clock.spec.ts › setInterval › is not influenced by backward system clock changes [pass] +library/clock.spec.ts › setInterval › is not influenced by forward system clock changes [pass] +library/clock.spec.ts › setInterval › passes setTimeout parameters [pass] +library/clock.spec.ts › setInterval › returns numeric id or object with numeric id [pass] +library/clock.spec.ts › setInterval › returns unique id [pass] +library/clock.spec.ts › setInterval › schedules recurring timeout [pass] +library/clock.spec.ts › setInterval › throws if no arguments [pass] +library/clock.spec.ts › setTimeout › calls correct timeout on recursive tick [pass] +library/clock.spec.ts › setTimeout › does not depend on this [pass] +library/clock.spec.ts › setTimeout › does not throw if |undefined| or |null| is passed as a callback [pass] +library/clock.spec.ts › setTimeout › is not influenced by backward system clock changes [pass] +library/clock.spec.ts › setTimeout › is not influenced by forward system clock changes [pass] +library/clock.spec.ts › setTimeout › parses no-numeric string times [pass] +library/clock.spec.ts › setTimeout › parses numeric string times [pass] +library/clock.spec.ts › setTimeout › passes setTimeout parameters [pass] +library/clock.spec.ts › setTimeout › returns numeric id or object with numeric id [pass] +library/clock.spec.ts › setTimeout › returns unique id [pass] +library/clock.spec.ts › setTimeout › sets timers on instance [pass] +library/clock.spec.ts › setTimeout › starts id from a large number [pass] +library/clock.spec.ts › setTimeout › throws if no arguments [pass] +library/clock.spec.ts › setTimeout › use of eval when not in node › evals non-function callbacks [pass] +library/clock.spec.ts › setTimeout › use of eval when not in node › only evals on global scope [pass] +library/clock.spec.ts › stubTimers › deletes global property on uninstall if it was inherited onto the global object [unknown] +library/clock.spec.ts › stubTimers › does not fake methods not provided [pass] +library/clock.spec.ts › stubTimers › fake Date constructor should mirror Date's properties [pass] +library/clock.spec.ts › stubTimers › fakes Date constructor [pass] +library/clock.spec.ts › stubTimers › fakes provided methods [pass] +library/clock.spec.ts › stubTimers › global fake setTimeout should return id [pass] +library/clock.spec.ts › stubTimers › mirrors custom Date properties [pass] +library/clock.spec.ts › stubTimers › replace Event.prototype.timeStamp [pass] +library/clock.spec.ts › stubTimers › replaces global clearInterval [pass] +library/clock.spec.ts › stubTimers › replaces global clearTimeout [pass] +library/clock.spec.ts › stubTimers › replaces global performance.now [pass] +library/clock.spec.ts › stubTimers › replaces global setInterval [pass] +library/clock.spec.ts › stubTimers › replaces global setTimeout [pass] +library/clock.spec.ts › stubTimers › resets faked methods [pass] +library/clock.spec.ts › stubTimers › returns clock object [pass] +library/clock.spec.ts › stubTimers › sets initial timestamp [pass] +library/clock.spec.ts › stubTimers › should let performance.mark still be callable after install() (#136) [unknown] +library/clock.spec.ts › stubTimers › should not alter the global performance properties and methods [unknown] +library/clock.spec.ts › stubTimers › should replace the getEntries, getEntriesByX methods with noops that return [] [unknown] +library/clock.spec.ts › stubTimers › takes an object parameter [pass] +library/clock.spec.ts › stubTimers › uninstalls Date constructor [pass] +library/clock.spec.ts › stubTimers › uninstalls global performance.now [pass] +library/clock.spec.ts › works with concurrent runFor calls [pass] +library/clock.spec.ts › works with slow setTimeout in busy embedder [pass] +library/clock.spec.ts › works with slow setTimeout in busy embedder when not paused [pass] +library/component-parser.spec.ts › should escape [pass] +library/component-parser.spec.ts › should parse [pass] +library/component-parser.spec.ts › should parse all operators [pass] +library/component-parser.spec.ts › should parse bool [pass] +library/component-parser.spec.ts › should parse float values [pass] +library/component-parser.spec.ts › should parse identifiers [pass] +library/component-parser.spec.ts › should parse int values [pass] +library/component-parser.spec.ts › should parse regex [pass] +library/component-parser.spec.ts › should parse short attributes [pass] +library/component-parser.spec.ts › should parse unquoted string [pass] +library/component-parser.spec.ts › should throw on malformed selector [pass] +library/component-parser.spec.ts › should tolerate spacing [pass] +library/css-parser.spec.ts › should parse css [pass] +library/css-parser.spec.ts › should throw on malformed css [pass] +library/debug-controller.spec.ts › should highlight all [fail] +library/debug-controller.spec.ts › should navigate all [fail] +library/debug-controller.spec.ts › should pick element [fail] +library/debug-controller.spec.ts › should record [fail] +library/debug-controller.spec.ts › should record custom data-testid [fail] +library/debug-controller.spec.ts › should report pages [fail] +library/debug-controller.spec.ts › should reset for reuse [fail] +library/debug-controller.spec.ts › should reset routes before reuse [fail] +library/defaultbrowsercontext-1.spec.ts › context.addCookies() should work [pass] +library/defaultbrowsercontext-1.spec.ts › context.clearCookies() should work [pass] +library/defaultbrowsercontext-1.spec.ts › context.cookies() should work @smoke [pass] +library/defaultbrowsercontext-1.spec.ts › should support acceptDownloads option [fail] +library/defaultbrowsercontext-1.spec.ts › should support bypassCSP option [fail] +library/defaultbrowsercontext-1.spec.ts › should support deviceScaleFactor option [pass] +library/defaultbrowsercontext-1.spec.ts › should support httpCredentials option [fail] +library/defaultbrowsercontext-1.spec.ts › should support javascriptEnabled option [fail] +library/defaultbrowsercontext-1.spec.ts › should support offline option [pass] +library/defaultbrowsercontext-1.spec.ts › should support userAgent option [fail] +library/defaultbrowsercontext-1.spec.ts › should support viewport option [pass] +library/defaultbrowsercontext-1.spec.ts › should(not) block third party cookies [pass] +library/defaultbrowsercontext-2.spec.ts › coverage should work [unknown] +library/defaultbrowsercontext-2.spec.ts › should accept userDataDir [pass] +library/defaultbrowsercontext-2.spec.ts › should connect to a browser with the default page [pass] +library/defaultbrowsercontext-2.spec.ts › should create userDataDir if it does not exist [pass] +library/defaultbrowsercontext-2.spec.ts › should fire close event for a persistent context [pass] +library/defaultbrowsercontext-2.spec.ts › should handle exception [timeout] +library/defaultbrowsercontext-2.spec.ts › should handle timeout [pass] +library/defaultbrowsercontext-2.spec.ts › should have default URL when launching browser [pass] +library/defaultbrowsercontext-2.spec.ts › should have passed URL when launching with ignoreDefaultArgs: true [fail] +library/defaultbrowsercontext-2.spec.ts › should respect selectors [fail] +library/defaultbrowsercontext-2.spec.ts › should restore state from userDataDir [pass] +library/defaultbrowsercontext-2.spec.ts › should support colorScheme option [fail] +library/defaultbrowsercontext-2.spec.ts › should support extraHTTPHeaders option [fail] +library/defaultbrowsercontext-2.spec.ts › should support forcedColors option [fail] +library/defaultbrowsercontext-2.spec.ts › should support geolocation and permissions options [timeout] +library/defaultbrowsercontext-2.spec.ts › should support har option [pass] +library/defaultbrowsercontext-2.spec.ts › should support hasTouch option [fail] +library/defaultbrowsercontext-2.spec.ts › should support ignoreHTTPSErrors option [fail] +library/defaultbrowsercontext-2.spec.ts › should support locale option [fail] +library/defaultbrowsercontext-2.spec.ts › should support reducedMotion option [fail] +library/defaultbrowsercontext-2.spec.ts › should support timezoneId option [fail] +library/defaultbrowsercontext-2.spec.ts › should throw if page argument is passed [fail] +library/defaultbrowsercontext-2.spec.ts › should work in persistent context [fail] +library/defaultbrowsercontext-2.spec.ts › user agent is up to date [pass] +library/download.spec.ts › download event › should be able to cancel pending downloads [fail] +library/download.spec.ts › download event › should close the context without awaiting the download [fail] +library/download.spec.ts › download event › should close the context without awaiting the failed download [unknown] +library/download.spec.ts › download event › should create subdirectories when saving to non-existent user-specified path [fail] +library/download.spec.ts › download event › should delete downloads on browser gone [fail] +library/download.spec.ts › download event › should delete downloads on context destruction [fail] +library/download.spec.ts › download event › should delete file [fail] +library/download.spec.ts › download event › should download large binary.zip [fail] +library/download.spec.ts › download event › should emit download event from nested iframes [timeout] +library/download.spec.ts › download event › should error when saving after deletion [fail] +library/download.spec.ts › download event › should error when saving with downloads disabled [fail] +library/download.spec.ts › download event › should expose stream [fail] +library/download.spec.ts › download event › should not fail explicitly to cancel a download even if that is already finished [fail] +library/download.spec.ts › download event › should report alt-click downloads [fail] +library/download.spec.ts › download event › should report download path within page.on('download', …) handler for Blobs [timeout] +library/download.spec.ts › download event › should report download path within page.on('download', …) handler for Files [fail] +library/download.spec.ts › download event › should report download when navigation turns into download @smoke [timeout] +library/download.spec.ts › download event › should report downloads for download attribute [fail] +library/download.spec.ts › download event › should report downloads with acceptDownloads: false [fail] +library/download.spec.ts › download event › should report downloads with acceptDownloads: true [fail] +library/download.spec.ts › download event › should report downloads with interception [fail] +library/download.spec.ts › download event › should report new window downloads [fail] +library/download.spec.ts › download event › should report non-navigation downloads [fail] +library/download.spec.ts › download event › should report proper download url when download is from download attribute [fail] +library/download.spec.ts › download event › should save to overwritten filepath [fail] +library/download.spec.ts › download event › should save to two different paths with multiple saveAs calls [fail] +library/download.spec.ts › download event › should save to user-specified path without updating original path [fail] +library/download.spec.ts › download event › should throw if browser dies [fail] +library/download.spec.ts › download event › should work with Cross-Origin-Opener-Policy [timeout] +library/download.spec.ts › should be able to download a PDF file [fail] +library/download.spec.ts › should be able to download a inline PDF file via navigation [fail] +library/download.spec.ts › should be able to download a inline PDF file via response interception [fail] +library/download.spec.ts › should convert navigation to a resource with unsupported mime type into download [timeout] +library/download.spec.ts › should download even if there is no "attachment" value [fail] +library/download.spec.ts › should download links with data url [fail] +library/download.spec.ts › should download successfully when routing [fail] +library/download.spec.ts › should save to user-specified path [fail] +library/downloads-path.spec.ts › downloads path › should accept downloads in persistent context [fail] +library/downloads-path.spec.ts › downloads path › should delete downloads when context closes [fail] +library/downloads-path.spec.ts › downloads path › should delete downloads when persistent context closes [fail] +library/downloads-path.spec.ts › downloads path › should keep downloadsPath folder [fail] +library/downloads-path.spec.ts › downloads path › should report downloads in downloadsPath folder [fail] +library/downloads-path.spec.ts › downloads path › should report downloads in downloadsPath folder with a relative path [fail] +library/emulation-focus.spec.ts › should change document.activeElement [pass] +library/emulation-focus.spec.ts › should change focused iframe [pass] +library/emulation-focus.spec.ts › should focus popups by default [fail] +library/emulation-focus.spec.ts › should focus with more than one page/context [fail] +library/emulation-focus.spec.ts › should not affect mouse event target page [pass] +library/emulation-focus.spec.ts › should not affect screenshots [fail] +library/emulation-focus.spec.ts › should not fire blur events when interacting with more than one page/context [fail] +library/emulation-focus.spec.ts › should provide target for keyboard events [pass] +library/emulation-focus.spec.ts › should think that all pages are focused @smoke [fail] +library/emulation-focus.spec.ts › should think that it is focused by default [pass] +library/emulation-focus.spec.ts › should trigger hover state concurrently [fail] +library/events/add-listeners.spec.ts › EventEmitter tests › Listener order [pass] +library/events/add-listeners.spec.ts › EventEmitter tests › listener type check [pass] +library/events/add-listeners.spec.ts › EventEmitter tests › set max listeners test [pass] +library/events/add-listeners.spec.ts › EventEmitter tests › should work [pass] +library/events/check-listener-leaks.spec.ts › _maxListeners still has precedence over defaultMaxListeners [pass] +library/events/check-listener-leaks.spec.ts › defaultMaxListeners [pass] +library/events/check-listener-leaks.spec.ts › process-wide [pass] +library/events/events-list.spec.ts › EventEmitter › should maintain event names correctly [pass] +library/events/listener-count.spec.ts › Listener count test [pass] +library/events/listeners-side-effects.spec.ts › listeners empty check [pass] +library/events/listeners.spec.ts › Array copy modification does not modify orig [pass] +library/events/listeners.spec.ts › EventEmitter listeners with one listener [pass] +library/events/listeners.spec.ts › EventEmitter with no members [pass] +library/events/listeners.spec.ts › Modify array copy after multiple adds [pass] +library/events/listeners.spec.ts › listeners and once [pass] +library/events/listeners.spec.ts › listeners on prototype [pass] +library/events/listeners.spec.ts › listeners with conflicting types [pass] +library/events/listeners.spec.ts › raw listeners [pass] +library/events/listeners.spec.ts › raw listeners order [pass] +library/events/max-listeners.spec.ts › emit maxListeners on e [pass] +library/events/method-names.spec.ts › EventEmitter prototype test [pass] +library/events/modify-in-emit.spec.ts › add and remove listeners [pass] +library/events/modify-in-emit.spec.ts › removing callbacks in emit [pass] +library/events/num-args.spec.ts › should work [pass] +library/events/once.spec.ts › once() has different code paths based on the number of arguments being emitted [pass] +library/events/once.spec.ts › should work [pass] +library/events/prepend.spec.ts › EventEmitter functionality [pass] +library/events/prepend.spec.ts › Verify that the listener must be a function [pass] +library/events/remove-all-listeners-wait.spec.ts › should not throw with ignoreErrors [pass] +library/events/remove-all-listeners-wait.spec.ts › should wait [pass] +library/events/remove-all-listeners-wait.spec.ts › should wait all [pass] +library/events/remove-all-listeners-wait.spec.ts › wait should throw [pass] +library/events/remove-all-listeners.spec.ts › listener count after removeAllListeners [pass] +library/events/remove-all-listeners.spec.ts › listeners [pass] +library/events/remove-all-listeners.spec.ts › removeAllListeners on undefined _events [pass] +library/events/remove-all-listeners.spec.ts › removeAllListeners removes all listeners [pass] +library/events/remove-all-listeners.spec.ts › removeAllListeners returns EventEmitter [pass] +library/events/remove-all-listeners.spec.ts › removeAllListeners with no event type [pass] +library/events/remove-listeners.spec.ts › Eighth test [pass] +library/events/remove-listeners.spec.ts › Fifth test [pass] +library/events/remove-listeners.spec.ts › First test [pass] +library/events/remove-listeners.spec.ts › Fourth test [pass] +library/events/remove-listeners.spec.ts › Ninth test [pass] +library/events/remove-listeners.spec.ts › Second test [pass] +library/events/remove-listeners.spec.ts › Seventh test [pass] +library/events/remove-listeners.spec.ts › Sixth test [pass] +library/events/remove-listeners.spec.ts › Tenth test [pass] +library/events/remove-listeners.spec.ts › Third test [pass] +library/events/set-max-listeners-side-effects.spec.ts › set max listeners test [pass] +library/events/special-event-names.spec.ts › should support special event names [pass] +library/events/subclass.spec.ts › MyEE2 instance [pass] +library/events/subclass.spec.ts › myee instance [pass] +library/events/symbols.spec.ts › should support symbols [pass] +library/favicon.spec.ts › should load svg favicon with prefer-color-scheme [unknown] +library/fetch-proxy.spec.ts › context request should pick up proxy credentials [timeout] +library/fetch-proxy.spec.ts › global request should pick up proxy credentials [pass] +library/fetch-proxy.spec.ts › should support proxy.bypass [pass] +library/fetch-proxy.spec.ts › should use socks proxy [pass] +library/fetch-proxy.spec.ts › should work with context level proxy [pass] +library/firefox/launcher.spec.ts › should pass firefox user preferences [fail] +library/firefox/launcher.spec.ts › should pass firefox user preferences in persistent [fail] +library/geolocation.spec.ts › should isolate contexts [timeout] +library/geolocation.spec.ts › should not modify passed default options object [pass] +library/geolocation.spec.ts › should throw when invalid longitude [fail] +library/geolocation.spec.ts › should throw with missing latitude [pass] +library/geolocation.spec.ts › should throw with missing longitude in default options [pass] +library/geolocation.spec.ts › should use context options [timeout] +library/geolocation.spec.ts › should use context options for popup [timeout] +library/geolocation.spec.ts › should work @smoke [timeout] +library/geolocation.spec.ts › watchPosition should be notified [timeout] +library/global-fetch-cookie.spec.ts › should do case-insensitive match of cookie domain [pass] +library/global-fetch-cookie.spec.ts › should do case-insensitive match of request domain [pass] +library/global-fetch-cookie.spec.ts › should export cookies to storage state [pass] +library/global-fetch-cookie.spec.ts › should filter outgoing cookies by domain [pass] +library/global-fetch-cookie.spec.ts › should filter outgoing cookies by path [pass] +library/global-fetch-cookie.spec.ts › should override cookie from Set-Cookie header [pass] +library/global-fetch-cookie.spec.ts › should override cookie from Set-Cookie header even if it expired [pass] +library/global-fetch-cookie.spec.ts › should preserve local storage on import/export of storage state [pass] +library/global-fetch-cookie.spec.ts › should remove cookie with expires far in the past [pass] +library/global-fetch-cookie.spec.ts › should remove cookie with negative max-age [pass] +library/global-fetch-cookie.spec.ts › should remove expired cookies [pass] +library/global-fetch-cookie.spec.ts › should send cookies from storage state [pass] +library/global-fetch-cookie.spec.ts › should send not expired cookies [pass] +library/global-fetch-cookie.spec.ts › should send secure cookie over http for localhost [pass] +library/global-fetch-cookie.spec.ts › should send secure cookie over https [pass] +library/global-fetch-cookie.spec.ts › should store cookie from Set-Cookie header [pass] +library/global-fetch-cookie.spec.ts › should store cookie from Set-Cookie header even if it contains equal signs [pass] +library/global-fetch-cookie.spec.ts › should work with empty storage state [pass] +library/global-fetch-cookie.spec.ts › storage state should round-trip through file [pass] +library/global-fetch.spec.ts › delete should work @smoke [pass] +library/global-fetch.spec.ts › fetch should work @smoke [pass] +library/global-fetch.spec.ts › get should work @smoke [pass] +library/global-fetch.spec.ts › head should work @smoke [pass] +library/global-fetch.spec.ts › patch should work @smoke [pass] +library/global-fetch.spec.ts › post should work @smoke [pass] +library/global-fetch.spec.ts › put should work @smoke [pass] +library/global-fetch.spec.ts › should abort redirected requests when context is disposed [pass] +library/global-fetch.spec.ts › should abort requests when context is disposed [pass] +library/global-fetch.spec.ts › should accept already serialized data as Buffer when content-type is application/json [pass] +library/global-fetch.spec.ts › should be able to construct with context options [pass] +library/global-fetch.spec.ts › should dispose global request [pass] +library/global-fetch.spec.ts › should have nice toString [pass] +library/global-fetch.spec.ts › should json stringify array body when content-type is application/json [pass] +library/global-fetch.spec.ts › should json stringify bool (false) body when content-type is application/json [pass] +library/global-fetch.spec.ts › should json stringify bool body when content-type is application/json [pass] +library/global-fetch.spec.ts › should json stringify literal string undefined body when content-type is application/json [pass] +library/global-fetch.spec.ts › should json stringify null body when content-type is application/json [pass] +library/global-fetch.spec.ts › should json stringify number (falsey) body when content-type is application/json [pass] +library/global-fetch.spec.ts › should json stringify number body when content-type is application/json [pass] +library/global-fetch.spec.ts › should json stringify object body when content-type is application/json [pass] +library/global-fetch.spec.ts › should json stringify string (falsey) body when content-type is application/json [pass] +library/global-fetch.spec.ts › should json stringify string body when content-type is application/json [pass] +library/global-fetch.spec.ts › should keep headers capitalization [pass] +library/global-fetch.spec.ts › should not double stringify array body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not double stringify bool (false) body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not double stringify bool body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not double stringify literal string undefined body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not double stringify null body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not double stringify number (falsey) body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not double stringify number body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not double stringify object body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not double stringify string (falsey) body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not double stringify string body when content-type is application/json [pass] +library/global-fetch.spec.ts › should not fail on empty body with encoding [pass] +library/global-fetch.spec.ts › should not follow redirects when maxRedirects is set to 0 [pass] +library/global-fetch.spec.ts › should propagate extra http headers with redirects [pass] +library/global-fetch.spec.ts › should propagate ignoreHTTPSErrors on redirects [pass] +library/global-fetch.spec.ts › should remove content-length from redirected post requests [pass] +library/global-fetch.spec.ts › should resolve url relative to global baseURL option [pass] +library/global-fetch.spec.ts › should retry ECONNRESET [pass] +library/global-fetch.spec.ts › should return body for failing requests [pass] +library/global-fetch.spec.ts › should return empty body [pass] +library/global-fetch.spec.ts › should return error with correct credentials and mismatching hostname [pass] +library/global-fetch.spec.ts › should return error with correct credentials and mismatching port [pass] +library/global-fetch.spec.ts › should return error with correct credentials and mismatching scheme [pass] +library/global-fetch.spec.ts › should return error with wrong credentials [pass] +library/global-fetch.spec.ts › should serialize post data on the client [pass] +library/global-fetch.spec.ts › should set playwright as user-agent [pass] +library/global-fetch.spec.ts › should support HTTPCredentials.send [pass] +library/global-fetch.spec.ts › should support WWW-Authenticate: Basic [pass] +library/global-fetch.spec.ts › should support global httpCredentials option [pass] +library/global-fetch.spec.ts › should support global ignoreHTTPSErrors option [pass] +library/global-fetch.spec.ts › should support global timeout option [pass] +library/global-fetch.spec.ts › should support global userAgent option [pass] +library/global-fetch.spec.ts › should throw after dispose [pass] +library/global-fetch.spec.ts › should throw an error when maxRedirects is exceeded [pass] +library/global-fetch.spec.ts › should throw an error when maxRedirects is less than 0 [pass] +library/global-fetch.spec.ts › should work with correct credentials and matching origin [pass] +library/global-fetch.spec.ts › should work with correct credentials and matching origin case insensitive [pass] +library/har.spec.ts › should attach content [fail] +library/har.spec.ts › should calculate time [pass] +library/har.spec.ts › should contain http2 for http2 requests [fail] +library/har.spec.ts › should filter by glob [pass] +library/har.spec.ts › should filter by regexp [pass] +library/har.spec.ts › should filter favicon and favicon redirects [unknown] +library/har.spec.ts › should have -1 _transferSize when its a failed request [pass] +library/har.spec.ts › should have browser [fail] +library/har.spec.ts › should have connection details [fail] +library/har.spec.ts › should have connection details for failed requests [fail] +library/har.spec.ts › should have connection details for redirects [fail] +library/har.spec.ts › should have different hars for concurrent contexts [pass] +library/har.spec.ts › should have pages [pass] +library/har.spec.ts › should have pages in persistent context [pass] +library/har.spec.ts › should have popup requests [fail] +library/har.spec.ts › should have security details [fail] +library/har.spec.ts › should have version and creator [pass] +library/har.spec.ts › should include API request [pass] +library/har.spec.ts › should include binary postData [fail] +library/har.spec.ts › should include content @smoke [fail] +library/har.spec.ts › should include cookies [pass] +library/har.spec.ts › should include form params [fail] +library/har.spec.ts › should include postData [fail] +library/har.spec.ts › should include query params [pass] +library/har.spec.ts › should include redirectURL [pass] +library/har.spec.ts › should include redirects from API request [pass] +library/har.spec.ts › should include request [pass] +library/har.spec.ts › should include response [pass] +library/har.spec.ts › should include secure set-cookies [fail] +library/har.spec.ts › should include set-cookies [fail] +library/har.spec.ts › should include set-cookies with comma [fail] +library/har.spec.ts › should include sizes [fail] +library/har.spec.ts › should not contain internal pages [pass] +library/har.spec.ts › should not hang on resources served from cache [pass] +library/har.spec.ts › should not hang on slow chunked response [fail] +library/har.spec.ts › should omit content [pass] +library/har.spec.ts › should omit content legacy [pass] +library/har.spec.ts › should record failed request headers [pass] +library/har.spec.ts › should record failed request overrides [timeout] +library/har.spec.ts › should record request overrides [timeout] +library/har.spec.ts › should report the correct _transferSize with PNG files [fail] +library/har.spec.ts › should report the correct request body size [pass] +library/har.spec.ts › should report the correct request body size when the bodySize is 0 [pass] +library/har.spec.ts › should report the correct response body size when the bodySize is 0 [pass] +library/har.spec.ts › should respect minimal mode for API Requests [pass] +library/har.spec.ts › should return receive time [fail] +library/har.spec.ts › should return security details directly from response [fail] +library/har.spec.ts › should return server address directly from response [fail] +library/har.spec.ts › should skip invalid Expires [pass] +library/har.spec.ts › should throw without path [pass] +library/har.spec.ts › should use attach mode for zip extension [fail] +library/har.spec.ts › should work with gzip compression [fail] +library/headful.spec.ts › Page.bringToFront should work [fail] +library/headful.spec.ts › headless and headful should use same default fonts [fail] +library/headful.spec.ts › should click background tab [fail] +library/headful.spec.ts › should click bottom row w/ infobar in OOPIF [timeout] +library/headful.spec.ts › should click in OOPIF [fail] +library/headful.spec.ts › should click when viewport size is larger than screen [fail] +library/headful.spec.ts › should close browser after context menu was triggered [pass] +library/headful.spec.ts › should close browser with beforeunload page [pass] +library/headful.spec.ts › should close browsercontext with pending beforeunload dialog [fail] +library/headful.spec.ts › should dispatch click events to oversized viewports [pass] +library/headful.spec.ts › should have default url when launching browser @smoke [pass] +library/headful.spec.ts › should not block third party SameSite=None cookies [fail] +library/headful.spec.ts › should not crash when creating second context [pass] +library/headful.spec.ts › should not override viewport size when passed null [pass] +library/headful.spec.ts › should(not) block third party cookies [pass] +library/hit-target.spec.ts › should block all events when hit target is wrong [pass] +library/hit-target.spec.ts › should block all events when hit target is wrong and element detaches [pass] +library/hit-target.spec.ts › should block click when mousedown fails [pass] +library/hit-target.spec.ts › should click an element inside closed shadow root [fail] +library/hit-target.spec.ts › should click in custom element [fail] +library/hit-target.spec.ts › should click in iframe with padding [fail] +library/hit-target.spec.ts › should click in iframe with padding 2 [fail] +library/hit-target.spec.ts › should click into frame inside closed shadow root [fail] +library/hit-target.spec.ts › should click the button again after document.write [pass] +library/hit-target.spec.ts › should click when element detaches in mousedown [pass] +library/hit-target.spec.ts › should detect overlaid element in a transformed iframe [fail] +library/hit-target.spec.ts › should detect overlay from another shadow root [fail] +library/hit-target.spec.ts › should not block programmatic events [pass] +library/hit-target.spec.ts › should not click an element overlaying iframe with the target [fail] +library/hit-target.spec.ts › should not click iframe overlaying the target [fail] +library/hit-target.spec.ts › should work with block inside inline [fail] +library/hit-target.spec.ts › should work with block inside inline in shadow dom [fail] +library/hit-target.spec.ts › should work with block-block-block inside inline-inline [fail] +library/hit-target.spec.ts › should work with drag and drop that moves the element under cursor [pass] +library/hit-target.spec.ts › should work with mui select [pass] +library/ignorehttpserrors.spec.ts › serviceWorker should intercept document request [fail] +library/ignorehttpserrors.spec.ts › should fail with WebSocket if not ignored [pass] +library/ignorehttpserrors.spec.ts › should isolate contexts [fail] +library/ignorehttpserrors.spec.ts › should work @smoke [fail] +library/ignorehttpserrors.spec.ts › should work with WebSocket [fail] +library/ignorehttpserrors.spec.ts › should work with mixed content [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should attribute navigation to click [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should await popup [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should check [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should check a radio button [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should check with keyboard [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should click [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should click after same-document navigation [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should click button with nested div [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should double click [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should emit single keyup on ArrowDown [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should fill [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should fill [contentEditable] [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should fill japanese text [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should fill textarea [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should fill textarea with new lines at the end [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should ignore AltGraph [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should ignore programmatic events [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should make a positioned click on a canvas [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should middle click [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should not target selector preview by text regexp [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should not throw csp directive violation errors [pass] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should press [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should record ArrowDown [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should record omnibox navigations after performAction [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should record omnibox navigations after recordAction [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should record slider [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should select [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should select with size attribute [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should uncheck [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should update selected element after pressing Tab [fail] +library/inspector/cli-codegen-1.spec.ts › cli codegen › should work with TrustedTypes [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › click should emit events in order [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should --save-trace [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should check input with chaining id [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should clear files [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should contain close page [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should contain open page [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should contain second page [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should download files [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should fill tricky characters [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should handle dialogs [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should handle history.postData [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should not clash pages [timeout] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should not lead to an error if html gets clicked [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should record navigations after identical pushState [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should record open in a new tab with url [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should reset hover model on action when element detaches [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should save assets via SIGINT [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should update active model on action [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should update hover model on action [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should upload a single file [fail] +library/inspector/cli-codegen-2.spec.ts › cli codegen › should upload multiple files [fail] +library/inspector/cli-codegen-2.spec.ts › should --test-id-attribute [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should assert value [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should assert value on disabled input [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should assert value on disabled select [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should assert visibility [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should click locator.first [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should click locator.nth [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should consume contextmenu events, despite a custom context menu [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should consume pointer events [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate frame locators [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate frame locators with id attribute [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate frame locators with name attribute [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate frame locators with special characters in name attribute [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate frame locators with testId [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate frame locators with title attribute [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate getByAltText [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate getByLabel [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate getByLabel without regex [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate getByPlaceholder [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate getByTestId [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should generate role locators undef frame locators [fail] +library/inspector/cli-codegen-3.spec.ts › cli codegen › should keep toolbar visible even if webpage erases content in hydration [fail] +library/inspector/cli-codegen-csharp.spec.ts › should not print context options method override in mstest if no options were passed [fail] +library/inspector/cli-codegen-csharp.spec.ts › should not print context options method override in nunit if no options were passed [fail] +library/inspector/cli-codegen-csharp.spec.ts › should print a valid basic program in mstest [fail] +library/inspector/cli-codegen-csharp.spec.ts › should print a valid basic program in nunit [fail] +library/inspector/cli-codegen-csharp.spec.ts › should print context options method override in mstest if options were passed [fail] +library/inspector/cli-codegen-csharp.spec.ts › should print context options method override in nunit if options were passed [fail] +library/inspector/cli-codegen-csharp.spec.ts › should print load/save storageState [fail] +library/inspector/cli-codegen-csharp.spec.ts › should print the correct context options for custom settings [fail] +library/inspector/cli-codegen-csharp.spec.ts › should print the correct context options when using a device [unknown] +library/inspector/cli-codegen-csharp.spec.ts › should print the correct context options when using a device and additional options [unknown] +library/inspector/cli-codegen-csharp.spec.ts › should print the correct imports and context options [fail] +library/inspector/cli-codegen-csharp.spec.ts › should work with --save-har [fail] +library/inspector/cli-codegen-java.spec.ts › should print a valid basic program in junit [fail] +library/inspector/cli-codegen-java.spec.ts › should print load/save storage_state [fail] +library/inspector/cli-codegen-java.spec.ts › should print the correct context options for custom settings [fail] +library/inspector/cli-codegen-java.spec.ts › should print the correct context options when using a device [unknown] +library/inspector/cli-codegen-java.spec.ts › should print the correct context options when using a device and additional options [unknown] +library/inspector/cli-codegen-java.spec.ts › should print the correct imports and context options [fail] +library/inspector/cli-codegen-java.spec.ts › should print the correct imports in junit [fail] +library/inspector/cli-codegen-java.spec.ts › should work with --save-har [fail] +library/inspector/cli-codegen-javascript.spec.ts › should print load/save storageState [fail] +library/inspector/cli-codegen-javascript.spec.ts › should print the correct context options for custom settings [fail] +library/inspector/cli-codegen-javascript.spec.ts › should print the correct context options when using a device [unknown] +library/inspector/cli-codegen-javascript.spec.ts › should print the correct context options when using a device and additional options [unknown] +library/inspector/cli-codegen-javascript.spec.ts › should print the correct imports and context options [fail] +library/inspector/cli-codegen-javascript.spec.ts › should save the codegen output to a file if specified [fail] +library/inspector/cli-codegen-pytest.spec.ts › should print the correct context options when using a device and lang [unknown] +library/inspector/cli-codegen-pytest.spec.ts › should print the correct imports and context options [fail] +library/inspector/cli-codegen-pytest.spec.ts › should save the codegen output to a file if specified [fail] +library/inspector/cli-codegen-python-async.spec.ts › should print load/save storage_state [fail] +library/inspector/cli-codegen-python-async.spec.ts › should print the correct context options for custom settings [fail] +library/inspector/cli-codegen-python-async.spec.ts › should print the correct context options when using a device [unknown] +library/inspector/cli-codegen-python-async.spec.ts › should print the correct context options when using a device and additional options [unknown] +library/inspector/cli-codegen-python-async.spec.ts › should print the correct imports and context options [fail] +library/inspector/cli-codegen-python-async.spec.ts › should save the codegen output to a file if specified [fail] +library/inspector/cli-codegen-python-async.spec.ts › should work with --save-har [fail] +library/inspector/cli-codegen-python.spec.ts › should print load/save storage_state [fail] +library/inspector/cli-codegen-python.spec.ts › should print the correct context options for custom settings [fail] +library/inspector/cli-codegen-python.spec.ts › should print the correct context options when using a device [unknown] +library/inspector/cli-codegen-python.spec.ts › should print the correct context options when using a device and additional options [unknown] +library/inspector/cli-codegen-python.spec.ts › should print the correct imports and context options [fail] +library/inspector/cli-codegen-python.spec.ts › should save the codegen output to a file if specified [fail] +library/inspector/cli-codegen-test.spec.ts › should print load storageState [fail] +library/inspector/cli-codegen-test.spec.ts › should print the correct context options for custom settings [fail] +library/inspector/cli-codegen-test.spec.ts › should print the correct context options when using a device [unknown] +library/inspector/cli-codegen-test.spec.ts › should print the correct context options when using a device and additional options [unknown] +library/inspector/cli-codegen-test.spec.ts › should print the correct imports and context options [fail] +library/inspector/cli-codegen-test.spec.ts › should work with --save-har [fail] +library/inspector/console-api.spec.ts › expected properties on playwright object [pass] +library/inspector/console-api.spec.ts › should support locator.and() [fail] +library/inspector/console-api.spec.ts › should support locator.or() [fail] +library/inspector/console-api.spec.ts › should support playwright.$, playwright.$$ [pass] +library/inspector/console-api.spec.ts › should support playwright.getBy* [fail] +library/inspector/console-api.spec.ts › should support playwright.locator({ has }) [fail] +library/inspector/console-api.spec.ts › should support playwright.locator({ hasNot }) [fail] +library/inspector/console-api.spec.ts › should support playwright.locator.value [fail] +library/inspector/console-api.spec.ts › should support playwright.locator.values [fail] +library/inspector/console-api.spec.ts › should support playwright.selector [pass] +library/inspector/pause.spec.ts › pause › should hide internal calls [pass] +library/inspector/pause.spec.ts › pause › should highlight locators with custom testId [fail] +library/inspector/pause.spec.ts › pause › should highlight on explore [fail] +library/inspector/pause.spec.ts › pause › should highlight on explore (csharp) [fail] +library/inspector/pause.spec.ts › pause › should highlight pointer, only in main frame [fail] +library/inspector/pause.spec.ts › pause › should highlight waitForEvent [fail] +library/inspector/pause.spec.ts › pause › should not prevent key events [fail] +library/inspector/pause.spec.ts › pause › should pause after a navigation [pass] +library/inspector/pause.spec.ts › pause › should pause and resume the script [pass] +library/inspector/pause.spec.ts › pause › should pause and resume the script with keyboard shortcut [pass] +library/inspector/pause.spec.ts › pause › should pause on context close [pass] +library/inspector/pause.spec.ts › pause › should pause on next pause [pass] +library/inspector/pause.spec.ts › pause › should pause on page close [pass] +library/inspector/pause.spec.ts › pause › should populate log [fail] +library/inspector/pause.spec.ts › pause › should populate log with error [fail] +library/inspector/pause.spec.ts › pause › should populate log with error in waitForEvent [fail] +library/inspector/pause.spec.ts › pause › should populate log with waitForEvent [fail] +library/inspector/pause.spec.ts › pause › should resume from console [pass] +library/inspector/pause.spec.ts › pause › should show expect.toHaveText [fail] +library/inspector/pause.spec.ts › pause › should show source [pass] +library/inspector/pause.spec.ts › pause › should skip input when resuming [fail] +library/inspector/pause.spec.ts › pause › should step [fail] +library/inspector/pause.spec.ts › pause › should step with keyboard shortcut [fail] +library/inspector/pause.spec.ts › should not reset timeouts [pass] +library/inspector/pause.spec.ts › should resume when closing inspector [pass] +library/launcher.spec.ts › should have a devices object [pass] +library/launcher.spec.ts › should have an errors object [pass] +library/launcher.spec.ts › should kill browser process on timeout after close [pass] +library/launcher.spec.ts › should throw a friendly error if its headed and there is no xserver on linux running [fail] +library/locator-generator.spec.ts › asLocator internal:and [pass] +library/locator-generator.spec.ts › asLocator internal:chain [pass] +library/locator-generator.spec.ts › asLocator internal:or [pass] +library/locator-generator.spec.ts › asLocator xpath [pass] +library/locator-generator.spec.ts › generate multiple locators [pass] +library/locator-generator.spec.ts › parse locators strictly [pass] +library/locator-generator.spec.ts › parseLocator css [pass] +library/locator-generator.spec.ts › parseLocator quotes [pass] +library/locator-generator.spec.ts › reverse engineer frameLocator [pass] +library/locator-generator.spec.ts › reverse engineer getByRole [pass] +library/locator-generator.spec.ts › reverse engineer has [pass] +library/locator-generator.spec.ts › reverse engineer has + hasText [pass] +library/locator-generator.spec.ts › reverse engineer hasNot [pass] +library/locator-generator.spec.ts › reverse engineer hasNotText [pass] +library/locator-generator.spec.ts › reverse engineer hasText [pass] +library/locator-generator.spec.ts › reverse engineer ignore-case locators [pass] +library/locator-generator.spec.ts › reverse engineer internal:has-text locators [fail] +library/locator-generator.spec.ts › reverse engineer locators [pass] +library/locator-generator.spec.ts › reverse engineer locators with regex [pass] +library/locator-generator.spec.ts › reverse engineer ordered locators [pass] +library/logger.spec.ts › should log @smoke [pass] +library/logger.spec.ts › should log context-level [fail] +library/modernizr.spec.ts › Mobile Safari [unknown] +library/modernizr.spec.ts › Safari Desktop [unknown] +library/page-clock.frozen.spec.ts › clock should be frozen [unknown] +library/page-clock.frozen.spec.ts › clock should be realtime [unknown] +library/page-clock.spec.ts › Date.now › check Date.now is an integer [pass] +library/page-clock.spec.ts › Date.now › check Date.now is an integer (2) [pass] +library/page-clock.spec.ts › fastForward › ignores timers which wouldn't be run [pass] +library/page-clock.spec.ts › fastForward › pushes back execution time for skipped timers [pass] +library/page-clock.spec.ts › fastForward › supports string time arguments [pass] +library/page-clock.spec.ts › popup › should not run time before popup on pause [pass] +library/page-clock.spec.ts › popup › should run time before popup [timeout] +library/page-clock.spec.ts › popup › should tick after popup [timeout] +library/page-clock.spec.ts › popup › should tick before popup [timeout] +library/page-clock.spec.ts › runFor › creates updated Date while ticking [pass] +library/page-clock.spec.ts › runFor › does not trigger without sufficient delay [pass] +library/page-clock.spec.ts › runFor › passes 1 minute [pass] +library/page-clock.spec.ts › runFor › passes 2 hours, 34 minutes and 10 seconds [pass] +library/page-clock.spec.ts › runFor › passes 8 seconds [pass] +library/page-clock.spec.ts › runFor › returns the current now value [pass] +library/page-clock.spec.ts › runFor › throws for invalid format [pass] +library/page-clock.spec.ts › runFor › triggers after sufficient delay [pass] +library/page-clock.spec.ts › runFor › triggers event when some throw [fail] +library/page-clock.spec.ts › runFor › triggers immediately without specified delay [pass] +library/page-clock.spec.ts › runFor › triggers multiple simultaneous timers [pass] +library/page-clock.spec.ts › runFor › triggers simultaneous timers [pass] +library/page-clock.spec.ts › runFor › waits after setTimeout was called [pass] +library/page-clock.spec.ts › setFixedTime › allows installing fake timers after settings time [pass] +library/page-clock.spec.ts › setFixedTime › allows setting time multiple times [pass] +library/page-clock.spec.ts › setFixedTime › does not fake methods [pass] +library/page-clock.spec.ts › setFixedTime › fixed time is not affected by clock manipulation [pass] +library/page-clock.spec.ts › stubTimers › fakes Date constructor [pass] +library/page-clock.spec.ts › stubTimers › global fake setTimeout should return id [pass] +library/page-clock.spec.ts › stubTimers › replaces global clearInterval [pass] +library/page-clock.spec.ts › stubTimers › replaces global clearTimeout [pass] +library/page-clock.spec.ts › stubTimers › replaces global performance.now [pass] +library/page-clock.spec.ts › stubTimers › replaces global performance.timeOrigin [pass] +library/page-clock.spec.ts › stubTimers › replaces global setInterval [pass] +library/page-clock.spec.ts › stubTimers › replaces global setTimeout [pass] +library/page-clock.spec.ts › stubTimers › sets initial timestamp [pass] +library/page-clock.spec.ts › stubTimers › should throw for invalid date [pass] +library/page-clock.spec.ts › while on pause › fastForward should not run nested immediate [pass] +library/page-clock.spec.ts › while on pause › runFor should not run nested immediate [pass] +library/page-clock.spec.ts › while on pause › runFor should not run nested immediate from microtask [pass] +library/page-clock.spec.ts › while running › should fastForward [pass] +library/page-clock.spec.ts › while running › should fastForwardTo [pass] +library/page-clock.spec.ts › while running › should pause [pass] +library/page-clock.spec.ts › while running › should pause and fastForward [pass] +library/page-clock.spec.ts › while running › should progress time [pass] +library/page-clock.spec.ts › while running › should runFor [pass] +library/page-clock.spec.ts › while running › should set system time on pause [pass] +library/page-event-crash.spec.ts › should be able to close context when page crashes [fail] +library/page-event-crash.spec.ts › should cancel navigation when page crashes [fail] +library/page-event-crash.spec.ts › should cancel waitForEvent when page crashes [fail] +library/page-event-crash.spec.ts › should emit crash event when page crashes [fail] +library/page-event-crash.spec.ts › should throw on any action after page crashes [fail] +library/pdf.spec.ts › should be able to generate outline [unknown] +library/pdf.spec.ts › should be able to save file [unknown] +library/permissions.spec.ts › permissions › should accumulate when adding [fail] +library/permissions.spec.ts › permissions › should be prompt by default [pass] +library/permissions.spec.ts › permissions › should clear permissions [fail] +library/permissions.spec.ts › permissions › should deny permission when not listed [fail] +library/permissions.spec.ts › permissions › should fail when bad permission is given [fail] +library/permissions.spec.ts › permissions › should grant geolocation permission when origin is listed [fail] +library/permissions.spec.ts › permissions › should grant notifications permission when listed [fail] +library/permissions.spec.ts › permissions › should grant permission when creating context [fail] +library/permissions.spec.ts › permissions › should grant permission when listed for all domains [fail] +library/permissions.spec.ts › permissions › should isolate permissions between browser contexts [fail] +library/permissions.spec.ts › permissions › should prompt for geolocation permission when origin is not listed [pass] +library/permissions.spec.ts › permissions › should reset permissions [fail] +library/permissions.spec.ts › permissions › should trigger permission onchange [fail] +library/permissions.spec.ts › should support clipboard read [fail] +library/permissions.spec.ts › storage access [unknown] +library/popup.spec.ts › BrowserContext.addInitScript should apply to a cross-process popup [pass] +library/popup.spec.ts › BrowserContext.addInitScript should apply to an in-process popup [fail] +library/popup.spec.ts › should expose function from browser context [fail] +library/popup.spec.ts › should inherit extra headers from browser context [fail] +library/popup.spec.ts › should inherit http credentials from browser context [pass] +library/popup.spec.ts › should inherit offline from browser context [fail] +library/popup.spec.ts › should inherit touch support from browser context [fail] +library/popup.spec.ts › should inherit user agent from browser context @smoke [fail] +library/popup.spec.ts › should inherit viewport size from browser context [fail] +library/popup.spec.ts › should not dispatch binding on a closed page [fail] +library/popup.spec.ts › should not throttle rAF in the opener page [timeout] +library/popup.spec.ts › should not throw when click closes popup [timeout] +library/popup.spec.ts › should respect routes from browser context [fail] +library/popup.spec.ts › should respect routes from browser context when using window.open [pass] +library/popup.spec.ts › should use viewport size from window features [timeout] +library/proxy-pattern.spec.ts › socks proxy patter matcher [pass] +library/proxy.spec.ts › does launch without a port [pass] +library/proxy.spec.ts › should authenticate [fail] +library/proxy.spec.ts › should exclude patterns [pass] +library/proxy.spec.ts › should proxy local network requests › by default › link-local [pass] +library/proxy.spec.ts › should proxy local network requests › by default › localhost [fail] +library/proxy.spec.ts › should proxy local network requests › by default › loopback address [fail] +library/proxy.spec.ts › should proxy local network requests › with other bypasses › link-local [pass] +library/proxy.spec.ts › should proxy local network requests › with other bypasses › localhost [fail] +library/proxy.spec.ts › should proxy local network requests › with other bypasses › loopback address [fail] +library/proxy.spec.ts › should throw for bad server value [pass] +library/proxy.spec.ts › should use SOCKS proxy for websocket requests [pass] +library/proxy.spec.ts › should use proxy @smoke [fail] +library/proxy.spec.ts › should use proxy for second page [fail] +library/proxy.spec.ts › should use proxy with emulated user agent [unknown] +library/proxy.spec.ts › should use socks proxy [fail] +library/proxy.spec.ts › should use socks proxy in second page [fail] +library/proxy.spec.ts › should work with IP:PORT notion [fail] +library/proxy.spec.ts › should work with authenticate followed by redirect [fail] +library/resource-timing.spec.ts › should work @smoke [pass] +library/resource-timing.spec.ts › should work for SSL [fail] +library/resource-timing.spec.ts › should work for redirect [pass] +library/resource-timing.spec.ts › should work for subresource [pass] +library/resource-timing.spec.ts › should work when serving from memory cache [pass] +library/role-utils.spec.ts › accessible name nested treeitem [fail] +library/role-utils.spec.ts › accessible name with slots [fail] +library/role-utils.spec.ts › axe-core accessible-text [fail] +library/role-utils.spec.ts › axe-core implicit-role [fail] +library/role-utils.spec.ts › control embedded in a label [fail] +library/role-utils.spec.ts › control embedded in a target element [fail] +library/role-utils.spec.ts › display:contents should be visible when contents are visible [fail] +library/role-utils.spec.ts › label/labelled-by aria-hidden with descendants [fail] +library/role-utils.spec.ts › native controls [fail] +library/role-utils.spec.ts › native controls labelled-by [fail] +library/role-utils.spec.ts › own aria-label concatenated with aria-labelledby [fail] +library/role-utils.spec.ts › should ignore stylesheet from hidden aria-labelledby subtree [fail] +library/role-utils.spec.ts › should not include hidden pseudo into accessible name [fail] +library/role-utils.spec.ts › should work with form and tricky input names [fail] +library/role-utils.spec.ts › svg role=presentation [fail] +library/role-utils.spec.ts › svg title [fail] +library/role-utils.spec.ts › wpt accname #0 [pass] +library/role-utils.spec.ts › wpt accname #1 [pass] +library/role-utils.spec.ts › wpt accname #2 [fail] +library/role-utils.spec.ts › wpt accname #3 [pass] +library/role-utils.spec.ts › wpt accname non-manual [pass] +library/route-web-socket.spec.ts › no-match › should work when connection errors out [pass] +library/route-web-socket.spec.ts › no-match › should work with binaryType=arraybuffer [pass] +library/route-web-socket.spec.ts › no-match › should work with binaryType=blob [pass] +library/route-web-socket.spec.ts › no-match › should work with client-side close [pass] +library/route-web-socket.spec.ts › no-match › should work with error after successful open [fail] +library/route-web-socket.spec.ts › no-match › should work with text message [pass] +library/route-web-socket.spec.ts › no-mock › should work when connection errors out [pass] +library/route-web-socket.spec.ts › no-mock › should work with binaryType=arraybuffer [pass] +library/route-web-socket.spec.ts › no-mock › should work with binaryType=blob [pass] +library/route-web-socket.spec.ts › no-mock › should work with client-side close [pass] +library/route-web-socket.spec.ts › no-mock › should work with error after successful open [fail] +library/route-web-socket.spec.ts › no-mock › should work with text message [pass] +library/route-web-socket.spec.ts › pass-through › should work when connection errors out [pass] +library/route-web-socket.spec.ts › pass-through › should work with binaryType=arraybuffer [pass] +library/route-web-socket.spec.ts › pass-through › should work with binaryType=blob [pass] +library/route-web-socket.spec.ts › pass-through › should work with client-side close [pass] +library/route-web-socket.spec.ts › pass-through › should work with error after successful open [fail] +library/route-web-socket.spec.ts › pass-through › should work with text message [pass] +library/route-web-socket.spec.ts › should emit close upon frame detach [pass] +library/route-web-socket.spec.ts › should emit close upon frame navigation [pass] +library/route-web-socket.spec.ts › should not throw after page closure [pass] +library/route-web-socket.spec.ts › should pattern match [pass] +library/route-web-socket.spec.ts › should route on context [pass] +library/route-web-socket.spec.ts › should work with server [pass] +library/route-web-socket.spec.ts › should work with ws.close [pass] +library/route-web-socket.spec.ts › should work without server [pass] +library/screenshot.spec.ts › element screenshot › element screenshot should work with a mobile viewport [fail] +library/screenshot.spec.ts › element screenshot › element screenshot should work with device scale factor [fail] +library/screenshot.spec.ts › element screenshot › element screenshots should handle vh units [pass] +library/screenshot.spec.ts › element screenshot › page screenshot should capture css transform with device pixels [fail] +library/screenshot.spec.ts › element screenshot › should capture full element when larger than viewport with device scale factor [fail] +library/screenshot.spec.ts › element screenshot › should capture full element when larger than viewport with device scale factor and scale:css [fail] +library/screenshot.spec.ts › element screenshot › should restore default viewport after fullPage screenshot [pass] +library/screenshot.spec.ts › element screenshot › should restore viewport after element screenshot and exception [fail] +library/screenshot.spec.ts › element screenshot › should restore viewport after page screenshot and exception [pass] +library/screenshot.spec.ts › element screenshot › should restore viewport after page screenshot and timeout [pass] +library/screenshot.spec.ts › element screenshot › should take element screenshot when default viewport is null and restore back [fail] +library/screenshot.spec.ts › element screenshot › should take fullPage screenshots when default viewport is null [pass] +library/screenshot.spec.ts › element screenshot › should take screenshots when default viewport is null [fail] +library/screenshot.spec.ts › element screenshot › should work if the main resource hangs [fail] +library/screenshot.spec.ts › page screenshot › should handle vh units [pass] +library/screenshot.spec.ts › page screenshot › should run in parallel in multiple pages [fail] +library/screenshot.spec.ts › page screenshot › should throw if screenshot size is too large with device scale factor [fail] +library/screenshot.spec.ts › page screenshot › should work with a mobile viewport [fail] +library/screenshot.spec.ts › page screenshot › should work with a mobile viewport and clip [fail] +library/screenshot.spec.ts › page screenshot › should work with a mobile viewport and fullPage [fail] +library/screenshot.spec.ts › page screenshot › should work with device scale factor [fail] +library/screenshot.spec.ts › page screenshot › should work with device scale factor and clip [fail] +library/screenshot.spec.ts › page screenshot › should work with device scale factor and scale:css [fail] +library/screenshot.spec.ts › page screenshot › should work with device scale factor, clip and scale:css [fail] +library/screenshot.spec.ts › page screenshot › should work with large size [pass] +library/selector-generator.spec.ts › selector generator › should accept valid aria-label for candidate consideration [fail] +library/selector-generator.spec.ts › selector generator › should accept valid data-test-id for candidate consideration [fail] +library/selector-generator.spec.ts › selector generator › should chain text after parent [fail] +library/selector-generator.spec.ts › selector generator › should escape text with quote [fail] +library/selector-generator.spec.ts › selector generator › should escape text with slash [fail] +library/selector-generator.spec.ts › selector generator › should find text in shadow dom [fail] +library/selector-generator.spec.ts › selector generator › should generate exact label when necessary [fail] +library/selector-generator.spec.ts › selector generator › should generate exact placeholder when necessary [fail] +library/selector-generator.spec.ts › selector generator › should generate exact role when necessary [fail] +library/selector-generator.spec.ts › selector generator › should generate exact text when necessary [fail] +library/selector-generator.spec.ts › selector generator › should generate exact title when necessary [fail] +library/selector-generator.spec.ts › selector generator › should generate label selector [fail] +library/selector-generator.spec.ts › selector generator › should generate multiple: noId [fail] +library/selector-generator.spec.ts › selector generator › should generate multiple: noId noText [fail] +library/selector-generator.spec.ts › selector generator › should generate multiple: noText in role [fail] +library/selector-generator.spec.ts › selector generator › should generate multiple: noText in text [fail] +library/selector-generator.spec.ts › selector generator › should generate relative selector [fail] +library/selector-generator.spec.ts › selector generator › should generate text and normalize whitespace [fail] +library/selector-generator.spec.ts › selector generator › should generate text for [fail] +library/selector-generator.spec.ts › selector generator › should generate title selector [fail] +library/selector-generator.spec.ts › selector generator › should handle first non-unique data-testid [fail] +library/selector-generator.spec.ts › selector generator › should handle second non-unique data-testid [fail] +library/selector-generator.spec.ts › selector generator › should ignore empty aria-label for candidate consideration [fail] +library/selector-generator.spec.ts › selector generator › should ignore empty data-test-id for candidate consideration [fail] +library/selector-generator.spec.ts › selector generator › should ignore empty role for candidate consideration [fail] +library/selector-generator.spec.ts › selector generator › should match in deep shadow dom [fail] +library/selector-generator.spec.ts › selector generator › should match in shadow dom [fail] +library/selector-generator.spec.ts › selector generator › should not accept invalid role for candidate consideration [fail] +library/selector-generator.spec.ts › selector generator › should not escape spaces inside named attr selectors [fail] +library/selector-generator.spec.ts › selector generator › should not escape text with >> [fail] +library/selector-generator.spec.ts › selector generator › should not improve guid text [fail] +library/selector-generator.spec.ts › selector generator › should not prefer zero-sized button over inner span [fail] +library/selector-generator.spec.ts › selector generator › should not use generated id [fail] +library/selector-generator.spec.ts › selector generator › should not use input[value] [fail] +library/selector-generator.spec.ts › selector generator › should not use text for select [fail] +library/selector-generator.spec.ts › selector generator › should prefer button over inner span [fail] +library/selector-generator.spec.ts › selector generator › should prefer data-testid [fail] +library/selector-generator.spec.ts › selector generator › should prefer role other input[type] [fail] +library/selector-generator.spec.ts › selector generator › should prefer role=button over inner span [fail] +library/selector-generator.spec.ts › selector generator › should prioritise attributes correctly › name [fail] +library/selector-generator.spec.ts › selector generator › should prioritise attributes correctly › placeholder [fail] +library/selector-generator.spec.ts › selector generator › should prioritise attributes correctly › role [fail] +library/selector-generator.spec.ts › selector generator › should prioritise attributes correctly › type [fail] +library/selector-generator.spec.ts › selector generator › should properly join child selectors under nested ordinals [fail] +library/selector-generator.spec.ts › selector generator › should separate selectors by >> [fail] +library/selector-generator.spec.ts › selector generator › should trim long text [fail] +library/selector-generator.spec.ts › selector generator › should trim text [fail] +library/selector-generator.spec.ts › selector generator › should try to improve label text by shortening [fail] +library/selector-generator.spec.ts › selector generator › should try to improve role name [fail] +library/selector-generator.spec.ts › selector generator › should try to improve text [fail] +library/selector-generator.spec.ts › selector generator › should try to improve text by shortening [fail] +library/selector-generator.spec.ts › selector generator › should use data-testid in strict errors [fail] +library/selector-generator.spec.ts › selector generator › should use internal:has-text [fail] +library/selector-generator.spec.ts › selector generator › should use internal:has-text with regexp [fail] +library/selector-generator.spec.ts › selector generator › should use internal:has-text with regexp with a quote [fail] +library/selector-generator.spec.ts › selector generator › should use nested ordinals [fail] +library/selector-generator.spec.ts › selector generator › should use ordinal for identical nodes [fail] +library/selector-generator.spec.ts › selector generator › should use parent text [fail] +library/selector-generator.spec.ts › selector generator › should use readable id [fail] +library/selector-generator.spec.ts › selector generator › should use the name attributes for elements that can have it [fail] +library/selector-generator.spec.ts › selector generator › should work in dynamic iframes without navigation [fail] +library/selector-generator.spec.ts › selector generator › should work with tricky attributes [fail] +library/selector-generator.spec.ts › selector generator › should work without CSS.escape [fail] +library/selectors-register.spec.ts › should handle errors [pass] +library/selectors-register.spec.ts › should not rely on engines working from the root [fail] +library/selectors-register.spec.ts › should throw a nice error if the selector returns a bad value [pass] +library/selectors-register.spec.ts › should work [fail] +library/selectors-register.spec.ts › should work in main and isolated world [fail] +library/selectors-register.spec.ts › should work when registered on global [fail] +library/selectors-register.spec.ts › should work with path [fail] +library/shared-worker.spec.ts › should survive shared worker restart [pass] +library/signals.spec.ts › should close the browser when the node process closes [timeout] +library/signals.spec.ts › should remove temp dir on process.exit [timeout] +library/signals.spec.ts › signals › should close the browser on SIGHUP [timeout] +library/signals.spec.ts › signals › should close the browser on SIGINT [timeout] +library/signals.spec.ts › signals › should close the browser on SIGTERM [timeout] +library/signals.spec.ts › signals › should kill the browser on SIGINT + SIGTERM [timeout] +library/signals.spec.ts › signals › should kill the browser on SIGTERM + SIGINT [timeout] +library/signals.spec.ts › signals › should kill the browser on double SIGINT and remove temp dir [timeout] +library/signals.spec.ts › signals › should not prevent default SIGTERM handling after browser close [timeout] +library/signals.spec.ts › signals › should report browser close signal 2 [timeout] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo check [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo click [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo dblclick [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo dispatchEvent [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo fill [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo focus [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo hover [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo press [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo selectOption [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo setInputFiles [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo type [fail] +library/slowmo.spec.ts › slowMo › ElementHandle SlowMo uncheck [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo check [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo click [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo dblclick [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo dispatchEvent [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo fill [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo focus [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo goto [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo hover [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo press [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo selectOption [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo setInputFiles [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo type [fail] +library/slowmo.spec.ts › slowMo › Frame SlowMo uncheck [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo check [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo click [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo dblclick [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo dispatchEvent [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo fill [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo focus [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo goto [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo hover [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo press [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo reload [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo selectOption [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo setInputFiles [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo type [fail] +library/slowmo.spec.ts › slowMo › Page SlowMo uncheck [fail] +library/snapshotter.spec.ts › snapshots › empty adopted style sheets should not prevent node refs [fail] +library/snapshotter.spec.ts › snapshots › should capture frame [pass] +library/snapshotter.spec.ts › snapshots › should capture iframe [pass] +library/snapshotter.spec.ts › snapshots › should capture iframe with srcdoc [pass] +library/snapshotter.spec.ts › snapshots › should capture resources [fail] +library/snapshotter.spec.ts › snapshots › should capture snapshot target [fail] +library/snapshotter.spec.ts › snapshots › should collect multiple [fail] +library/snapshotter.spec.ts › snapshots › should collect on attribute change [fail] +library/snapshotter.spec.ts › snapshots › should collect snapshot [fail] +library/snapshotter.spec.ts › snapshots › should have a custom doctype [fail] +library/snapshotter.spec.ts › snapshots › should not navigate on anchor clicks [fail] +library/snapshotter.spec.ts › snapshots › should preserve BASE and other content on reset [pass] +library/snapshotter.spec.ts › snapshots › should replace meta charset attr that specifies charset [fail] +library/snapshotter.spec.ts › snapshots › should replace meta content attr that specifies charset [fail] +library/snapshotter.spec.ts › snapshots › should respect CSSOM change through CSSGroupingRule [fail] +library/snapshotter.spec.ts › snapshots › should respect attr removal [fail] +library/snapshotter.spec.ts › snapshots › should respect inline CSSOM change [fail] +library/snapshotter.spec.ts › snapshots › should respect node removal [fail] +library/snapshotter.spec.ts › snapshots › should respect subresource CSSOM change [fail] +library/tap.spec.ts › locators › should send all of the correct events [fail] +library/tap.spec.ts › should not send mouse events touchstart is canceled [fail] +library/tap.spec.ts › should not send mouse events when touchend is canceled [fail] +library/tap.spec.ts › should not wait for a navigation caused by a tap [fail] +library/tap.spec.ts › should send all of the correct events @smoke [fail] +library/tap.spec.ts › should send well formed touch points [fail] +library/tap.spec.ts › should wait until an element is visible to tap it [fail] +library/tap.spec.ts › should work with modifiers [fail] +library/tap.spec.ts › trial run should not tap [fail] +library/trace-viewer.spec.ts › should allow hiding route actions [unknown] +library/trace-viewer.spec.ts › should allow showing screenshots instead of snapshots [unknown] +library/trace-viewer.spec.ts › should capture data-url svg iframe [unknown] +library/trace-viewer.spec.ts › should capture iframe with sandbox attribute [unknown] +library/trace-viewer.spec.ts › should complain about newer version of trace in old viewer [unknown] +library/trace-viewer.spec.ts › should contain action info [fail] +library/trace-viewer.spec.ts › should contain adopted style sheets [fail] +library/trace-viewer.spec.ts › should display language-specific locators [unknown] +library/trace-viewer.spec.ts › should display waitForLoadState even if did not wait for it [unknown] +library/trace-viewer.spec.ts › should filter network requests by resource type [fail] +library/trace-viewer.spec.ts › should filter network requests by url [unknown] +library/trace-viewer.spec.ts › should follow redirects [unknown] +library/trace-viewer.spec.ts › should handle case where neither snapshots nor screenshots exist [fail] +library/trace-viewer.spec.ts › should handle file URIs [fail] +library/trace-viewer.spec.ts › should handle multiple headers [unknown] +library/trace-viewer.spec.ts › should handle src=blob [unknown] +library/trace-viewer.spec.ts › should have correct snapshot size [fail] +library/trace-viewer.spec.ts › should have correct stack trace [unknown] +library/trace-viewer.spec.ts › should have network request overrides [fail] +library/trace-viewer.spec.ts › should have network request overrides 2 [unknown] +library/trace-viewer.spec.ts › should have network requests [unknown] +library/trace-viewer.spec.ts › should highlight expect failure [unknown] +library/trace-viewer.spec.ts › should highlight locator in iframe while typing [unknown] +library/trace-viewer.spec.ts › should highlight target element in shadow dom [unknown] +library/trace-viewer.spec.ts › should highlight target elements [fail] +library/trace-viewer.spec.ts › should ignore 304 responses [unknown] +library/trace-viewer.spec.ts › should include metainfo [unknown] +library/trace-viewer.spec.ts › should include requestUrl in route.abort [unknown] +library/trace-viewer.spec.ts › should include requestUrl in route.continue [unknown] +library/trace-viewer.spec.ts › should include requestUrl in route.fulfill [unknown] +library/trace-viewer.spec.ts › should not crash with broken locator [fail] +library/trace-viewer.spec.ts › should open console errors on click [fail] +library/trace-viewer.spec.ts › should open simple trace viewer [fail] +library/trace-viewer.spec.ts › should open snapshot in new browser context [unknown] +library/trace-viewer.spec.ts › should open trace viewer on specific host [unknown] +library/trace-viewer.spec.ts › should open trace-1.31 [unknown] +library/trace-viewer.spec.ts › should open trace-1.37 [fail] +library/trace-viewer.spec.ts › should open two trace files [fail] +library/trace-viewer.spec.ts › should open two trace files of the same test [unknown] +library/trace-viewer.spec.ts › should open two trace viewers [unknown] +library/trace-viewer.spec.ts › should pick locator [fail] +library/trace-viewer.spec.ts › should pick locator in iframe [fail] +library/trace-viewer.spec.ts › should popup snapshot [fail] +library/trace-viewer.spec.ts › should prefer later resource request with the same method [unknown] +library/trace-viewer.spec.ts › should preserve currentSrc [unknown] +library/trace-viewer.spec.ts › should preserve noscript when javascript is disabled [unknown] +library/trace-viewer.spec.ts › should properly synchronize local and remote time [unknown] +library/trace-viewer.spec.ts › should register custom elements [unknown] +library/trace-viewer.spec.ts › should remove noscript by default [fail] +library/trace-viewer.spec.ts › should remove noscript when javaScriptEnabled is set to true [unknown] +library/trace-viewer.spec.ts › should render console [unknown] +library/trace-viewer.spec.ts › should render network bars [unknown] +library/trace-viewer.spec.ts › should restore control values [unknown] +library/trace-viewer.spec.ts › should restore scroll positions [unknown] +library/trace-viewer.spec.ts › should serve css without content-type [unknown] +library/trace-viewer.spec.ts › should serve overridden request [fail] +library/trace-viewer.spec.ts › should show action source [fail] +library/trace-viewer.spec.ts › should show baseURL in metadata pane [fail] +library/trace-viewer.spec.ts › should show correct request start time [unknown] +library/trace-viewer.spec.ts › should show empty trace viewer [fail] +library/trace-viewer.spec.ts › should show font preview [unknown] +library/trace-viewer.spec.ts › should show null as a param [unknown] +library/trace-viewer.spec.ts › should show only one pointer with multilevel iframes [unknown] +library/trace-viewer.spec.ts › should show params and return value [unknown] +library/trace-viewer.spec.ts › should show similar actions from library-only trace [fail] +library/trace-viewer.spec.ts › should show snapshot URL [unknown] +library/trace-viewer.spec.ts › should update highlight when typing [unknown] +library/trace-viewer.spec.ts › should work with adopted style sheets and all: unset [unknown] +library/trace-viewer.spec.ts › should work with adopted style sheets and replace/replaceSync [unknown] +library/trace-viewer.spec.ts › should work with meta CSP [fail] +library/trace-viewer.spec.ts › should work with nesting CSS selectors [fail] +library/tracing.spec.ts › should collect sources [fail] +library/tracing.spec.ts › should collect trace with resources, but no js [fail] +library/tracing.spec.ts › should collect two traces [fail] +library/tracing.spec.ts › should exclude internal pages [pass] +library/tracing.spec.ts › should export trace concurrently to second navigation [pass] +library/tracing.spec.ts › should flush console events on tracing stop [pass] +library/tracing.spec.ts › should hide internal stack frames [fail] +library/tracing.spec.ts › should hide internal stack frames in expect [fail] +library/tracing.spec.ts › should ignore iframes in head [pass] +library/tracing.spec.ts › should include context API requests [pass] +library/tracing.spec.ts › should include interrupted actions [fail] +library/tracing.spec.ts › should not collect snapshots by default [fail] +library/tracing.spec.ts › should not crash when browser closes mid-trace [pass] +library/tracing.spec.ts › should not emit after w/o before [pass] +library/tracing.spec.ts › should not flush console events [pass] +library/tracing.spec.ts › should not hang for clicks that open dialogs [fail] +library/tracing.spec.ts › should not include buffers in the trace [pass] +library/tracing.spec.ts › should not include trace resources from the previous chunks [fail] +library/tracing.spec.ts › should not stall on dialogs [fail] +library/tracing.spec.ts › should not throw when stopping without start but not exporting [pass] +library/tracing.spec.ts › should overwrite existing file [fail] +library/tracing.spec.ts › should produce screencast frames crop [fail] +library/tracing.spec.ts › should produce screencast frames fit [fail] +library/tracing.spec.ts › should produce screencast frames scale [fail] +library/tracing.spec.ts › should record global request trace [pass] +library/tracing.spec.ts › should record network failures [pass] +library/tracing.spec.ts › should respect tracesDir and name [fail] +library/tracing.spec.ts › should store global request traces separately [pass] +library/tracing.spec.ts › should store postData for global request [pass] +library/tracing.spec.ts › should survive browser.close with auto-created traces dir [pass] +library/tracing.spec.ts › should throw when starting with different options [pass] +library/tracing.spec.ts › should throw when stopping without start [pass] +library/tracing.spec.ts › should use the correct apiName for event driven callbacks [pass] +library/tracing.spec.ts › should work with multiple chunks [fail] +library/unroute-behavior.spec.ts › context.close should not wait for active route handlers on the owned pages [pass] +library/unroute-behavior.spec.ts › context.unroute should not wait for pending handlers to complete [timeout] +library/unroute-behavior.spec.ts › context.unrouteAll removes all handlers [pass] +library/unroute-behavior.spec.ts › context.unrouteAll should not wait for pending handlers to complete if behavior is ignoreErrors [timeout] +library/unroute-behavior.spec.ts › context.unrouteAll should wait for pending handlers to complete [timeout] +library/unroute-behavior.spec.ts › page.close does not wait for active route handlers [pass] +library/unroute-behavior.spec.ts › page.close should not wait for active route handlers on the owning context [pass] +library/unroute-behavior.spec.ts › page.unroute should not wait for pending handlers to complete [pass] +library/unroute-behavior.spec.ts › page.unrouteAll removes all routes [pass] +library/unroute-behavior.spec.ts › page.unrouteAll should not wait for pending handlers to complete if behavior is ignoreErrors [pass] +library/unroute-behavior.spec.ts › page.unrouteAll should wait for pending handlers to complete [pass] +library/unroute-behavior.spec.ts › route.continue should not throw if page has been closed [pass] +library/unroute-behavior.spec.ts › route.fallback should not throw if page has been closed [pass] +library/unroute-behavior.spec.ts › route.fulfill should not throw if page has been closed [pass] +library/video.spec.ts › screencast › saveAs should throw when no video frames [timeout] +library/video.spec.ts › screencast › should be 800x450 by default [timeout] +library/video.spec.ts › screencast › should be 800x600 with null viewport [timeout] +library/video.spec.ts › screencast › should capture css transformation [timeout] +library/video.spec.ts › screencast › should capture full viewport [fail] +library/video.spec.ts › screencast › should capture full viewport on hidpi [fail] +library/video.spec.ts › screencast › should capture navigation [timeout] +library/video.spec.ts › screencast › should capture static page [timeout] +library/video.spec.ts › screencast › should capture static page in persistent context @smoke [fail] +library/video.spec.ts › screencast › should continue recording main page after popup closes [fail] +library/video.spec.ts › screencast › should delete video [timeout] +library/video.spec.ts › screencast › should emulate an iphone [timeout] +library/video.spec.ts › screencast › should expose video path [fail] +library/video.spec.ts › screencast › should expose video path blank page [timeout] +library/video.spec.ts › screencast › should expose video path blank popup [fail] +library/video.spec.ts › screencast › should not create video for internal pages [unknown] +library/video.spec.ts › screencast › should scale frames down to the requested size [timeout] +library/video.spec.ts › screencast › should throw if browser dies [fail] +library/video.spec.ts › screencast › should throw on browser close [fail] +library/video.spec.ts › screencast › should throw without recordVideo.dir [pass] +library/video.spec.ts › screencast › should use viewport scaled down to fit into 800x800 as default size [timeout] +library/video.spec.ts › screencast › should wait for video to finish if page was closed [fail] +library/video.spec.ts › screencast › should work for popups [fail] +library/video.spec.ts › screencast › should work with old options [timeout] +library/video.spec.ts › screencast › should work with relative path for recordVideo.dir [timeout] +library/video.spec.ts › screencast › should work with video+trace [timeout] +library/video.spec.ts › screencast › should work with weird screen resolution [timeout] +library/video.spec.ts › screencast › videoSize should require videosPath [pass] +library/video.spec.ts › should saveAs video [timeout] +library/web-socket.spec.ts › should emit binary frame events [timeout] +library/web-socket.spec.ts › should emit close events [timeout] +library/web-socket.spec.ts › should emit error [timeout] +library/web-socket.spec.ts › should emit frame events [timeout] +library/web-socket.spec.ts › should filter out the close events when the server closes with a message [timeout] +library/web-socket.spec.ts › should not have stray error events [timeout] +library/web-socket.spec.ts › should pass self as argument to close event [timeout] +library/web-socket.spec.ts › should reject waitForEvent on page close [timeout] +library/web-socket.spec.ts › should reject waitForEvent on socket close [timeout] +library/web-socket.spec.ts › should turn off when offline [unknown] +library/web-socket.spec.ts › should work @smoke [pass] \ No newline at end of file diff --git a/tests/bidi/expectations/bidi-firefox-nightly-page.txt b/tests/bidi/expectations/bidi-firefox-nightly-page.txt new file mode 100644 index 0000000000..366d8fdf36 --- /dev/null +++ b/tests/bidi/expectations/bidi-firefox-nightly-page.txt @@ -0,0 +1,1968 @@ +page/elementhandle-bounding-box.spec.ts › should force a layout [fail] +page/elementhandle-bounding-box.spec.ts › should get frame box [fail] +page/elementhandle-bounding-box.spec.ts › should handle nested frames [fail] +page/elementhandle-bounding-box.spec.ts › should handle scroll offset and click [fail] +page/elementhandle-bounding-box.spec.ts › should return null for invisible elements [fail] +page/elementhandle-bounding-box.spec.ts › should work [fail] +page/elementhandle-bounding-box.spec.ts › should work when inline box child is outside of viewport [fail] +page/elementhandle-bounding-box.spec.ts › should work with SVG nodes [fail] +page/elementhandle-click.spec.ts › should double click the button [fail] +page/elementhandle-click.spec.ts › should throw for
elements with force [fail] +page/elementhandle-click.spec.ts › should throw for detached nodes [pass] +page/elementhandle-click.spec.ts › should throw for hidden nodes with force [pass] +page/elementhandle-click.spec.ts › should throw for recursively hidden nodes with force [pass] +page/elementhandle-click.spec.ts › should work @smoke [pass] +page/elementhandle-click.spec.ts › should work for Shadow DOM v1 [pass] +page/elementhandle-click.spec.ts › should work for TextNodes [fail] +page/elementhandle-click.spec.ts › should work with Node removed [pass] +page/elementhandle-content-frame.spec.ts › should return null for document.documentElement [pass] +page/elementhandle-content-frame.spec.ts › should return null for non-iframes [pass] +page/elementhandle-content-frame.spec.ts › should work [pass] +page/elementhandle-content-frame.spec.ts › should work for cross-frame evaluations [fail] +page/elementhandle-content-frame.spec.ts › should work for cross-process iframes [pass] +page/elementhandle-convenience.spec.ts › getAttribute should work [pass] +page/elementhandle-convenience.spec.ts › innerHTML should work [pass] +page/elementhandle-convenience.spec.ts › innerText should throw [fail] +page/elementhandle-convenience.spec.ts › innerText should work [pass] +page/elementhandle-convenience.spec.ts › inputValue should work [pass] +page/elementhandle-convenience.spec.ts › isChecked should work [fail] +page/elementhandle-convenience.spec.ts › isEditable should work [fail] +page/elementhandle-convenience.spec.ts › isEnabled and isDisabled should work [fail] +page/elementhandle-convenience.spec.ts › isEnabled and isDisabled should work with [fail] +page/page-fill.spec.ts › should throw on incorrect color value [fail] +page/page-fill.spec.ts › should throw on incorrect date [fail] +page/page-fill.spec.ts › should throw on incorrect datetime-local [unknown] +page/page-fill.spec.ts › should throw on incorrect month [unknown] +page/page-fill.spec.ts › should throw on incorrect range value [fail] +page/page-fill.spec.ts › should throw on incorrect time [fail] +page/page-fill.spec.ts › should throw on incorrect week [unknown] +page/page-fill.spec.ts › should throw on unsupported inputs [pass] +page/page-focus.spec.ts › clicking checkbox should activate it [unknown] +page/page-focus.spec.ts › keeps focus on element when attempting to focus a non-focusable element [fail] +page/page-focus.spec.ts › should emit blur event [fail] +page/page-focus.spec.ts › should emit focus event [fail] +page/page-focus.spec.ts › should traverse focus [fail] +page/page-focus.spec.ts › should traverse focus in all directions [fail] +page/page-focus.spec.ts › should traverse only form elements [unknown] +page/page-focus.spec.ts › should work @smoke [fail] +page/page-force-gc.spec.ts › should work [fail] +page/page-goto.spec.ts › js redirect overrides url bar navigation [pass] +page/page-goto.spec.ts › should be able to navigate to a page controlled by service worker [pass] +page/page-goto.spec.ts › should capture cross-process iframe navigation request [pass] +page/page-goto.spec.ts › should capture iframe navigation request [pass] +page/page-goto.spec.ts › should disable timeout when its set to 0 [pass] +page/page-goto.spec.ts › should fail when canceled by another navigation [pass] +page/page-goto.spec.ts › should fail when exceeding browser context navigation timeout [pass] +page/page-goto.spec.ts › should fail when exceeding browser context timeout [pass] +page/page-goto.spec.ts › should fail when exceeding default maximum navigation timeout [pass] +page/page-goto.spec.ts › should fail when exceeding default maximum timeout [pass] +page/page-goto.spec.ts › should fail when exceeding maximum navigation timeout [pass] +page/page-goto.spec.ts › should fail when main resources failed to load [pass] +page/page-goto.spec.ts › should fail when navigating and show the url at the error message [pass] +page/page-goto.spec.ts › should fail when navigating to bad SSL [fail] +page/page-goto.spec.ts › should fail when navigating to bad SSL after redirects [fail] +page/page-goto.spec.ts › should fail when navigating to bad url [fail] +page/page-goto.spec.ts › should fail when replaced by another navigation [pass] +page/page-goto.spec.ts › should fail when server returns 204 [timeout] +page/page-goto.spec.ts › should navigate to URL with hash and fire requests without hash [pass] +page/page-goto.spec.ts › should navigate to about:blank [pass] +page/page-goto.spec.ts › should navigate to dataURL and not fire dataURL requests [pass] +page/page-goto.spec.ts › should navigate to empty page with domcontentloaded [pass] +page/page-goto.spec.ts › should not crash when RTCPeerConnection is used [pass] +page/page-goto.spec.ts › should not crash when navigating to bad SSL after a cross origin navigation [pass] +page/page-goto.spec.ts › should not leak listeners during 20 waitForNavigation [pass] +page/page-goto.spec.ts › should not leak listeners during bad navigation [pass] +page/page-goto.spec.ts › should not leak listeners during navigation [pass] +page/page-goto.spec.ts › should not resolve goto upon window.stop() [pass] +page/page-goto.spec.ts › should not throw if networkidle0 is passed as an option [pass] +page/page-goto.spec.ts › should not throw unhandled rejections on invalid url [pass] +page/page-goto.spec.ts › should override referrer-policy [fail] +page/page-goto.spec.ts › should prioritize default navigation timeout over default timeout [pass] +page/page-goto.spec.ts › should properly wait for load [fail] +page/page-goto.spec.ts › should reject referer option when setExtraHTTPHeaders provides referer [pass] +page/page-goto.spec.ts › should report raw buffer for main resource [fail] +page/page-goto.spec.ts › should return from goto if new navigation is started [pass] +page/page-goto.spec.ts › should return last response in redirect chain [pass] +page/page-goto.spec.ts › should return response when page changes its URL after load [pass] +page/page-goto.spec.ts › should return url with basic auth info [pass] +page/page-goto.spec.ts › should return when navigation is committed if commit is specified [pass] +page/page-goto.spec.ts › should send referer [fail] +page/page-goto.spec.ts › should send referer of cross-origin URL [fail] +page/page-goto.spec.ts › should succeed on url bar navigation when there is pending navigation [pass] +page/page-goto.spec.ts › should throw if networkidle2 is passed as an option [fail] +page/page-goto.spec.ts › should use http for no protocol [pass] +page/page-goto.spec.ts › should wait for load when iframe attaches and detaches [pass] +page/page-goto.spec.ts › should work @smoke [pass] +page/page-goto.spec.ts › should work cross-process [pass] +page/page-goto.spec.ts › should work when navigating to 404 [pass] +page/page-goto.spec.ts › should work when navigating to data url [pass] +page/page-goto.spec.ts › should work when navigating to valid url [pass] +page/page-goto.spec.ts › should work when page calls history API in beforeunload [fail] +page/page-goto.spec.ts › should work with Cross-Origin-Opener-Policy [pass] +page/page-goto.spec.ts › should work with Cross-Origin-Opener-Policy after redirect [pass] +page/page-goto.spec.ts › should work with Cross-Origin-Opener-Policy and interception [pass] +page/page-goto.spec.ts › should work with anchor navigation [timeout] +page/page-goto.spec.ts › should work with cross-process that fails before committing [pass] +page/page-goto.spec.ts › should work with file URL [pass] +page/page-goto.spec.ts › should work with file URL with subframes [pass] +page/page-goto.spec.ts › should work with lazy loading iframes [fail] +page/page-goto.spec.ts › should work with redirects [pass] +page/page-goto.spec.ts › should work with self requesting page [pass] +page/page-goto.spec.ts › should work with subframes return 204 [pass] +page/page-goto.spec.ts › should work with subframes return 204 with domcontentloaded [pass] +page/page-history.spec.ts › goBack/goForward should work with bfcache-able pages [fail] +page/page-history.spec.ts › page.goBack during renderer-initiated navigation [fail] +page/page-history.spec.ts › page.goBack should work @smoke [pass] +page/page-history.spec.ts › page.goBack should work for file urls [fail] +page/page-history.spec.ts › page.goBack should work with HistoryAPI [fail] +page/page-history.spec.ts › page.goForward during renderer-initiated navigation [fail] +page/page-history.spec.ts › page.reload during renderer-initiated navigation [fail] +page/page-history.spec.ts › page.reload should not resolve with same-document navigation [fail] +page/page-history.spec.ts › page.reload should work [pass] +page/page-history.spec.ts › page.reload should work on a page with a hash [pass] +page/page-history.spec.ts › page.reload should work on a page with a hash at the end [pass] +page/page-history.spec.ts › page.reload should work with cross-origin redirect [pass] +page/page-history.spec.ts › page.reload should work with data url [pass] +page/page-history.spec.ts › page.reload should work with same origin redirect [pass] +page/page-history.spec.ts › regression test for issue 20791 [pass] +page/page-history.spec.ts › should reload proper page [timeout] +page/page-keyboard.spec.ts › insertText should only emit input event [fail] +page/page-keyboard.spec.ts › pressing Meta should not result in any text insertion on any platform [fail] +page/page-keyboard.spec.ts › should be able to prevent selectAll [pass] +page/page-keyboard.spec.ts › should dispatch a click event on a button when Enter gets pressed [fail] +page/page-keyboard.spec.ts › should dispatch a click event on a button when Space gets pressed [fail] +page/page-keyboard.spec.ts › should dispatch insertText after context menu was opened [pass] +page/page-keyboard.spec.ts › should expose keyIdentifier in webkit [unknown] +page/page-keyboard.spec.ts › should handle selectAll [pass] +page/page-keyboard.spec.ts › should have correct Keydown/Keyup order when pressing Escape key [pass] +page/page-keyboard.spec.ts › should move around the selection in a contenteditable [fail] +page/page-keyboard.spec.ts › should move to the start of the document [unknown] +page/page-keyboard.spec.ts › should move with the arrow keys [pass] +page/page-keyboard.spec.ts › should not type canceled events [pass] +page/page-keyboard.spec.ts › should press Enter [fail] +page/page-keyboard.spec.ts › should press plus [fail] +page/page-keyboard.spec.ts › should press shift plus [fail] +page/page-keyboard.spec.ts › should press the meta key [pass] +page/page-keyboard.spec.ts › should report multiple modifiers [fail] +page/page-keyboard.spec.ts › should report shiftKey [pass] +page/page-keyboard.spec.ts › should scroll with PageDown [pass] +page/page-keyboard.spec.ts › should send a character with ElementHandle.press [pass] +page/page-keyboard.spec.ts › should send a character with insertText [fail] +page/page-keyboard.spec.ts › should send proper codes while typing [pass] +page/page-keyboard.spec.ts › should send proper codes while typing with shift [pass] +page/page-keyboard.spec.ts › should shift raw codes [pass] +page/page-keyboard.spec.ts › should specify location [fail] +page/page-keyboard.spec.ts › should specify repeat property [pass] +page/page-keyboard.spec.ts › should support MacOS shortcuts [unknown] +page/page-keyboard.spec.ts › should support multiple plus-separated modifiers [pass] +page/page-keyboard.spec.ts › should support plus-separated modifiers [pass] +page/page-keyboard.spec.ts › should support simple copy-pasting [fail] +page/page-keyboard.spec.ts › should support simple cut-pasting [fail] +page/page-keyboard.spec.ts › should support undo-redo [fail] +page/page-keyboard.spec.ts › should throw on unknown keys [pass] +page/page-keyboard.spec.ts › should type after context menu was opened [pass] +page/page-keyboard.spec.ts › should type all kinds of characters [pass] +page/page-keyboard.spec.ts › should type emoji [pass] +page/page-keyboard.spec.ts › should type emoji into an iframe [pass] +page/page-keyboard.spec.ts › should type into a textarea @smoke [pass] +page/page-keyboard.spec.ts › should type repeatedly in contenteditable in shadow dom [fail] +page/page-keyboard.spec.ts › should type repeatedly in contenteditable in shadow dom with nested elements [fail] +page/page-keyboard.spec.ts › should type repeatedly in input in shadow dom [fail] +page/page-keyboard.spec.ts › should work after a cross origin navigation [pass] +page/page-keyboard.spec.ts › should work with keyboard events with empty.html [pass] +page/page-keyboard.spec.ts › type to non-focusable element should maintain old focus [fail] +page/page-leaks.spec.ts › click should not leak [fail] +page/page-leaks.spec.ts › expect should not leak [fail] +page/page-leaks.spec.ts › fill should not leak [fail] +page/page-leaks.spec.ts › waitFor should not leak [fail] +page/page-listeners.spec.ts › should not throw with ignoreErrors [pass] +page/page-listeners.spec.ts › should wait [pass] +page/page-listeners.spec.ts › wait should throw [pass] +page/page-mouse.spec.ts › down and up should generate click [pass] +page/page-mouse.spec.ts › should always round down [fail] +page/page-mouse.spec.ts › should click the document @smoke [pass] +page/page-mouse.spec.ts › should dblclick the div [fail] +page/page-mouse.spec.ts › should dispatch mouse move after context menu was opened [pass] +page/page-mouse.spec.ts › should not crash on mouse drag with any button [pass] +page/page-mouse.spec.ts › should pointerdown the div with a custom button [fail] +page/page-mouse.spec.ts › should report correct buttons property [pass] +page/page-mouse.spec.ts › should select the text with mouse [pass] +page/page-mouse.spec.ts › should set modifier keys on click [pass] +page/page-mouse.spec.ts › should trigger hover state [pass] +page/page-mouse.spec.ts › should trigger hover state on disabled button [pass] +page/page-mouse.spec.ts › should trigger hover state with removed window.Node [pass] +page/page-mouse.spec.ts › should tween mouse movement [pass] +page/page-navigation.spec.ts › should work with _blank target [pass] +page/page-navigation.spec.ts › should work with _blank target in form [fail] +page/page-navigation.spec.ts › should work with cross-process _blank target [pass] +page/page-network-idle.spec.ts › should navigate to empty page with networkidle [pass] +page/page-network-idle.spec.ts › should wait for networkidle from the child frame [pass] +page/page-network-idle.spec.ts › should wait for networkidle from the popup [fail] +page/page-network-idle.spec.ts › should wait for networkidle in setContent [fail] +page/page-network-idle.spec.ts › should wait for networkidle in setContent from the child frame [fail] +page/page-network-idle.spec.ts › should wait for networkidle in setContent with request from previous navigation [fail] +page/page-network-idle.spec.ts › should wait for networkidle in waitForNavigation [pass] +page/page-network-idle.spec.ts › should wait for networkidle to succeed navigation [pass] +page/page-network-idle.spec.ts › should wait for networkidle to succeed navigation with request from previous navigation [fail] +page/page-network-idle.spec.ts › should wait for networkidle when iframe attaches and detaches [fail] +page/page-network-idle.spec.ts › should wait for networkidle when navigating iframe [pass] +page/page-network-idle.spec.ts › should work after repeated navigations in the same page [pass] +page/page-network-request.spec.ts › page.reload return 304 status code [pass] +page/page-network-request.spec.ts › should get the same headers as the server [fail] +page/page-network-request.spec.ts › should get the same headers as the server CORS [fail] +page/page-network-request.spec.ts › should get |undefined| with postData() when there is no post data [pass] +page/page-network-request.spec.ts › should get |undefined| with postDataJSON() when there is no post data [pass] +page/page-network-request.spec.ts › should handle mixed-content blocked requests [unknown] +page/page-network-request.spec.ts › should not allow to access frame on popup main request [fail] +page/page-network-request.spec.ts › should not get preflight CORS requests when intercepting [fail] +page/page-network-request.spec.ts › should not return allHeaders() until they are available [fail] +page/page-network-request.spec.ts › should not work for a redirect and interception [pass] +page/page-network-request.spec.ts › should override post data content type [pass] +page/page-network-request.spec.ts › should parse the data if content-type is application/x-www-form-urlencoded [fail] +page/page-network-request.spec.ts › should parse the data if content-type is application/x-www-form-urlencoded; charset=UTF-8 [fail] +page/page-network-request.spec.ts › should parse the json post data [fail] +page/page-network-request.spec.ts › should report all cookies in one header [pass] +page/page-network-request.spec.ts › should report raw headers [fail] +page/page-network-request.spec.ts › should report raw response headers in redirects [pass] +page/page-network-request.spec.ts › should return event source [fail] +page/page-network-request.spec.ts › should return headers [pass] +page/page-network-request.spec.ts › should return multipart/form-data [fail] +page/page-network-request.spec.ts › should return navigation bit [pass] +page/page-network-request.spec.ts › should return navigation bit when navigating to image [pass] +page/page-network-request.spec.ts › should return postData [fail] +page/page-network-request.spec.ts › should work for a redirect [pass] +page/page-network-request.spec.ts › should work for fetch requests @smoke [pass] +page/page-network-request.spec.ts › should work for main frame navigation request [pass] +page/page-network-request.spec.ts › should work for subframe navigation request [pass] +page/page-network-request.spec.ts › should work with binary post data [fail] +page/page-network-request.spec.ts › should work with binary post data and interception [fail] +page/page-network-response.spec.ts › should behave the same way for headers and allHeaders [pass] +page/page-network-response.spec.ts › should bypass disk cache when context interception is enabled [fail] +page/page-network-response.spec.ts › should bypass disk cache when page interception is enabled [pass] +page/page-network-response.spec.ts › should provide a Response with a file URL [fail] +page/page-network-response.spec.ts › should reject response.finished if context closes [timeout] +page/page-network-response.spec.ts › should reject response.finished if page closes [pass] +page/page-network-response.spec.ts › should report all headers [fail] +page/page-network-response.spec.ts › should report if request was fromServiceWorker [fail] +page/page-network-response.spec.ts › should report multiple set-cookie headers [fail] +page/page-network-response.spec.ts › should return body [fail] +page/page-network-response.spec.ts › should return body for prefetch script [fail] +page/page-network-response.spec.ts › should return body with compression [fail] +page/page-network-response.spec.ts › should return headers after route.fulfill [pass] +page/page-network-response.spec.ts › should return json [fail] +page/page-network-response.spec.ts › should return multiple header value [fail] +page/page-network-response.spec.ts › should return set-cookie header after route.fulfill [pass] +page/page-network-response.spec.ts › should return status text [fail] +page/page-network-response.spec.ts › should return text [fail] +page/page-network-response.spec.ts › should return uncompressed text [fail] +page/page-network-response.spec.ts › should throw when requesting body of redirected response [pass] +page/page-network-response.spec.ts › should wait until response completes [fail] +page/page-network-response.spec.ts › should work @smoke [pass] +page/page-network-sizes.spec.ts › should handle redirects [pass] +page/page-network-sizes.spec.ts › should have correct responseBodySize for 404 with content [pass] +page/page-network-sizes.spec.ts › should have the correct responseBodySize [pass] +page/page-network-sizes.spec.ts › should have the correct responseBodySize for chunked request [fail] +page/page-network-sizes.spec.ts › should have the correct responseBodySize with gzip compression [pass] +page/page-network-sizes.spec.ts › should return sizes without hanging [fail] +page/page-network-sizes.spec.ts › should set bodySize and headersSize [pass] +page/page-network-sizes.spec.ts › should set bodySize to 0 if there was no body [pass] +page/page-network-sizes.spec.ts › should set bodySize to 0 when there was no response body [pass] +page/page-network-sizes.spec.ts › should set bodySize, headersSize, and transferSize [pass] +page/page-network-sizes.spec.ts › should throw for failed requests [pass] +page/page-network-sizes.spec.ts › should work with 200 status code [pass] +page/page-network-sizes.spec.ts › should work with 401 status code [pass] +page/page-network-sizes.spec.ts › should work with 404 status code [pass] +page/page-network-sizes.spec.ts › should work with 500 status code [pass] +page/page-object-count.spec.ts › should count objects [unknown] +page/page-request-continue.spec.ts › continue should delete headers on redirects [fail] +page/page-request-continue.spec.ts › continue should not change multipart/form-data body [pass] +page/page-request-continue.spec.ts › continue should propagate headers to redirects [fail] +page/page-request-continue.spec.ts › post data › should amend binary post data [fail] +page/page-request-continue.spec.ts › post data › should amend longer post data [pass] +page/page-request-continue.spec.ts › post data › should amend method and post data [pass] +page/page-request-continue.spec.ts › post data › should amend post data [pass] +page/page-request-continue.spec.ts › post data › should amend utf8 post data [fail] +page/page-request-continue.spec.ts › post data › should compute content-length from post data [pass] +page/page-request-continue.spec.ts › post data › should use content-type from original request [pass] +page/page-request-continue.spec.ts › redirected requests should report overridden headers [fail] +page/page-request-continue.spec.ts › should amend HTTP headers [pass] +page/page-request-continue.spec.ts › should amend method [pass] +page/page-request-continue.spec.ts › should amend method on main request [fail] +page/page-request-continue.spec.ts › should continue preload link requests [pass] +page/page-request-continue.spec.ts › should delete header with undefined value [pass] +page/page-request-continue.spec.ts › should delete the origin header [pass] +page/page-request-continue.spec.ts › should intercept css variable with background url [fail] +page/page-request-continue.spec.ts › should not allow changing protocol when overriding url [pass] +page/page-request-continue.spec.ts › should not throw if request was cancelled by the page [timeout] +page/page-request-continue.spec.ts › should not throw when continuing after page is closed [fail] +page/page-request-continue.spec.ts › should not throw when continuing while page is closing [fail] +page/page-request-continue.spec.ts › should override method along with url [timeout] +page/page-request-continue.spec.ts › should override request url [timeout] +page/page-request-continue.spec.ts › should work [fail] +page/page-request-continue.spec.ts › should work with Cross-Origin-Opener-Policy [pass] +page/page-request-fallback.spec.ts › post data › should amend binary post data [pass] +page/page-request-fallback.spec.ts › post data › should amend json post data [pass] +page/page-request-fallback.spec.ts › post data › should amend post data [pass] +page/page-request-fallback.spec.ts › should amend HTTP headers [pass] +page/page-request-fallback.spec.ts › should amend method [fail] +page/page-request-fallback.spec.ts › should chain once [fail] +page/page-request-fallback.spec.ts › should delete header with undefined value [pass] +page/page-request-fallback.spec.ts › should fall back [fail] +page/page-request-fallback.spec.ts › should fall back after exception [pass] +page/page-request-fallback.spec.ts › should fall back async [pass] +page/page-request-fallback.spec.ts › should not chain abort [pass] +page/page-request-fallback.spec.ts › should not chain fulfill [fail] +page/page-request-fallback.spec.ts › should override request url [fail] +page/page-request-fallback.spec.ts › should work [pass] +page/page-request-fulfill.spec.ts › headerValue should return set-cookie from intercepted response [pass] +page/page-request-fulfill.spec.ts › should allow mocking binary responses [fail] +page/page-request-fulfill.spec.ts › should allow mocking svg with charset [fail] +page/page-request-fulfill.spec.ts › should fetch original request and fulfill [fail] +page/page-request-fulfill.spec.ts › should fulfill json [pass] +page/page-request-fulfill.spec.ts › should fulfill preload link requests [fail] +page/page-request-fulfill.spec.ts › should fulfill with fetch response that has multiple set-cookie [fail] +page/page-request-fulfill.spec.ts › should fulfill with fetch result [fail] +page/page-request-fulfill.spec.ts › should fulfill with fetch result and overrides [fail] +page/page-request-fulfill.spec.ts › should fulfill with global fetch result [fail] +page/page-request-fulfill.spec.ts › should fulfill with gzip and readback [fail] +page/page-request-fulfill.spec.ts › should fulfill with har response [pass] +page/page-request-fulfill.spec.ts › should fulfill with multiple set-cookie [pass] +page/page-request-fulfill.spec.ts › should fulfill with unuassigned status codes [pass] +page/page-request-fulfill.spec.ts › should include the origin header [pass] +page/page-request-fulfill.spec.ts › should not go to the network for fulfilled requests body [fail] +page/page-request-fulfill.spec.ts › should not modify the headers sent to the server [fail] +page/page-request-fulfill.spec.ts › should not throw if request was cancelled by the page [fail] +page/page-request-fulfill.spec.ts › should stringify intercepted request response headers [pass] +page/page-request-fulfill.spec.ts › should work [pass] +page/page-request-fulfill.spec.ts › should work with buffer as body [fail] +page/page-request-fulfill.spec.ts › should work with file path [pass] +page/page-request-fulfill.spec.ts › should work with status code 422 [pass] +page/page-request-intercept.spec.ts › request.postData is not null when fetching FormData with a Blob [fail] +page/page-request-intercept.spec.ts › should fulfill intercepted response [pass] +page/page-request-intercept.spec.ts › should fulfill intercepted response using alias [pass] +page/page-request-intercept.spec.ts › should fulfill popup main request using alias [fail] +page/page-request-intercept.spec.ts › should fulfill response with empty body [fail] +page/page-request-intercept.spec.ts › should fulfill with any response [fail] +page/page-request-intercept.spec.ts › should give access to the intercepted response [pass] +page/page-request-intercept.spec.ts › should give access to the intercepted response body [fail] +page/page-request-intercept.spec.ts › should intercept multipart/form-data request body [unknown] +page/page-request-intercept.spec.ts › should intercept with post data override [pass] +page/page-request-intercept.spec.ts › should intercept with url override [fail] +page/page-request-intercept.spec.ts › should not follow redirects when maxRedirects is set to 0 in route.fetch [fail] +page/page-request-intercept.spec.ts › should override with defaults when intercepted response not provided [fail] +page/page-request-intercept.spec.ts › should support fulfill after intercept [fail] +page/page-request-intercept.spec.ts › should support timeout option in route.fetch [pass] +page/page-route.spec.ts › route.abort should throw if called twice [pass] +page/page-route.spec.ts › route.continue should throw if called twice [pass] +page/page-route.spec.ts › route.fallback should throw if called twice [pass] +page/page-route.spec.ts › route.fulfill should throw if called twice [fail] +page/page-route.spec.ts › should add Access-Control-Allow-Origin by default when fulfill [fail] +page/page-route.spec.ts › should allow null origin for about:blank [fail] +page/page-route.spec.ts › should be able to fetch dataURL and not fire dataURL requests [fail] +page/page-route.spec.ts › should be able to remove headers [pass] +page/page-route.spec.ts › should be abortable [pass] +page/page-route.spec.ts › should be abortable with custom error codes [fail] +page/page-route.spec.ts › should chain fallback w/ dynamic URL [fail] +page/page-route.spec.ts › should contain raw request header [pass] +page/page-route.spec.ts › should contain raw response header [pass] +page/page-route.spec.ts › should contain raw response header after fulfill [pass] +page/page-route.spec.ts › should contain referer header [fail] +page/page-route.spec.ts › should fail navigation when aborting main resource [fail] +page/page-route.spec.ts › should fulfill with redirect status [fail] +page/page-route.spec.ts › should intercept @smoke [fail] +page/page-route.spec.ts › should intercept main resource during cross-process navigation [pass] +page/page-route.spec.ts › should intercept when postData is more than 1MB [fail] +page/page-route.spec.ts › should navigate to URL with hash and and fire requests without hash [pass] +page/page-route.spec.ts › should navigate to dataURL and not fire dataURL requests [pass] +page/page-route.spec.ts › should not auto-intercept non-preflight OPTIONS [fail] +page/page-route.spec.ts › should not fulfill with redirect status [unknown] +page/page-route.spec.ts › should not throw "Invalid Interception Id" if the request was cancelled [fail] +page/page-route.spec.ts › should not throw if request was cancelled by the page [timeout] +page/page-route.spec.ts › should not work with redirects [fail] +page/page-route.spec.ts › should override cookie header [fail] +page/page-route.spec.ts › should pause intercepted XHR until continue [fail] +page/page-route.spec.ts › should pause intercepted fetch request until continue [pass] +page/page-route.spec.ts › should properly return navigation response when URL has cookies [pass] +page/page-route.spec.ts › should reject cors with disallowed credentials [fail] +page/page-route.spec.ts › should respect cors overrides [fail] +page/page-route.spec.ts › should send referer [fail] +page/page-route.spec.ts › should show custom HTTP headers [fail] +page/page-route.spec.ts › should support ? in glob pattern [fail] +page/page-route.spec.ts › should support async handler w/ times [pass] +page/page-route.spec.ts › should support cors for different methods [fail] +page/page-route.spec.ts › should support cors with GET [pass] +page/page-route.spec.ts › should support cors with POST [fail] +page/page-route.spec.ts › should support cors with credentials [fail] +page/page-route.spec.ts › should support the times parameter with route matching [fail] +page/page-route.spec.ts › should unroute [pass] +page/page-route.spec.ts › should work if handler with times parameter was removed from another handler [pass] +page/page-route.spec.ts › should work when POST is redirected with 302 [fail] +page/page-route.spec.ts › should work when header manipulation headers with redirect [fail] +page/page-route.spec.ts › should work with badly encoded server [pass] +page/page-route.spec.ts › should work with custom referer headers [fail] +page/page-route.spec.ts › should work with encoded server [fail] +page/page-route.spec.ts › should work with encoded server - 2 [fail] +page/page-route.spec.ts › should work with equal requests [fail] +page/page-route.spec.ts › should work with redirect inside sync XHR [pass] +page/page-route.spec.ts › should work with redirects for subresources [fail] +page/page-screenshot.spec.ts › page screenshot animations › should capture screenshots after layoutchanges in transitionend event [pass] +page/page-screenshot.spec.ts › page screenshot animations › should fire transitionend for finite transitions [pass] +page/page-screenshot.spec.ts › page screenshot animations › should not capture css animations in shadow DOM [fail] +page/page-screenshot.spec.ts › page screenshot animations › should not capture infinite css animation [fail] +page/page-screenshot.spec.ts › page screenshot animations › should not capture infinite web animations [fail] +page/page-screenshot.spec.ts › page screenshot animations › should not capture pseudo element css animation [fail] +page/page-screenshot.spec.ts › page screenshot animations › should not change animation with playbackRate equal to 0 [pass] +page/page-screenshot.spec.ts › page screenshot animations › should resume infinite animations [pass] +page/page-screenshot.spec.ts › page screenshot animations › should stop animations that happen right before screenshot [pass] +page/page-screenshot.spec.ts › page screenshot animations › should trigger particular events for INfinite css animation [pass] +page/page-screenshot.spec.ts › page screenshot animations › should trigger particular events for css transitions [pass] +page/page-screenshot.spec.ts › page screenshot animations › should trigger particular events for finite css animation [pass] +page/page-screenshot.spec.ts › page screenshot animations › should wait for fonts to load [fail] +page/page-screenshot.spec.ts › page screenshot should capture css transform [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should hide elements based on attr [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should mask in parallel [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should mask inside iframe [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should mask multiple elements [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should remove elements based on attr [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should remove mask after screenshot [pass] +page/page-screenshot.spec.ts › page screenshot › mask option › should work [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should work when mask color is not pink #F0F [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should work when subframe has stalled navigation [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should work when subframe used document.open after a weird url [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should work with elementhandle [fail] +page/page-screenshot.spec.ts › page screenshot › mask option › should work with locator [fail] +page/page-screenshot.spec.ts › page screenshot › path option should create subdirectories [pass] +page/page-screenshot.spec.ts › page screenshot › path option should detect jpeg [fail] +page/page-screenshot.spec.ts › page screenshot › path option should throw for unsupported mime type [pass] +page/page-screenshot.spec.ts › page screenshot › path option should work [fail] +page/page-screenshot.spec.ts › page screenshot › quality option should throw for png [pass] +page/page-screenshot.spec.ts › page screenshot › should allow transparency [fail] +page/page-screenshot.spec.ts › page screenshot › should capture blinking caret if explicitly asked for [fail] +page/page-screenshot.spec.ts › page screenshot › should capture blinking caret in shadow dom [pass] +page/page-screenshot.spec.ts › page screenshot › should capture canvas changes [fail] +page/page-screenshot.spec.ts › page screenshot › should clip elements to the viewport [fail] +page/page-screenshot.spec.ts › page screenshot › should clip rect [fail] +page/page-screenshot.spec.ts › page screenshot › should clip rect with fullPage [fail] +page/page-screenshot.spec.ts › page screenshot › should not capture blinking caret by default [fail] +page/page-screenshot.spec.ts › page screenshot › should not issue resize event [pass] +page/page-screenshot.spec.ts › page screenshot › should prefer type over extension [fail] +page/page-screenshot.spec.ts › page screenshot › should render white background on jpeg file [fail] +page/page-screenshot.spec.ts › page screenshot › should restore viewport after fullPage screenshot [fail] +page/page-screenshot.spec.ts › page screenshot › should run in parallel [fail] +page/page-screenshot.spec.ts › page screenshot › should take fullPage screenshots [fail] +page/page-screenshot.spec.ts › page screenshot › should take fullPage screenshots and mask elements outside of it [fail] +page/page-screenshot.spec.ts › page screenshot › should take fullPage screenshots during navigation [pass] +page/page-screenshot.spec.ts › page screenshot › should throw on clip outside the viewport [pass] +page/page-screenshot.spec.ts › page screenshot › should work @smoke [fail] +page/page-screenshot.spec.ts › page screenshot › should work for canvas [fail] +page/page-screenshot.spec.ts › page screenshot › should work for translateZ [fail] +page/page-screenshot.spec.ts › page screenshot › should work for webgl [fail] +page/page-screenshot.spec.ts › page screenshot › should work while navigating [fail] +page/page-screenshot.spec.ts › page screenshot › should work with Array deleted [fail] +page/page-screenshot.spec.ts › page screenshot › should work with iframe in shadow [fail] +page/page-screenshot.spec.ts › page screenshot › should work with odd clip size on Retina displays [fail] +page/page-screenshot.spec.ts › page screenshot › zero quality option should throw for png [fail] +page/page-screenshot.spec.ts › should capture css box-shadow [fail] +page/page-screenshot.spec.ts › should throw if screenshot size is too large [fail] +page/page-select-option.spec.ts › input event.composed should be true and cross shadow dom boundary [fail] +page/page-select-option.spec.ts › should deselect all options when passed no values for a multiple select [pass] +page/page-select-option.spec.ts › should deselect all options when passed no values for a select without multiple [pass] +page/page-select-option.spec.ts › should fall back to selecting by label [pass] +page/page-select-option.spec.ts › should not allow null items [pass] +page/page-select-option.spec.ts › should not select single option when some attributes do not match [pass] +page/page-select-option.spec.ts › should not throw when select causes navigation [pass] +page/page-select-option.spec.ts › should respect event bubbling [pass] +page/page-select-option.spec.ts › should return [] on no matched values [pass] +page/page-select-option.spec.ts › should return [] on no values [pass] +page/page-select-option.spec.ts › should return an array of matched values [fail] +page/page-select-option.spec.ts › should return an array of one element when multiple is not set [pass] +page/page-select-option.spec.ts › should select multiple options [pass] +page/page-select-option.spec.ts › should select multiple options with attributes [pass] +page/page-select-option.spec.ts › should select only first option [pass] +page/page-select-option.spec.ts › should select single option @smoke [pass] +page/page-select-option.spec.ts › should select single option by handle [pass] +page/page-select-option.spec.ts › should select single option by index [pass] +page/page-select-option.spec.ts › should select single option by label [pass] +page/page-select-option.spec.ts › should select single option by multiple attributes [pass] +page/page-select-option.spec.ts › should select single option by value [pass] +page/page-select-option.spec.ts › should throw if passed wrong types [fail] +page/page-select-option.spec.ts › should throw when element is not a + `); + expect(await page.evaluate(() => document.activeElement.tagName)).toBe('BODY'); + await page.keyboard.press('Tab'); + expect(await page.evaluate(() => document.activeElement.id)).toBe('input1'); + expect(await page.evaluate(() => (window as any).focusEvents)).toEqual(['focus']); + await page.keyboard.press('Tab'); + expect(await page.evaluate(() => document.activeElement.tagName)).toBe('BODY'); + expect(await page.evaluate(() => (window as any).focusEvents)).toEqual(['focus', 'blur']); + await page.keyboard.press('Tab'); + expect(await page.evaluate(() => document.activeElement.id)).toBe('input1'); + expect(await page.evaluate(() => (window as any).focusEvents)).toEqual(['focus', 'blur', 'focus']); +}); + +it('tab should cycle between document elements and browser', { + annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/32339' } +}, async ({ page, browserName, headless }) => { + it.fixme(browserName === 'chromium' && (!headless || !!process.env.PLAYWRIGHT_CHROMIUM_USE_HEADLESS_NEW), + 'Chromium in headful mode keeps last input focused.'); + it.fixme(browserName !== 'chromium'); + await page.setContent(` + + + `); + expect(await page.evaluate(() => document.activeElement.tagName)).toBe('BODY'); + await page.keyboard.press('Tab'); + expect(await page.evaluate(() => document.activeElement.id)).toBe('input1'); + expect(await page.evaluate(() => (window as any).focusEvents)).toEqual(['focus1']); + await page.keyboard.press('Tab'); + expect(await page.evaluate(() => document.activeElement.id)).toBe('input2'); + expect(await page.evaluate(() => (window as any).focusEvents)).toEqual(['focus1', 'blur1', 'focus2']); + await page.keyboard.press('Tab'); + expect(await page.evaluate(() => document.activeElement.tagName)).toBe('BODY'); + expect(await page.evaluate(() => (window as any).focusEvents)).toEqual(['focus1', 'blur1', 'focus2', 'blur2']); + await page.keyboard.press('Tab'); + expect(await page.evaluate(() => document.activeElement.id)).toBe('input1'); + expect(await page.evaluate(() => (window as any).focusEvents)).toEqual(['focus1', 'blur1', 'focus2', 'blur2', 'focus1']); +}); + it('keeps focus on element when attempting to focus a non-focusable element', async ({ page }) => { it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/14254' }); diff --git a/tests/playwright-test/playwright.trace.spec.ts b/tests/playwright-test/playwright.trace.spec.ts index 5ca08925b4..ba6020fade 100644 --- a/tests/playwright-test/playwright.trace.spec.ts +++ b/tests/playwright-test/playwright.trace.spec.ts @@ -1216,7 +1216,6 @@ test('should not nest top level expect into unfinished api calls ', { ' browserContext.newPage', 'page.route', 'page.goto', - 'route.fetch', 'expect.toBeVisible', 'page.unrouteAll', 'After Hooks', diff --git a/tests/playwright-test/test-step.spec.ts b/tests/playwright-test/test-step.spec.ts index f0bd883777..cbd4ec38c4 100644 --- a/tests/playwright-test/test-step.spec.ts +++ b/tests/playwright-test/test-step.spec.ts @@ -546,37 +546,6 @@ fixture | fixture: browser `); }); -test('should not nest page.continue inside page.goto steps', async ({ runInlineTest }) => { - const result = await runInlineTest({ - 'reporter.ts': stepIndentReporter, - 'playwright.config.ts': `module.exports = { reporter: './reporter', };`, - 'a.test.ts': ` - import { test, expect } from '@playwright/test'; - test('pass', async ({ page }) => { - await page.route('**/*', route => route.fulfill('')); - await page.goto('http://localhost:1234'); - }); - ` - }, { reporter: '' }); - - expect(result.exitCode).toBe(0); - expect(result.output).toBe(` -hook |Before Hooks -fixture | fixture: browser -pw:api | browserType.launch -fixture | fixture: context -pw:api | browser.newContext -fixture | fixture: page -pw:api | browserContext.newPage -pw:api |page.route @ a.test.ts:4 -pw:api |page.goto(http://localhost:1234) @ a.test.ts:5 -pw:api |route.fulfill @ a.test.ts:4 -hook |After Hooks -fixture | fixture: page -fixture | fixture: context -`); -}); - test('should not propagate errors from within toPass', async ({ runInlineTest }) => { const result = await runInlineTest({ 'reporter.ts': stepIndentReporter,