Skip to content

[BUG] Launch preserved browser storage state in persistent browser context #26899

@aminaodzak

Description

@aminaodzak

System info

  • Playwright Version: 1.35
  • Operating System: MacOS, Linux
  • Browser: [All, Chromium, Firefox, WebKit]
  • Other info:

Source code

import { chromium, test as base, BrowserContext, Page, Browser } from '@playwright/test'
import { Users } from '../../playwright.config'
import OnboardingFlow from '..//pageObjects/OnboardingPage/OnboardingFlow'
import DashboardSidebar from '..//pageObjects/DashboardPage/DashboardSidebar'
import SequencesDashboard from '..//pageObjects/DashboardPage/SequencesDashboard'
import LiveFeedDashboard from '../pageObjects/DashboardPage/LiveFeedDashboard'
import DashboardTabCanvas from '../pageObjects/DashboardPage/DashboardTabCanvas'
import DashboardComposeModal from '../pageObjects/DashboardPage/DashboardComposeModal'
import GmailInbox from '../pageObjects/GmailPage/GmailInbox'
import { faker } from '@faker-js/faker'
import SettingsDashboard from '../pageObjects/DashboardPage/SettingsDashboard'
import TasksDashboard from '../pageObjects/DashboardPage/TasksDashboard'
import GroupsDashboard from '../pageObjects/DashboardPage/GroupsDashboard'
import TemplatesDashboard from '../pageObjects/DashboardPage/TemplatesDashboard'
import MeetingTemplatesDashboard from '../pageObjects/DashboardPage/MeetingTemplatesDashboard'
import RulesDashboard from '../pageObjects/DashboardPage/RulesDashboard'
import DashboardComposeCall from '../pageObjects/DashboardPage/DashboardComposeCall'
import SalesforceLogin from '../pageObjects/SalesforcePage/SalesforceLogin'
import SalesforceIndividualContact from '../pageObjects/SalesforcePage/SalesforceIndividualContact'
import ReportsDashboard from '../pageObjects/DashboardPage/ReportsDashboard'
import OutboxDashboard from '../pageObjects/DashboardPage/OutboxDashboard'
import ContactsDashboard from '../pageObjects/DashboardPage/ContactsDashboard'
import BrandingDashboard from '../pageObjects/DashboardPage/BrandingDashboard'
import path from 'path'

const extensionPath = path.join(__dirname, '../../extension/') 

type WithExtenstion = {
	browser: Browser
	context: BrowserContext
	page: Page
} & TestConfig

type TestConfig = {
	//pages
	onboardingFlow: OnboardingFlow
	dashBoardSidebar: DashboardSidebar
	sequencesDashboard: SequencesDashboard
	liveFeedDashboard: LiveFeedDashboard
	dashboardTabCanvas: DashboardTabCanvas
	dashboardComposeModal: DashboardComposeModal
	gmailInbox: GmailInbox
	settingsDashboard: SettingsDashboard
	tasksDashboard: TasksDashboard
	groupsDashboard: GroupsDashboard
	templatesDashboard: TemplatesDashboard
	meetingTemplates: MeetingTemplatesDashboard
	rulesDashboard: RulesDashboard
	dashboardComposeCall: DashboardComposeCall
	salesforceLogin: SalesforceLogin
	salesforceIndividualContact: SalesforceIndividualContact
	reportsDashboard: ReportsDashboard
	outboxDashboard: OutboxDashboard
	contactsDashboard: ContactsDashboard
	brandingDashboard: BrandingDashboard

	//users
	users: Users
	userDataPath: string
}

