From f305b6d02670d8b87af1f80a6cbc9ac9e0878dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Skaza?= Date: Wed, 22 Feb 2023 23:24:28 +0100 Subject: [PATCH] Close playwright browser if an error occurs (#71) * close playwright browser if an error occurs --- src/utils/runner.ts | 2 ++ tests/runner.test.ts | 75 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/src/utils/runner.ts b/src/utils/runner.ts index 7b99955..d3c7d5f 100644 --- a/src/utils/runner.ts +++ b/src/utils/runner.ts @@ -104,6 +104,7 @@ export class PlaywrightRunner { try { await (async () => vm.run(preOpenAction))(); } catch (e) { + await this.teardown(); throw new Error(`invalid action "${preOpenAction}"`); } } @@ -117,6 +118,7 @@ export class PlaywrightRunner { await (async () => vm.run(postOpenAction))(); await this.page.waitForLoadState(); } catch (e) { + await this.teardown(); throw new Error(`invalid action "${postOpenAction}"`); } } diff --git a/tests/runner.test.ts b/tests/runner.test.ts index 09cb8f5..e83575a 100644 --- a/tests/runner.test.ts +++ b/tests/runner.test.ts @@ -646,4 +646,77 @@ test("PlaywrightRunner runs actions in an isolated context", async (t) => { ); }); -// TODO: Test accepts different browsers +test("PlaywrightRunner closes the browser after completing the job", async (t) => { + const { testAppURL } = t.context; + + const runner = new PlaywrightRunner({ + browser: JobBrowser.CHROMIUM, + steps: [ + { + url: `${testAppURL}/`, + actions: ["page.waitForSelector('h1')"], + }, + ], + cookies: [], + options: [], + }); + + await runner.init(); + await runner.exec(); + await runner.finish(); + + t.assert(runner.browser === undefined); +}); + +test("PlaywrightRunner closes the browser if an error occurs", async (t) => { + const { testAppURL } = t.context; + + const runner_1 = new PlaywrightRunner({ + browser: JobBrowser.CHROMIUM, + steps: [ + { + url: `${testAppURL}/`, + actions: ["page.on('invalid')", "page.waitForSelector('h1')"], + }, + ], + cookies: [], + options: [], + }); + + await t.throwsAsync( + async () => { + await runner_1.init(); + await runner_1.exec(); + await runner_1.finish(); + }, + { message: "invalid action \"page.on('invalid')\"" }, + ); + + t.assert(runner_1.browser === undefined); + + const runner_2 = new PlaywrightRunner({ + browser: JobBrowser.CHROMIUM, + steps: [ + { + url: `${testAppURL}/`, + actions: ["page.waitForSelector('nonexistent', {timeout: 1000})"], + }, + ], + cookies: [], + options: [], + }); + + await t.throwsAsync( + async () => { + await runner_2.init(); + await runner_2.exec(); + await runner_2.finish(); + }, + { + message: + "invalid action \"page.waitForSelector('nonexistent', {timeout: 1000})\"", + }, + ); + + t.assert(runner_2.browser === undefined); +});