From 84a70eae2f9943464cda5b0f23560444653d0ee4 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 14 Oct 2021 20:19:52 +0200 Subject: [PATCH] Create `userDataDir` if it does not exist (#9483) --- packages/playwright-core/src/server/browserType.ts | 6 +++++- tests/defaultbrowsercontext-2.spec.ts | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/playwright-core/src/server/browserType.ts b/packages/playwright-core/src/server/browserType.ts index 7b21f51929..fc613597c3 100644 --- a/packages/playwright-core/src/server/browserType.ts +++ b/packages/playwright-core/src/server/browserType.ts @@ -146,7 +146,11 @@ export abstract class BrowserType extends SdkObject { const artifactsDir = await fs.promises.mkdtemp(ARTIFACTS_FOLDER); tempDirectories.push(artifactsDir); - if (!userDataDir) { + if (userDataDir) { + // Firefox bails if the profile directory does not exist, Chrome creates it. We ensure consistent behavior here. + if (!await existsAsync(userDataDir)) + await fs.promises.mkdir(userDataDir, { recursive: true, mode: 0o700 }); + } else { userDataDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), `playwright_${this._name}dev_profile-`)); tempDirectories.push(userDataDir); } diff --git a/tests/defaultbrowsercontext-2.spec.ts b/tests/defaultbrowsercontext-2.spec.ts index ed8ea942e2..a33dc11b40 100644 --- a/tests/defaultbrowsercontext-2.spec.ts +++ b/tests/defaultbrowsercontext-2.spec.ts @@ -17,6 +17,7 @@ import { playwrightTest as it, expect } from './config/browserTest'; import fs from 'fs'; +import path from 'path'; it('should support hasTouch option', async ({ server, launchPersistent }) => { const { page } = await launchPersistent({ hasTouch: true }); @@ -119,6 +120,13 @@ it('should restore state from userDataDir', async ({ browserType, browserOptions await browserContext3.close(); }); +it('should create userDataDir if it does not exist', async ({ createUserDataDir, browserType, browserOptions }) => { + const userDataDir = path.join(await createUserDataDir(), 'nonexisting'); + const context = await browserType.launchPersistentContext(userDataDir, browserOptions); + await context.close(); + expect(fs.readdirSync(userDataDir).length).toBeGreaterThan(0); +}); + it('should restore cookies from userDataDir', async ({ browserType, browserOptions, server, createUserDataDir, platform, channel }) => { it.fixme(platform === 'win32' && channel === 'chrome'); it.slow();