From 4fd315c5ba8e2c1d6f4d3d9d2dc8514b38db9e19 Mon Sep 17 00:00:00 2001 From: YAN YIXIN Date: Thu, 5 Nov 2026 22:51:13 +0800 Subject: [PATCH] [test] browser: skip the first-run model setup welcome Since #97 the first-run welcome dialog opens whenever a model kind is not configured. The isolated fixture configures only agent and image models, so the dialog covers the canvas in every browser check that predates it and they fail on their first click or wait. Dismiss the model setup welcome before the page loads in the 25 checks that were blocked by it, using the same init script the newer checks (double_shift_chat, project_title_enter) already use. None of these checks exercise the welcome flow itself. Co-Authored-By: Claude Opus 5.5 --- scripts/verify_creation_browser.mjs | 4 ++++ scripts/verify_selection_panels_browser.mjs | 4 ++++ tests/browser/assistant_sessions.mjs | 4 ++++ tests/browser/canvas_crop.mjs | 4 ++++ tests/browser/canvas_keyboard.mjs | 4 ++++ tests/browser/canvas_layers.mjs | 4 ++++ tests/browser/canvas_notifications.mjs | 4 ++++ tests/browser/canvas_selection_history.mjs | 4 ++++ tests/browser/canvas_wheel.mjs | 4 ++++ tests/browser/composer_duration.mjs | 4 ++++ tests/browser/composer_expansion.mjs | 4 ++++ tests/browser/context_menu_dismissal.mjs | 4 ++++ tests/browser/created_node_focus.mjs | 4 ++++ tests/browser/creation_history.mjs | 4 ++++ tests/browser/cross_canvas_paste.mjs | 4 ++++ tests/browser/default_entry.mjs | 4 ++++ tests/browser/generation_parameters.mjs | 4 ++++ tests/browser/jiuwenswarm_picker.mjs | 4 ++++ tests/browser/minimax_h3.mjs | 4 ++++ tests/browser/multi_selection_references.mjs | 4 ++++ tests/browser/paste_undo.mjs | 4 ++++ tests/browser/project_list_overflow.mjs | 4 ++++ tests/browser/reference_picker.mjs | 4 ++++ tests/browser/structured_editors.mjs | 4 ++++ tests/browser/tool_drafts.mjs | 4 ++++ 25 files changed, 100 insertions(+) diff --git a/scripts/verify_creation_browser.mjs b/scripts/verify_creation_browser.mjs index 0b1575d8..54abfecb 100644 --- a/scripts/verify_creation_browser.mjs +++ b/scripts/verify_creation_browser.mjs @@ -27,6 +27,10 @@ assert.equal( ); const browser = await launchBrowser(); const page = await browser.newPage({ viewport: { width: 1500, height: 1000 } }); +// Skip the first-run model setup welcome; it covers the canvas. +await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), +); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/scripts/verify_selection_panels_browser.mjs b/scripts/verify_selection_panels_browser.mjs index 8427e472..1d621029 100644 --- a/scripts/verify_selection_panels_browser.mjs +++ b/scripts/verify_selection_panels_browser.mjs @@ -14,6 +14,10 @@ const browser = await chromium.launch({ args: ["--no-sandbox"], }); const page = await browser.newPage({ viewport: { width: 1600, height: 1100 } }); +// Skip the first-run model setup welcome; it covers the canvas. +await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), +); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/assistant_sessions.mjs b/tests/browser/assistant_sessions.mjs index 374e6e83..bfe84bce 100644 --- a/tests/browser/assistant_sessions.mjs +++ b/tests/browser/assistant_sessions.mjs @@ -34,6 +34,10 @@ try { const page = await browser.newPage({ viewport: { width: 1440, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/canvas_crop.mjs b/tests/browser/canvas_crop.mjs index 9e9fb2fe..94e501f4 100644 --- a/tests/browser/canvas_crop.mjs +++ b/tests/browser/canvas_crop.mjs @@ -43,6 +43,10 @@ const browser = await chromium.launch({ args: ["--no-sandbox"], }); const page = await browser.newPage({ viewport: { width: 1600, height: 1000 } }); +// Skip the first-run model setup welcome; it covers the canvas. +await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), +); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/canvas_keyboard.mjs b/tests/browser/canvas_keyboard.mjs index 834197a8..46fcbf87 100644 --- a/tests/browser/canvas_keyboard.mjs +++ b/tests/browser/canvas_keyboard.mjs @@ -21,6 +21,10 @@ assert.ok(created.ok); const browser = await chromium.launch({ executablePath: process.env.CHROMIUM_PATH }); try { const page = await browser.newPage({ viewport: { width: 1400, height: 900 } }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); await page.goto(`${base}/ai-tool/ai-canvas/${id}`); const nodes = page.locator(".react-flow__node"); const selected = page.locator(".react-flow__node.selected"); diff --git a/tests/browser/canvas_layers.mjs b/tests/browser/canvas_layers.mjs index a6d67588..bece5649 100644 --- a/tests/browser/canvas_layers.mjs +++ b/tests/browser/canvas_layers.mjs @@ -57,6 +57,10 @@ try { page = await browser.newPage({ viewport: { width: 1500, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); page.on("response", async (response) => { if (response.url().endsWith("/commands")) { diff --git a/tests/browser/canvas_notifications.mjs b/tests/browser/canvas_notifications.mjs index abc2c3c2..04c752aa 100644 --- a/tests/browser/canvas_notifications.mjs +++ b/tests/browser/canvas_notifications.mjs @@ -38,6 +38,10 @@ try { const page = await browser.newPage({ viewport: { width: 1500, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/canvas_selection_history.mjs b/tests/browser/canvas_selection_history.mjs index c5401197..ec32d7ad 100644 --- a/tests/browser/canvas_selection_history.mjs +++ b/tests/browser/canvas_selection_history.mjs @@ -14,6 +14,10 @@ try { const page = await browser.newPage({ viewport: { width: 1600, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); const headers = { "X-OpenDirector-Request": "1" }; const errors = []; diff --git a/tests/browser/canvas_wheel.mjs b/tests/browser/canvas_wheel.mjs index 5653e55f..8edec02b 100644 --- a/tests/browser/canvas_wheel.mjs +++ b/tests/browser/canvas_wheel.mjs @@ -39,6 +39,10 @@ try { const page = await browser.newPage({ viewport: { width: 1600, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/composer_duration.mjs b/tests/browser/composer_duration.mjs index 3a3926eb..00e5b08a 100644 --- a/tests/browser/composer_duration.mjs +++ b/tests/browser/composer_duration.mjs @@ -80,6 +80,10 @@ try { const page = await browser.newPage({ viewport: { width: 1600, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/composer_expansion.mjs b/tests/browser/composer_expansion.mjs index a6d77f1e..3c679b65 100644 --- a/tests/browser/composer_expansion.mjs +++ b/tests/browser/composer_expansion.mjs @@ -40,6 +40,10 @@ try { const page = await browser.newPage({ viewport: { width: 1600, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/context_menu_dismissal.mjs b/tests/browser/context_menu_dismissal.mjs index 83b81723..52362bf5 100644 --- a/tests/browser/context_menu_dismissal.mjs +++ b/tests/browser/context_menu_dismissal.mjs @@ -4,6 +4,10 @@ import { launchBrowser } from "./engine.mjs"; const base = process.env.CREATION_WEB_URL ?? "http://127.0.0.1:5179"; const browser = await launchBrowser(); const page = await browser.newPage({ viewport: { width: 1500, height: 1000 } }); +// Skip the first-run model setup welcome; it covers the canvas. +await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), +); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/created_node_focus.mjs b/tests/browser/created_node_focus.mjs index b9aa9760..b4ec6e51 100644 --- a/tests/browser/created_node_focus.mjs +++ b/tests/browser/created_node_focus.mjs @@ -12,6 +12,10 @@ async function call(path, body) { assert.equal((await call("/api/creation-test-health")).isolated, true); const browser = await launchBrowser(); const page = await browser.newPage({ viewport: { width: 1600, height: 1000 } }); +// Skip the first-run model setup welcome; it covers the canvas. +await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), +); page.setDefaultTimeout(15000); const projectId = crypto.randomUUID(); try { diff --git a/tests/browser/creation_history.mjs b/tests/browser/creation_history.mjs index c94696c9..66263e19 100644 --- a/tests/browser/creation_history.mjs +++ b/tests/browser/creation_history.mjs @@ -14,6 +14,10 @@ try { const page = await browser.newPage({ viewport: { width: 1500, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); const headers = { "X-OpenDirector-Request": "1" }; const errors = [], diff --git a/tests/browser/cross_canvas_paste.mjs b/tests/browser/cross_canvas_paste.mjs index 6ee02e3e..348bf3ef 100644 --- a/tests/browser/cross_canvas_paste.mjs +++ b/tests/browser/cross_canvas_paste.mjs @@ -34,6 +34,10 @@ const browser = await launchBrowser(); const errors = []; try { const page = await browser.newPage({ viewport: { width: 1500, height: 1000 } }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); page.on("pageerror", (error) => errors.push(error.message)); const saved = () => page.getByText("已保存到本机", { exact: true }).waitFor(); diff --git a/tests/browser/default_entry.mjs b/tests/browser/default_entry.mjs index cc6b5343..44b7238d 100644 --- a/tests/browser/default_entry.mjs +++ b/tests/browser/default_entry.mjs @@ -49,6 +49,10 @@ const browser = await chromium.launch({ args: ["--no-sandbox"], }); const page = await browser.newPage({ viewport: { width: 1600, height: 1000 } }); +// Skip the first-run model setup welcome; it covers the canvas. +await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), +); page.setDefaultTimeout(20000); const errors = [], legacy = []; diff --git a/tests/browser/generation_parameters.mjs b/tests/browser/generation_parameters.mjs index 3568a8c1..d78dd166 100644 --- a/tests/browser/generation_parameters.mjs +++ b/tests/browser/generation_parameters.mjs @@ -77,6 +77,10 @@ try { const page = await browser.newPage({ viewport: { width: 1600, height: 1100 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); page.on("pageerror", (e) => errors.push(e.message)); await page.goto(`${base}/ai-tool/ai-canvas/${id}`); diff --git a/tests/browser/jiuwenswarm_picker.mjs b/tests/browser/jiuwenswarm_picker.mjs index 026cc1de..3cc0c00a 100644 --- a/tests/browser/jiuwenswarm_picker.mjs +++ b/tests/browser/jiuwenswarm_picker.mjs @@ -14,6 +14,10 @@ try { const page = await browser.newPage({ viewport: { width: 1500, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(20000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/minimax_h3.mjs b/tests/browser/minimax_h3.mjs index b9dcf343..361a51da 100644 --- a/tests/browser/minimax_h3.mjs +++ b/tests/browser/minimax_h3.mjs @@ -19,6 +19,10 @@ async function call(path, body) { assert.equal((await call("/api/creation-test-health")).isolated, true); const browser = await launchBrowser(); const page = await browser.newPage({ viewport: { width: 1600, height: 1100 } }); +// Skip the first-run model setup welcome; it covers the canvas. +await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), +); page.setDefaultTimeout(15000); try { const model = await call("/api/model-configs", { diff --git a/tests/browser/multi_selection_references.mjs b/tests/browser/multi_selection_references.mjs index 73dbda09..955a6fc0 100644 --- a/tests/browser/multi_selection_references.mjs +++ b/tests/browser/multi_selection_references.mjs @@ -14,6 +14,10 @@ try { const page = await browser.newPage({ viewport: { width: 1800, height: 1100 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/paste_undo.mjs b/tests/browser/paste_undo.mjs index b681be43..1fcbc67c 100644 --- a/tests/browser/paste_undo.mjs +++ b/tests/browser/paste_undo.mjs @@ -19,6 +19,10 @@ assert.ok(response.ok); const browser = await chromium.launch({ executablePath: process.env.CHROMIUM_PATH }); try { const page = await browser.newPage({ viewport: { width: 1400, height: 900 } }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); await page.goto(`${base}/ai-tool/ai-canvas/${id}`); await page.getByText("已保存到本机", { exact: true }).waitFor(); const png = await page.evaluate(() => { diff --git a/tests/browser/project_list_overflow.mjs b/tests/browser/project_list_overflow.mjs index f44347a7..111cc38b 100644 --- a/tests/browser/project_list_overflow.mjs +++ b/tests/browser/project_list_overflow.mjs @@ -16,6 +16,10 @@ await call(`/api/creation/projects/${id}/commands`, { projectId: id, commandId: const browser = await launchBrowser(); try { const page = await browser.newPage({ viewport: { width: 420, height: 760 } }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); // Twenty legacy projects each add one warning line, as in a long-lived workspace. await page.route(/\/api\/creation\/projects(\?.*)?$/, async (route) => { diff --git a/tests/browser/reference_picker.mjs b/tests/browser/reference_picker.mjs index 692d55bc..91b7838b 100644 --- a/tests/browser/reference_picker.mjs +++ b/tests/browser/reference_picker.mjs @@ -123,6 +123,10 @@ try { const page = await browser.newPage({ viewport: { width: 1600, height: 1000 }, }); + // Skip the first-run model setup welcome; it covers the canvas. + await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), + ); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); diff --git a/tests/browser/structured_editors.mjs b/tests/browser/structured_editors.mjs index 6f875f1e..038d06cf 100644 --- a/tests/browser/structured_editors.mjs +++ b/tests/browser/structured_editors.mjs @@ -12,6 +12,10 @@ const browser = await chromium.launch({ args: ["--no-sandbox", "--enable-unsafe-swiftshader"], }); const page = await browser.newPage({ viewport: { width: 1700, height: 1100 } }); +// Skip the first-run model setup welcome; it covers the canvas. +await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), +); page.setDefaultTimeout(20000); const errors = []; page.on("pageerror", (e) => errors.push(e.message)); diff --git a/tests/browser/tool_drafts.mjs b/tests/browser/tool_drafts.mjs index 49c3f06e..15be600a 100644 --- a/tests/browser/tool_drafts.mjs +++ b/tests/browser/tool_drafts.mjs @@ -45,6 +45,10 @@ const browser = await chromium.launch({ args: ["--no-sandbox"], }); const page = await browser.newPage({ viewport: { width: 1600, height: 1100 } }); +// Skip the first-run model setup welcome; it covers the canvas. +await page.addInitScript(() => + localStorage.setItem("opendirector.modelSetup.v1", "dismissed"), +); page.setDefaultTimeout(15000); const errors = []; page.on("pageerror", (error) => errors.push(error.message));