diff --git a/packages/playwright/src/index.ts b/packages/playwright/src/index.ts index 01ae465097..d848d5fd5c 100644 --- a/packages/playwright/src/index.ts +++ b/packages/playwright/src/index.ts @@ -140,6 +140,7 @@ const playwrightFixtures: Fixtures = ({ permissions: [({ contextOptions }, use) => use(contextOptions.permissions), { option: true }], proxy: [({ contextOptions }, use) => use(contextOptions.proxy), { option: true }], storageState: [({ contextOptions }, use) => use(contextOptions.storageState), { option: true }], + clientCertificates: [({ contextOptions }, use) => use(contextOptions.clientCertificates), { option: true }], timezoneId: [({ contextOptions }, use) => use(contextOptions.timezoneId), { option: true }], userAgent: [({ contextOptions }, use) => use(contextOptions.userAgent), { option: true }], viewport: [({ contextOptions }, use) => use(contextOptions.viewport === undefined ? { width: 1280, height: 720 } : contextOptions.viewport), { option: true }], @@ -155,6 +156,7 @@ const playwrightFixtures: Fixtures = ({ _combinedContextOptions: [async ({ acceptDownloads, bypassCSP, + clientCertificates, colorScheme, deviceScaleFactor, extraHTTPHeaders, @@ -209,6 +211,8 @@ const playwrightFixtures: Fixtures = ({ options.proxy = proxy; if (storageState !== undefined) options.storageState = storageState; + if (clientCertificates?.length) + options.clientCertificates = resolveClientCerticates(clientCertificates); if (timezoneId !== undefined) options.timezoneId = timezoneId; if (userAgent !== undefined) @@ -416,6 +420,28 @@ function attachConnectedHeaderIfNeeded(testInfo: TestInfo, browser: Browser | nu } } +function resolveFileToConfig(file: string | undefined) { + const config = test.info().config.configFile; + if (!config || !file) + return file; + if (!path.isAbsolute(file)) + return path.resolve(path.dirname(config), file); + return file; +} + +type ClientCertificates = NonNullable; + +function resolveClientCerticates(clientCertificates: ClientCertificates): ClientCertificates { + for (const { certs } of clientCertificates) { + for (const cert of certs) { + cert.certPath = resolveFileToConfig(cert.certPath); + cert.keyPath = resolveFileToConfig(cert.keyPath); + cert.pfxPath = resolveFileToConfig(cert.pfxPath); + } + } + return clientCertificates; +} + const kTracingStarted = Symbol('kTracingStarted'); const kIsReusedContext = Symbol('kReusedContext'); diff --git a/packages/playwright/types/test.d.ts b/packages/playwright/types/test.d.ts index 68db00c9cc..2fa3f60b44 100644 --- a/packages/playwright/types/test.d.ts +++ b/packages/playwright/types/test.d.ts @@ -5239,7 +5239,7 @@ export interface PlaywrightTestOptions { * ``` * */ - clientCertificates: ClientCertificate[]; + clientCertificates: ClientCertificate[] | undefined; /** * Specify device scale factor (can be thought of as dpr). Defaults to `1`. Learn more about * [emulating devices with device scale factor](https://playwright.dev/docs/emulation#devices). diff --git a/utils/generate_types/overrides-test.d.ts b/utils/generate_types/overrides-test.d.ts index 2b2d6aa4d9..3a42d27f83 100644 --- a/utils/generate_types/overrides-test.d.ts +++ b/utils/generate_types/overrides-test.d.ts @@ -210,7 +210,7 @@ export interface PlaywrightTestOptions { acceptDownloads: boolean; bypassCSP: boolean; colorScheme: ColorScheme; - clientCertificates: ClientCertificate[]; + clientCertificates: ClientCertificate[] | undefined; deviceScaleFactor: number | undefined; extraHTTPHeaders: ExtraHTTPHeaders | undefined; geolocation: Geolocation | undefined;