From e7fba2f3331e5047f4a7b215396fdbcce545eadd Mon Sep 17 00:00:00 2001 From: rishabhraj36 Date: Tue, 11 Aug 2026 16:03:20 +0530 Subject: [PATCH 1/2] fix(browser): serialize undefined run results as null --- src/browser/run/runner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/run/runner.ts b/src/browser/run/runner.ts index 0cd8eb9..a37ccb9 100644 --- a/src/browser/run/runner.ts +++ b/src/browser/run/runner.ts @@ -446,7 +446,7 @@ export async function runBrowserProgram( rejectRun = undefined; } try { - const serialized = JSON.stringify(value); + const serialized = JSON.stringify(value === undefined ? null : value); if (serialized === undefined) throw new TypeError('Result is not JSON serializable.'); return serialized; } catch (cause) { From 6d1f6c688ef715a8c3bf113f6afe4bb50b48f066 Mon Sep 17 00:00:00 2001 From: rishabhraj36 Date: Wed, 12 Aug 2026 15:54:27 +0530 Subject: [PATCH 2/2] test(browser): cover undefined run results --- src/browser/run/runner.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/browser/run/runner.test.ts b/src/browser/run/runner.test.ts index d525667..b5c8a73 100644 --- a/src/browser/run/runner.test.ts +++ b/src/browser/run/runner.test.ts @@ -405,6 +405,14 @@ describe('runBrowserProgram', () => { expect(output.result).toBe('undefined'); }); + it('serializes a program with no explicit return as null', async () => { + const output = await run(` + await page.getByRole('button', { name: 'Save' }).click(); + `); + + expect(output.result).toBeNull(); + }); + it('keeps time, memory, output, redaction, and serialization limits', async () => { await expect(run('while (true) {}', { timeoutMs: 25 })).rejects.toMatchObject({ code: 'BROWSER_RUN_TIMEOUT',