diff --git a/dev-packages/cli/src/run-test.ts b/dev-packages/cli/src/run-test.ts index b3284dd19b9ef..76a004c08e5cc 100644 --- a/dev-packages/cli/src/run-test.ts +++ b/dev-packages/cli/src/run-test.ts @@ -36,15 +36,25 @@ export default async function runTest(options: TestOptions): Promise { matchAppUrl: () => true, // all urls are application urls newPage: async () => { const browser = await puppeteer.launch(launch); - return browser.newPage(); + // re-use empty tab + const [tab] = await browser.pages(); + return tab; }, onWillRun: async () => { + const promises = []; if (options.coverage) { - await Promise.all([ - testPage.coverage.startJSCoverage(), - testPage.coverage.startCSSCoverage() - ]); + promises.push(testPage.coverage.startJSCoverage()); + promises.push(testPage.coverage.startCSSCoverage()); + } + // When launching in non-headless mode (with a UI and dev-tools open), make sure + // the app has focus, to avoid failures of tests that query the UI's state. + if (launch && launch.devtools) { + promises.push(testPage.waitForSelector('#theia-app-shell.p-Widget.theia-ApplicationShell') + .then(e => e.click())); } + // Clear application's local storage to avoid reusing previous state + promises.push(testPage.evaluate(() => localStorage.clear())); + await Promise.all(promises); }, onDidRun: async failures => { if (options.coverage) { @@ -56,6 +66,8 @@ export default async function runTest(options: TestOptions): Promise { require('puppeteer-to-istanbul').write([...jsCoverage, ...cssCoverage]); } if (exit) { + // allow a bit of time to finish printing-out test results + await new Promise(resolve => setTimeout(resolve, 1000)); await testPage.close(); process.exit(failures > 0 ? 1 : 0); } diff --git a/dev-packages/cli/src/test-page.ts b/dev-packages/cli/src/test-page.ts index 29e50554f2a10..f94ddedb618da 100644 --- a/dev-packages/cli/src/test-page.ts +++ b/dev-packages/cli/src/test-page.ts @@ -113,7 +113,7 @@ export default async function newTestPage(options: TestPageOptions): Promise { }), launch: { args: ['--no-sandbox'], + // eslint-disable-next-line no-null/no-null + defaultViewport: null, // view port can take available space instead of 800x600 default devtools: testInspect }, files: {