export const test = base.extend<TestConfig>({
	users: [
		{
			defaultUserEmail: '',
			defaultUserPwd: '',
			envUser1Email: '',
			envUser1Pwd: '',
			envUser2Email: '',
			envUser2Pwd: '',
			envUser3Email: '',
			envUser3Pwd: '',
			envUser4Email: '',
			envUser4Pwd: '',
			envUser5Email: '',
			envUser5Pwd: '',
			envUser6Email: '',
			envUser6Pwd: '',
			envUser7Email: '',
			envUser7Pwd: '',
			envUser8Email: '',
			envUser8Pwd: '',
			envUser9Email: '',
			envUser9Pwd: '',
			envUser10Email: '',
			envUser10Pwd: '',
			envUser11Email: '',
			envUser11Pwd: '',
			envUser12Email: '',
			envUser12Pwd: '',
			groupMember: '',
			secretToken0: '',
			secretToken1: '',
			secretToken2: '',
			secretToken3: '',
			secretToken4: '',
			secretToken5: '',
			secretToken6: '',
			secretToken7: '',
			secretToken8: '',
			secretToken9: '',
			secretToken10: '',
			secretToken11: '',
			secretToken12: '',
			sfUser1Email: '',
			sfUser1Pwd: '',
			sfUser2Email: '',
			sfUser2Pwd: '',
			sfUser3Email: '',
			sfUser3Pwd: '',
			delegatedUserEmail: '',
			delegatedUserPwd: '',
			delegatedSecret: '',
			seqRegSuiteUserEmail: '',
			seqRegSuiteUserPwd: '',
			seqRegSuiteUserSecret: '',
			shareUserEmail: '',
			shareUserPwd: '',
			sharedSecret: '',
			sfUser4Email: '',
			sfUser4Pwd: '',
			sfUser5Email: '',
			sfUser5Pwd: '',
			sharedActivity1Email: '',
			sharedActivity1Pwd: '',
			sharedActivity1Secret: '',
			phoneNumber: '',
			calendarEnhancementEmail: '',
			calendarEnhancementPwd: '',
			calendarEnhancementSecret: '',
			nonAdminSeqRecipientEmail: '',
			adminSeqRecipientEmail: '',
		},
		{ option: true },
	],
	// Define a fixture. Note that it can use built-in fixture "page"
	onboardingFlow: async ({ page }, use) => {
		await use(new OnboardingFlow(page))
	},
	dashBoardSidebar: async ({ page }, use) => {
		await use(new DashboardSidebar(page))
	},
	sequencesDashboard: async ({ page }, use) => {
		await use(new SequencesDashboard(page))
	},
	liveFeedDashboard: async ({ page }, use) => {
		await use(new LiveFeedDashboard(page))
	},
	dashboardTabCanvas: async ({ page }, use) => {
		await use(new DashboardTabCanvas(page))
	},
	dashboardComposeModal: async ({ page }, use) => {
		await use(new DashboardComposeModal(page))
	},
	gmailInbox: async ({ page }, use) => {
		await use(new GmailInbox(page))
	},
	settingsDashboard: async ({ page }, use) => {
		await use(new SettingsDashboard(page))
	},
	tasksDashboard: async ({ page }, use) => {
		await use(new TasksDashboard(page))
	},
	groupsDashboard: async ({ page }, use) => {
		await use(new GroupsDashboard(page))
	},
	templatesDashboard: async ({ page }, use) => {
		await use(new TemplatesDashboard(page))
	},
	meetingTemplates: async ({ page }, use) => {
		await use(new MeetingTemplatesDashboard(page))
	},
	rulesDashboard: async ({ page }, use) => {
		await use(new RulesDashboard(page))
	},
	dashboardComposeCall: async ({ page }, use) => {
		await use(new DashboardComposeCall(page))
	},
	salesforceLogin: async ({ page }, use) => {
		await use(new SalesforceLogin(page))
	},
	salesforceIndividualContact: async ({ page }, use) => {
		await use(new SalesforceIndividualContact(page))
	},
	reportsDashboard: async ({ page }, use) => {
		await use(new ReportsDashboard(page))
	},
	outboxDashboard: async ({ page }, use) => {
		await use(new OutboxDashboard(page))
	},
	contactsDashboard: async ({ page }, use) => {
		await use(new ContactsDashboard(page))
	},
	brandingDashboard: async ({ page }, use) => {
		await use(new BrandingDashboard(page))
	}
})

