From e34cf4d3c53d98201c8d9aefcb1e3259e7b695ee Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Mon, 12 Feb 2024 12:58:42 +0100 Subject: [PATCH] feat(vscode): allow running codegen with selected browser/options --- .../playwright-core/src/protocol/validator.ts | 3 ++ .../src/server/debugController.ts | 20 ++++++++--- packages/playwright/src/runner/runner.ts | 36 +++++++++++++++++-- packages/protocol/src/channels.ts | 6 ++++ packages/protocol/src/protocol.yml | 8 +++++ 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index e67f38e9c2308..86b25923b0e75 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -400,6 +400,9 @@ scheme.DebugControllerNavigateResult = tOptional(tObject({})); scheme.DebugControllerSetRecorderModeParams = tObject({ mode: tEnum(['inspecting', 'recording', 'none']), testIdAttributeName: tOptional(tString), + browserName: tOptional(tEnum(['chromium', 'firefox', 'webkit'])), + contextOptions: tOptional(tType('BrowserNewContextForReuseParams')), + launchOptions: tOptional(tType('BrowserTypeLaunchParams')), }); scheme.DebugControllerSetRecorderModeResult = tOptional(tObject({})); scheme.DebugControllerHighlightParams = tObject({ diff --git a/packages/playwright-core/src/server/debugController.ts b/packages/playwright-core/src/server/debugController.ts index ea2dc9a8054af..67fe2426dca75 100644 --- a/packages/playwright-core/src/server/debugController.ts +++ b/packages/playwright-core/src/server/debugController.ts @@ -25,6 +25,7 @@ import { Recorder } from './recorder'; import { EmptyRecorderApp } from './recorder/recorderApp'; import { asLocator } from '../utils/isomorphic/locatorGenerators'; import type { Language } from '../utils/isomorphic/locatorGenerators'; +import type { BrowserNewContextForReuseParams, BrowserTypeLaunchParams } from '@protocol/channels'; const internalMetadata = serverSideCallMetadata(); @@ -92,7 +93,14 @@ export class DebugController extends SdkObject { await p.mainFrame().goto(internalMetadata, url); } - async setRecorderMode(params: { mode: Mode, file?: string, testIdAttributeName?: string }) { + async setRecorderMode(params: { + mode: Mode, + file?: string, + testIdAttributeName?: string, + browserName?: 'chromium' | 'firefox' | 'webkit', + contextOptions?: BrowserNewContextForReuseParams, + launchOptions?: BrowserTypeLaunchParams, + }) { // TODO: |file| is only used in the legacy mode. await this._closeBrowsersWithoutPages(); @@ -105,13 +113,17 @@ export class DebugController extends SdkObject { return; } - if (!this._playwright.allBrowsers().length) - await this._playwright.chromium.launch(internalMetadata, { headless: !!process.env.PW_DEBUG_CONTROLLER_HEADLESS }); + if (!this._playwright.allBrowsers().length) { + await this._playwright[params.browserName ?? 'chromium'].launch(internalMetadata, { + headless: !!process.env.PW_DEBUG_CONTROLLER_HEADLESS, + ...params.launchOptions, + }); + } // Create page if none. const pages = this._playwright.allPages(); if (!pages.length) { const [browser] = this._playwright.allBrowsers(); - const { context } = await browser.newContextForReuse({}, internalMetadata); + const { context } = await browser.newContextForReuse(params.contextOptions || {}, internalMetadata); await context.newPage(internalMetadata); } // Update test id attribute. diff --git a/packages/playwright/src/runner/runner.ts b/packages/playwright/src/runner/runner.ts index 878c39714e44e..da2d837d98269 100644 --- a/packages/playwright/src/runner/runner.ts +++ b/packages/playwright/src/runner/runner.ts @@ -29,11 +29,22 @@ import { InternalReporter } from '../reporters/internalReporter'; import { Multiplexer } from '../reporters/multiplexer'; import type { Suite } from '../common/test'; import { wrapReporterAsV2 } from '../reporters/reporterV2'; +import type { BrowserContextOptions } from 'playwright-core/lib/client/types'; +import type { BrowserTypeLaunchOptions } from '@protocol/channels'; type ProjectConfigWithFiles = { name: string; testDir: string; - use: { testIdAttribute?: string }; + use: { + testIdAttribute?: string; + browserName?: string; + // User facing options ewhich might relevant for codegen in VSCode: + contextOptions: Pick; + launchOptions: Pick + }; files: string[]; }; @@ -57,7 +68,28 @@ export class Runner { report.projects.push({ name: project.project.name, testDir: project.project.testDir, - use: { testIdAttribute: project.project.use.testIdAttribute }, + use: { + browserName: project.project.use.browserName || project.project.use.defaultBrowserType, + testIdAttribute: project.project.use.testIdAttribute, + launchOptions: { + channel: project.project.use.channel, + args: project.project.use.launchOptions?.args, + }, + contextOptions: { + viewport: project.project.use.viewport, + ignoreHTTPSErrors: project.project.use.ignoreHTTPSErrors, + javaScriptEnabled: project.project.use.javaScriptEnabled, + bypassCSP: project.project.use.bypassCSP, + userAgent: project.project.use.userAgent, + locale: project.project.use.locale, + timezoneId: project.project.use.timezoneId, + geolocation: project.project.use.geolocation, + permissions: project.project.use.permissions, + offline: project.project.use.offline, + storageState: project.project.use.storageState, + extraHTTPHeaders: project.project.use.extraHTTPHeaders, + }, + }, files: await collectFilesForProject(project) }); } diff --git a/packages/protocol/src/channels.ts b/packages/protocol/src/channels.ts index 37811f4d6cceb..221da73f2d835 100644 --- a/packages/protocol/src/channels.ts +++ b/packages/protocol/src/channels.ts @@ -701,9 +701,15 @@ export type DebugControllerNavigateResult = void; export type DebugControllerSetRecorderModeParams = { mode: 'inspecting' | 'recording' | 'none', testIdAttributeName?: string, + browserName?: 'chromium' | 'firefox' | 'webkit', + contextOptions?: BrowserNewContextForReuseParams, + launchOptions?: BrowserTypeLaunchParams, }; export type DebugControllerSetRecorderModeOptions = { testIdAttributeName?: string, + browserName?: 'chromium' | 'firefox' | 'webkit', + contextOptions?: BrowserNewContextForReuseParams, + launchOptions?: BrowserTypeLaunchParams, }; export type DebugControllerSetRecorderModeResult = void; export type DebugControllerHighlightParams = { diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index feeda1c317401..0a9ed9639ad56 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -745,6 +745,14 @@ DebugController: - recording - none testIdAttributeName: string? + browserName: + type: enum? + literals: + - chromium + - firefox + - webkit + contextOptions: BrowserNewContextForReuseParams? + launchOptions: BrowserTypeLaunchParams? highlight: parameters: