fix(reuse): serial mode with tracing should not throw (#21726)

Regressed in #19733.
Fixes #21113.
This commit is contained in:
Dmitry Gozman 2023-03-16 14:32:12 -07:00 committed by GitHub
parent a68201b491
commit 7879cf30f0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 46 additions and 5 deletions

View file

@ -239,7 +239,7 @@ const playwrightFixtures: Fixtures<TestFixtures, WorkerFixtures> = ({
_snapshotSuffix: [process.platform, { scope: 'worker' }],
_setupContextOptionsAndArtifacts: [async ({ playwright, _snapshotSuffix, _combinedContextOptions, _reuseContext, _artifactsDir, trace, screenshot, actionTimeout, navigationTimeout, testIdAttribute }, use, testInfo) => {
_setupContextOptionsAndArtifacts: [async ({ playwright, _snapshotSuffix, _combinedContextOptions, _artifactsDir, trace, screenshot, actionTimeout, navigationTimeout, testIdAttribute }, use, testInfo) => {
if (testIdAttribute)
playwrightLibrary.selectors.setTestIdAttribute(testIdAttribute);
testInfo.snapshotSuffix = _snapshotSuffix;
@ -376,11 +376,15 @@ const playwrightFixtures: Fixtures<TestFixtures, WorkerFixtures> = ({
(browserType as any)._onDidCreateContext = onDidCreateBrowserContext;
(browserType as any)._onWillCloseContext = onWillCloseContext;
(browserType as any)._defaultContextOptions = _combinedContextOptions;
const promises: Promise<void>[] = [];
const existingContexts = Array.from((browserType as any)._contexts) as BrowserContext[];
if (_reuseContext)
existingContexts.forEach(c => reusedContexts.add(c));
else
await Promise.all(existingContexts.map(onDidCreateBrowserContext));
for (const context of existingContexts) {
if ((context as any)[kIsReusedContext])
reusedContexts.add(context);
else
promises.push(onDidCreateBrowserContext(context));
}
await Promise.all(promises);
}
{
(playwright.request as any)._onDidCreateContext = onDidCreateRequestContext;
@ -540,6 +544,7 @@ const playwrightFixtures: Fixtures<TestFixtures, WorkerFixtures> = ({
const defaultContextOptions = (playwright.chromium as any)._defaultContextOptions as BrowserContextOptions;
const context = await (browser as any)._newContextForReuse(defaultContextOptions);
(context as any)[kIsReusedContext] = true;
await use(context);
},
@ -631,6 +636,7 @@ function normalizeScreenshotMode(screenshot: PlaywrightWorkerOptions['screenshot
}
const kTracingStarted = Symbol('kTracingStarted');
const kIsReusedContext = Symbol('kReusedContext');
function connectOptionsFromEnv() {
const wsEndpoint = process.env.PW_TEST_CONNECT_WS_ENDPOINT;

View file

@ -516,3 +516,38 @@ test('should not delete others contexts', async ({ runInlineTest }) => {
expect(result.exitCode).toBe(0);
expect(result.passed).toBe(1);
});
test('should survive serial mode with tracing and reuse', async ({ runInlineTest }, testInfo) => {
const result = await runInlineTest({
'playwright.config.ts': `
import { defineConfig } from '@playwright/test';
export default defineConfig({ use: { trace: 'on' } });
`,
'reuse.spec.ts': `
import { test, expect } from '@playwright/test';
let page;
test.describe.configure({ mode: 'serial' });
test.beforeAll(async ({ browser }) => {
page = await browser.newPage();
});
test('one', async ({}) => {
await page.setContent('<button>Click</button>');
await page.click('button');
});
test('two', async ({}) => {
await page.setContent('<input>');
await page.fill('input', 'value');
});
`,
}, { workers: 1 }, { PW_TEST_REUSE_CONTEXT: '1' });
expect(result.exitCode).toBe(0);
expect(result.passed).toBe(2);
expect(fs.existsSync(testInfo.outputPath('test-results', 'reuse-one', 'trace.zip'))).toBe(true);
expect(fs.existsSync(testInfo.outputPath('test-results', 'reuse-two', 'trace.zip'))).toBe(true);
});