export function createTestWithExtension(storagePath = 'user') {
	return base.extend<WithExtenstion>({
		browser: async (use) => {
			const browser = await chromium.launch()
			await use(browser)
			// await browser.close() // Close the browser when the fixture is finished
		},
		context: async ({ browserName }, use) => {
			const browserTypes = { chromium }
			const launchOptions = {
				headless: false,
				args: [
					
					`--disable-extensions-except=${extensionPath}`,
					'--no-sandbox',
					'--disable-setuid-sandbox',
					'--disable-dev-shm-usage',
					'--disable-accelerated-2d-canvas',
					'--no-first-run',
					'--no-zygote',
					// '--single-process',
					'--disable-gpu',
				],
			}
			const context = await browserTypes[browserName].launchPersistentContext(
				`/tmp/${storagePath}`,
				launchOptions
			)

			const pages = await context.pages()
			const blankPage = pages.find(p => p.url() === 'about:blank')
			await blankPage?.close()
			await use(context)
		},
		page: async ({ context }, use) => {
			const page = await context.newPage()
			await use(page)
		},
		users: [
			{
				defaultUserEmail: '',
				defaultUserPwd: '',
				envUser1Email: '',
				envUser1Pwd: '',
				envUser2Email: '',
				envUser2Pwd: '',
				envUser3Email: '',
				envUser3Pwd: '',
				envUser4Email: '',
				envUser4Pwd: '',
				envUser5Email: '',
				envUser5Pwd: '',
				envUser6Email: '',
				envUser6Pwd: '',
				envUser7Email: '',
				envUser7Pwd: '',
				envUser8Email: '',
				envUser8Pwd: '',
				envUser9Email: '',
				envUser9Pwd: '',
				envUser10Email: '',
				envUser10Pwd: '',
				envUser11Email: '',
				envUser11Pwd: '',
				envUser12Email: '',
				envUser12Pwd: '',
				groupMember: '',
				secretToken0: '',
				secretToken1: '',
				secretToken2: '',
				secretToken3: '',
				secretToken4: '',
				secretToken5: '',
				secretToken6: '',
				secretToken7: '',
				secretToken8: '',
				secretToken9: '',
				secretToken10: '',
				secretToken11: '',
				secretToken12: '',
				sfUser1Email: '',
				sfUser1Pwd: '',
				sfUser2Email: '',
				sfUser2Pwd: '',
				sfUser3Email: '',
				sfUser3Pwd: '',
				delegatedUserEmail: '',
				delegatedUserPwd: '',
				delegatedSecret: '',
				seqRegSuiteUserEmail: '',
				seqRegSuiteUserPwd: '',
				seqRegSuiteUserSecret: '',
				shareUserEmail: '',
				shareUserPwd: '',
				sharedSecret: '',
				sfUser4Email: '',
				sfUser4Pwd: '',
				sfUser5Email: '',
				sfUser5Pwd: '',
				sharedActivity1Email: '',
				sharedActivity1Pwd: '',
				sharedActivity1Secret: '',
				phoneNumber: '',
				calendarEnhancementEmail: '',
				calendarEnhancementPwd: '',
				calendarEnhancementSecret: '',
				nonAdminSeqRecipientEmail: '',
				adminSeqRecipientEmail: '',
			},
			{ option: true },
		],
		// Define a fixture. Note that it can use built-in fixture "page"
		onboardingFlow: async ({ page }, use) => {
			await use(new OnboardingFlow(page))
		},
		dashBoardSidebar: async ({ page }, use) => {
			await use(new DashboardSidebar(page))
		},
		sequencesDashboard: async ({ page }, use) => {
			await use(new SequencesDashboard(page))
		},
		liveFeedDashboard: async ({ page }, use) => {
			await use(new LiveFeedDashboard(page))
		},
		dashboardTabCanvas: async ({ page }, use) => {
			await use(new DashboardTabCanvas(page))
		},
		dashboardComposeModal: async ({ page }, use) => {
			await use(new DashboardComposeModal(page))
		},
		gmailInbox: async ({ page }, use) => {
			await use(new GmailInbox(page))
		},
		settingsDashboard: async ({ page }, use) => {
			await use(new SettingsDashboard(page))
		},
		tasksDashboard: async ({ page }, use) => {
			await use(new TasksDashboard(page))
		},
		groupsDashboard: async ({ page }, use) => {
			await use(new GroupsDashboard(page))
		},
		templatesDashboard: async ({ page }, use) => {
			await use(new TemplatesDashboard(page))
		},
		meetingTemplates: async ({ page }, use) => {
			await use(new MeetingTemplatesDashboard(page))
		},
		rulesDashboard: async ({ page }, use) => {
			await use(new RulesDashboard(page))
		},
		dashboardComposeCall: async ({ page }, use) => {
			await use(new DashboardComposeCall(page))
		},
		salesforceLogin: async ({ page }, use) => {
			await use(new SalesforceLogin(page))
		},
		salesforceIndividualContact: async ({ page }, use) => {
			await use(new SalesforceIndividualContact(page))
		},
		reportsDashboard: async ({ page }, use) => {
			await use(new ReportsDashboard(page))
		},
		outboxDashboard: async ({ page }, use) => {
			await use(new OutboxDashboard(page))
		},
		contactsDashboard: async ({ page }, use) => {
			await use(new ContactsDashboard(page))
		},
		brandingDashboard: async ({ page }, use) => {
			await use(new BrandingDashboard(page))
		}
	})
}

