From f71df9fb5037857d9147e68942b3651de093dc53 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Wed, 6 Sep 2023 22:58:44 +0200 Subject: [PATCH] chore: introduce sdkLanguage based userDataDir misuse error (#26894) Fixes https://github.com/microsoft/playwright-python/issues/2059 --------- Signed-off-by: Max Schmitt Co-authored-by: Dmitry Gozman --- packages/playwright-core/src/server/browserType.ts | 13 +++++++++++++ .../playwright-core/src/server/chromium/chromium.ts | 2 +- .../playwright-core/src/server/firefox/firefox.ts | 2 +- .../playwright-core/src/server/webkit/webkit.ts | 2 +- tests/library/browsertype-launch.spec.ts | 2 +- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/playwright-core/src/server/browserType.ts b/packages/playwright-core/src/server/browserType.ts index dedba5df0a..781f6a1d5f 100644 --- a/packages/playwright-core/src/server/browserType.ts +++ b/packages/playwright-core/src/server/browserType.ts @@ -281,6 +281,19 @@ export abstract class BrowserType extends SdkObject { return { ...options, devtools, headless, downloadsPath, proxy }; } + protected _createUserDataDirArgMisuseError(userDataDirArg: string): Error { + switch (this.attribution.playwright.options.sdkLanguage) { + case 'java': + return new Error(`Pass userDataDir parameter to 'BrowserType.launchPersistentContext(userDataDir, options)' instead of specifying '${userDataDirArg}' argument`); + case 'python': + return new Error(`Pass user_data_dir parameter to 'browser_type.launch_persistent_context(user_data_dir, **kwargs)' instead of specifying '${userDataDirArg}' argument`); + case 'csharp': + return new Error(`Pass userDataDir parameter to 'BrowserType.LaunchPersistentContextAsync(userDataDir, options)' instead of specifying '${userDataDirArg}' argument`); + default: + return new Error(`Pass userDataDir parameter to 'browserType.launchPersistentContext(userDataDir, options)' instead of specifying '${userDataDirArg}' argument`); + } + } + abstract _defaultArgs(options: types.LaunchOptions, isPersistent: boolean, userDataDir: string): string[]; abstract _connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise; abstract _amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env; diff --git a/packages/playwright-core/src/server/chromium/chromium.ts b/packages/playwright-core/src/server/chromium/chromium.ts index f4d9ec0100..c647154ea4 100644 --- a/packages/playwright-core/src/server/chromium/chromium.ts +++ b/packages/playwright-core/src/server/chromium/chromium.ts @@ -292,7 +292,7 @@ export class Chromium extends BrowserType { const { args = [], proxy } = options; const userDataDirArg = args.find(arg => arg.startsWith('--user-data-dir')); if (userDataDirArg) - throw new Error('Pass userDataDir parameter to `browserType.launchPersistentContext(userDataDir, ...)` instead of specifying --user-data-dir argument'); + throw this._createUserDataDirArgMisuseError('--user-data-dir'); if (args.find(arg => arg.startsWith('--remote-debugging-pipe'))) throw new Error('Playwright manages remote debugging connection itself.'); if (args.find(arg => !arg.startsWith('-'))) diff --git a/packages/playwright-core/src/server/firefox/firefox.ts b/packages/playwright-core/src/server/firefox/firefox.ts index a694ebf904..21f80ca488 100644 --- a/packages/playwright-core/src/server/firefox/firefox.ts +++ b/packages/playwright-core/src/server/firefox/firefox.ts @@ -64,7 +64,7 @@ export class Firefox extends BrowserType { const { args = [], headless } = options; const userDataDirArg = args.find(arg => arg.startsWith('-profile') || arg.startsWith('--profile')); if (userDataDirArg) - throw new Error('Pass userDataDir parameter to `browserType.launchPersistentContext(userDataDir, ...)` instead of specifying --profile argument'); + throw this._createUserDataDirArgMisuseError('--profile'); if (args.find(arg => arg.startsWith('-juggler'))) throw new Error('Use the port parameter instead of -juggler argument'); const firefoxArguments = ['-no-remote']; diff --git a/packages/playwright-core/src/server/webkit/webkit.ts b/packages/playwright-core/src/server/webkit/webkit.ts index 1767fdcc59..9f99f2a583 100644 --- a/packages/playwright-core/src/server/webkit/webkit.ts +++ b/packages/playwright-core/src/server/webkit/webkit.ts @@ -54,7 +54,7 @@ export class WebKit extends BrowserType { const { args = [], proxy, headless } = options; const userDataDirArg = args.find(arg => arg.startsWith('--user-data-dir')); if (userDataDirArg) - throw new Error('Pass userDataDir parameter to `browserType.launchPersistentContext(userDataDir, ...)` instead of specifying --user-data-dir argument'); + throw this._createUserDataDirArgMisuseError('--user-data-dir'); if (args.find(arg => !arg.startsWith('-'))) throw new Error('Arguments can not specify page to be opened'); const webkitArguments = ['--inspector-pipe']; diff --git a/tests/library/browsertype-launch.spec.ts b/tests/library/browsertype-launch.spec.ts index 42b6be8ce5..112901a2e6 100644 --- a/tests/library/browsertype-launch.spec.ts +++ b/tests/library/browsertype-launch.spec.ts @@ -38,7 +38,7 @@ it('should throw if userDataDir option is passed', async ({ browserType }) => { it('should throw if userDataDir is passed as an argument', async ({ browserType }) => { let waitError = null; await browserType.launch({ args: ['--user-data-dir=random-path', '--profile=random-path'] } as any).catch(e => waitError = e); - expect(waitError.message).toContain('Pass userDataDir parameter to `browserType.launchPersistentContext'); + expect(waitError.message).toContain(`Pass userDataDir parameter to 'browserType.launchPersistentContext`); }); it('should throw if port option is passed', async ({ browserType }) => {