export { faker }


  • I provided exact source code that allows reproducing the issue locally.

Link to the GitHub repository with the repro

[https://github.com/your_profile/playwright_issue_title]

or

Config file

// playwright.config.ts
import { defineConfig } from '@playwright/test'
import dotenv from 'dotenv'

/**
 * Read environment variables from file.
 * https://github.com/motdotla/dotenv
 */
dotenv.config()
require('dotenv').config({ path: './.env' })

export type Users = {
  defaultUserEmail: string | undefined
  defaultUserPwd: string | undefined
  envUser1Email: string | undefined
  envUser1Pwd: string | undefined
  envUser2Email: string | undefined
  envUser2Pwd: string | undefined
  envUser3Email: string | undefined
  envUser3Pwd: string | undefined
  envUser4Email: string | undefined
  envUser4Pwd: string | undefined
  envUser5Email: string | undefined
  envUser5Pwd: string | undefined
  envUser6Email: string | undefined
  envUser6Pwd: string | undefined
  envUser7Email: string | undefined
  envUser7Pwd: string | undefined
  envUser8Email: string | undefined
  envUser8Pwd: string | undefined
  envUser9Email: string | undefined
  envUser9Pwd: string | undefined
  envUser10Email: string | undefined
  envUser10Pwd: string | undefined
  envUser11Email: string | undefined
  envUser11Pwd: string | undefined
  envUser12Email: string | undefined
  envUser12Pwd: string | undefined
  groupMember: string | undefined
  secretToken0: string | undefined
  secretToken1: string | undefined
  secretToken2: string | undefined
  secretToken3: string | undefined
  secretToken4: string | undefined
  secretToken5: string | undefined
  secretToken6: string | undefined
  secretToken7: string | undefined
  secretToken8: string | undefined
  secretToken9: string | undefined
  secretToken10: string | undefined
  secretToken11: string | undefined
  secretToken12: string | undefined
  sfUser1Email: string | undefined
  sfUser1Pwd: string | undefined
  sfUser2Email: string | undefined
  sfUser2Pwd: string | undefined
  sfUser3Email: string | undefined
  sfUser3Pwd: string | undefined
  delegatedUserEmail: string | undefined
  delegatedUserPwd: string | undefined
  delegatedSecret: string | undefined
  seqRegSuiteUserEmail: string | undefined
  seqRegSuiteUserPwd: string | undefined
  seqRegSuiteUserSecret: string | undefined
  shareUserEmail: string | undefined
  shareUserPwd: string | undefined
  sharedSecret: string | undefined
  sharedActivity1Email: string | undefined
  sharedActivity1Pwd: string | undefined
  sharedActivity1Secret: string | undefined
  sfUser4Email: string | undefined
  sfUser4Pwd: string | undefined
  sfUser5Email: string | undefined
  sfUser5Pwd: string | undefined
  phoneNumber: string | undefined
  calendarEnhancementEmail: string | undefined
  calendarEnhancementPwd: string | undefined
  calendarEnhancementSecret: string | undefined
  nonAdminSeqRecipientEmail: string | undefined
  adminSeqRecipientEmail: string | undefined
}

export type ProjectConfiguration = {
  users: Users
  userDataPath: string | undefined
}

/**
 * See https://playwright.dev/docs/test-configuration.
 */
const config = defineConfig<ProjectConfiguration>({
	/* Maximum time one test can run for. */
	timeout: 180 * 1000,
	expect: {
		/**
     * Maximum time expect() should wait for the condition to be met.
     * For example in `await expect(locator).toHaveText();`
     */
		timeout: 10000,
	},
	/* Run tests in files in parallel */
	fullyParallel: true,
	/* Fail the build on CI if you accidentally left test.only in the source code. */
	forbidOnly: !!process.env.CI,
	/* Retry on CI only */
	retries: process.env.CI ? 0 : 0,
	/* Opt out of parallel tests on CI. */
	workers: process.env.CI ? 10 : 10,
	/* Reporter to use. See https://playwright.dev/docs/test-reporters */
	reporter: process.env.ci ? 'allure-playwright' :
	 [ ['allure-playwright', { outputFolder: 'allure-results', detail: true }],
	['line'], ['html'] ],
	/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
	use: {
		launchOptions:{
			args : [
				'--use-fake-ui-for-media-stream',
				'--use-fake-device-for-media-stream',
				'--use-file-for-fake-audio-capture=./data/audio.wav',
				'--use-file-for-fake-video-capture=./data/akiyo_cif.y4m'			
			],
		},
		browserName: 'chromium',
		// channel: 'chrome',
		headless: false,
		screenshot: 'only-on-failure',
		video: 'on',
		viewport: {
			width: 1920,
			height: 1080
		},
		locale: 'en-US',
		/* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */
		actionTimeout: 20000,
   
		/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
		trace: 'retain-on-failure',
	},
	projects: [
		{ 
			name: 'staging',
			use: {
				baseURL: process.env.STG_BASE_URL,
				viewport: { width: 1450, height: 795 },
				userDataPath: process.env.PATH,
				users: {
					defaultUserEmail: process.env.DEFAULT_TEST_USER_EMAIL,
					defaultUserPwd: process.env.DEFAULT_TEST_USER_PWD,

					envUser1Email: process.env.AQA1_STG_USER_EMAIL,
					envUser1Pwd: process.env.AQA1_STG_USER_PWD,
					envUser2Email: process.env.AQA2_STG_USER_EMAIL,
					envUser2Pwd: process.env.AQA2_STG_USER_PWD,
					envUser3Email: process.env.AQA3_STG_USER_EMAIL,
					envUser3Pwd: process.env.AQA3_STG_USER_PWD,
					envUser4Email: process.env.AQA4_STG_USER_EMAIL,
					envUser4Pwd: process.env.AQA4_STG_USER_PWD,

					envUser5Email: process.env.AQA5_STG_USER_EMAIL,
					envUser5Pwd: process.env.AQA5_STG_USER_PWD,
					envUser6Email: process.env.AQA6_STG_USER_EMAIL,
					envUser6Pwd: process.env.AQA6_STG_USER_PWD,

					envUser7Email: process.env.GMAIL1_STG_USER_EMAIL,
					envUser7Pwd: process.env.GMAIL1_STG_USER_PWD,
					envUser8Email: process.env.GMAIL2_STG_USER_EMAIL,
					envUser8Pwd: process.env.GMAIL2_STG_USER_PWD,
					envUser9Email: process.env.GMAIL3_STG_USER_EMAIL,
					envUser9Pwd: process.env.GMAIL3_STG_USER_PWD,
					envUser10Email: process.env.GMAIL4_STG_USER_EMAIL,
					envUser10Pwd: process.env.GMAIL4_STG_USER_PWD,
					envUser11Email: process.env.GMAIL5_STG_USER_EMAIL,
					envUser11Pwd: process.env.GMAIL5_STG_USER_PWD,
					envUser12Email: process.env.GMAIL7_STG_USER_EMAIL,
					envUser12Pwd: process.env.GMAIL7_STG_USER_PWD,

					groupMember: process.env.STAGING_GROUP_MEMBER,
					secretToken0: process.env.AQA_USER_SECRET,
					secretToken1: process.env.AQA1_USER_SECRET,
					secretToken2: process.env.AQA2_USER_SECRET,
					secretToken3: process.env.AQA3_USER_SECRET,
					secretToken4: process.env.AQA4_USER_SECRET,
					
					secretToken5: process.env.AQA5_STG_USER_SECRET,
					secretToken6: process.env.AQA6_STG_USER_SECRET,
					secretToken7: process.env.MM_AUTOMATION_STG1_SECRET,
					secretToken8: process.env.QA4_STG_USER_SECRET,
					secretToken9: process.env.QA5_STG_USER_SECRET,
					secretToken10: process.env.QA6_STG_USER_SECRET,
					secretToken11: process.env.QA1_STG_USER_SECRET,
					secretToken12: process.env.AQA3_STG_USER_SECRET,

					sfUser1Email: process.env.SF1_USER_EMAIL,
					sfUser1Pwd: process.env.SF1_USER_PWD,
					sfUser2Email: process.env.SF2_USER_EMAIL,
					sfUser2Pwd: process.env.SF2_USER_PWD,
					sfUser3Email: process.env.SF3_STG_USER_EMAIL,
					sfUser3Pwd: process.env.SF3_STG_USER_PWD,
					sfUser4Email: process.env.SF4_USER_EMAIL,
					sfUser4Pwd: process.env.SF4_USER_PWD,
					sfUser5Email: process.env.SF5_USER_EMAIL,
					sfUser5Pwd: process.env.SF5_USER_PWD,

					delegatedUserEmail: process.env.DELEGATED_SEQ_STG_EMAIL,
					delegatedUserPwd: process.env.DELEGATED_SEQ_STG_PWD,
					delegatedSecret: process.env.DELEGATED_SEQ_STG_SECRET,

					seqRegSuiteUserEmail: process.env.SEQ_REG_STG_USER_EMAIL,
					seqRegSuiteUserPwd: process.env.SEQ_REG_STG_USER_PWD,
					seqRegSuiteUserSecret: process.env.SEQ_REG_STG_USER_SECRET,
					nonAdminSeqRecipientEmail: process.env.STG_NON_ADMIN_RECIPIENT_EMAIL,
					adminSeqRecipientEmail: process.env.STG_ADMIN_RECIPIENT_EMAIL,

					shareUserEmail: process.env.SHARED_SEQ_STG_EMAIL,
					shareUserPwd: process.env.SHARED_SEQ_STG_PWD,
					sharedSecret: process.env.SHARED_SEQ_STG_SECRET,

					sharedActivity1Email: process.env.SHARED_ACTIVITY1_STG_EMAIL,
					sharedActivity1Pwd: process.env.SHARED_ACTIVITY1_STG_PWD,
					sharedActivity1Secret: process.env.SHARED_ACTIVITY1_STG_SECRET,

					phoneNumber: process.env.QA1_STG_NUMBER,
					calendarEnhancementEmail: process.env.GMAIL6_STG_USER_EMAIL,
					calendarEnhancementPwd: process.env.GMAIL6_STG_USER_PWD,
					calendarEnhancementSecret: process.env.QA2_STG_USER_SECRET

				}
			}
		},
		{
			name: 'production',
			use: {
				baseURL: process.env.PROD_BASE_URL,
				viewport: { width: 1450, height: 795 },
				userDataPath: process.env.PATH,
				users: {
					defaultUserEmail: process.env.DEFAULT_TEST_USER_EMAIL,
					defaultUserPwd: process.env.DEFAULT_TEST_USER_PWD,

					envUser1Email: process.env.AQA5_PROD_USER_EMAIL,
					envUser1Pwd: process.env.AQA5_PROD_USER_PWD,
					envUser2Email: process.env.AQA6_PROD_USER_EMAIL,
					envUser2Pwd: process.env.AQA6_PROD_USER_PWD,
					envUser3Email: process.env.AQA7_PROD_USER_EMAIL,
					envUser3Pwd: process.env.AQA7_PROD_USER_PWD,
					envUser4Email: process.env.AQA8_PROD_USER_EMAIL,
					envUser4Pwd: process.env.AQA8_PROD_USER_PWD,

					envUser5Email: process.env.AQA3_PROD_USER_EMAIL,
					envUser5Pwd: process.env.AQA3_PROD_USER_PWD,
					envUser6Email: process.env.AQA4_PROD_USER_EMAIL,
					envUser6Pwd: process.env.AQA4_PROD_USER_PWD,

					envUser7Email: process.env.GMAIL1_PROD_USER_EMAIL,
					envUser7Pwd: process.env.GMAIL1_PROD_USER_PWD,
					envUser8Email: process.env.GMAIL2_PROD_USER_EMAIL,
					envUser8Pwd: process.env.GMAIL2_PROD_USER_PWD,
					envUser9Email: process.env.GMAIL3_PROD_USER_EMAIL,
					envUser9Pwd: process.env.GMAIL3_PROD_USER_PWD,
					envUser10Email: process.env.GMAIL4_PROD_USER_EMAIL,
					envUser10Pwd: process.env.GMAIL4_PROD_USER_PWD,
					envUser11Email: process.env.GMAIL5_PROD_USER_EMAIL,
					envUser11Pwd: process.env.GMAIL5_PROD_USER_PWD,
					envUser12Email: process.env.GMAIL7_PROD_USER_EMAIL,
					envUser12Pwd: process.env.GMAIL7_PROD_USER_PWD,

					groupMember: process.env.PRODUCTION_GROUP_MEMBER,
					secretToken0: process.env.AQA_USER_SECRET,
					secretToken1: process.env.AQA5_USER_SECRET,
					secretToken2: process.env.AQA6_USER_SECRET,
					secretToken3: process.env.AQA7_USER_SECRET,
					secretToken4: process.env.AQA8_USER_SECRET,
					
					secretToken5: process.env.AQA3_PROD_USER_SECRET,
					secretToken6: process.env.AQA4_PROD_USER_SECRET,
                    secretToken7: process.env.MM_AUTOMATION_PROD1_SECRET,
					
					secretToken8: process.env.QA1_PROD_USER_SECRET,
					secretToken9: process.env.QA2_PROD_USER_SECRET,
					secretToken10: process.env.QA3_PROD_USER_SECRET,
					secretToken11: process.env.QA4_PROD_USER_SECRET,
					secretToken12: process.env.QA6_PROD_USER_SECRET,

					sfUser1Email: process.env.SF1_USER_EMAIL,
					sfUser1Pwd: process.env.SF1_USER_PWD,
					sfUser2Email: process.env.SF2_USER_EMAIL,
					sfUser2Pwd: process.env.SF2_USER_PWD,
					sfUser3Email: process.env.SF3_PROD_USER_EMAIL,
					sfUser3Pwd: process.env.SF3_PROD_USER_PWD,
					sfUser4Email: process.env.SF4_USER_EMAIL,
					sfUser4Pwd: process.env.SF4_USER_PWD,
					sfUser5Email: process.env.SF5_USER_EMAIL,
					sfUser5Pwd: process.env.SF5_USER_PWD,

					delegatedUserEmail: process.env.DELEGATED_SEQ_PROD_EMAIL,
					delegatedUserPwd: process.env.DELEGATED_SEQ_PROD_PWD,
					delegatedSecret: process.env.DELEGATED_SEQ_PROD_SECRET,

					seqRegSuiteUserEmail: process.env.SEQ_REG_PROD_USER_EMAIL,
					seqRegSuiteUserPwd: process.env.SEQ_REG_PROD_USER_PWD,
					seqRegSuiteUserSecret: process.env.SEQ_REG_PROD_USER_SECRET,
					nonAdminSeqRecipientEmail: process.env.PROD_NON_ADMIN_RECIPIENT_EMAIL,
					adminSeqRecipientEmail: process.env.PROD_ADMIN_RECIPIENT_EMAIL,

					shareUserEmail: process.env.SHARED_SEQ_PROD_EMAIL,
					shareUserPwd: process.env.SHARED_SEQ_PROD_PWD,
					sharedSecret: process.env.SHARED_SEQ_PROD_SECRET,

					sharedActivity1Email: process.env.SHARED_ACTIVITY1_PROD_EMAIL,
					sharedActivity1Pwd: process.env.SHARED_ACTIVITY1_PROD_PWD,
					sharedActivity1Secret: process.env.SHARED_ACTIVITY1_PROD_SECRET,

					phoneNumber: process.env.QA4_PROD_NUMBER,
					calendarEnhancementEmail: process.env.GMAIL6_PROD_USER_EMAIL,
					calendarEnhancementPwd: process.env.GMAIL6_PROD_USER_PWD,
					calendarEnhancementSecret: process.env.QA5_PROD_USER_SECRET
				}
			}
		}
	]
})

export default config

Test file (self-contained)

it('should check the box using setChecked', async ({ page }) => {
  await page.setContent(`<input id='checkbox' type='checkbox'></input>`);
  await page.getByRole('checkbox').check();
  await expect(page.getByRole('checkbox')).toBeChecked();
});

Steps

  • In the above fixture/Base class I have configured browser with or without extension.
  • In our suite, we preserve user storage and run tests in workers
  • Local and Github CI - single test run works fine, extension loads etc
  • However when enabling parallel worker runs, browser is completely crushed and we can't do anything about it

Expected

[Describe expected behavior]

To use preserved state in persistent context

Actual

[Describe actual behavior]

Running tests in persistent context with preserved browser state, crashes when running more than one test in parallel worker execution.

Screenshot 2023-09-06 at 3 48 27 PM

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions