From ddc2ce1615ecae6d00570acf989950aea48c6bd8 Mon Sep 17 00:00:00 2001 From: Jeremy Tuloup Date: Fri, 21 Aug 2026 11:36:21 +0200 Subject: [PATCH 1/2] Add more UI tests for Notebook-specific features --- ui-tests/test/editor.spec.ts | 44 ++++++ .../file-editor-chromium-linux.png | Bin 0 -> 26901 bytes .../file-editor-firefox-linux.png | Bin 0 -> 48779 bytes ui-tests/test/filebrowser.spec.ts | 70 +++++++++ ui-tests/test/help.spec.ts | 73 ++++++++++ ui-tests/test/notebook.spec.ts | 88 ++++++++++++ ui-tests/test/terminal.spec.ts | 133 ++++++++++++++++++ ui-tests/test/topbar.spec.ts | 115 +++++++++++++++ ui-tests/test/tree.spec.ts | 55 ++++++++ 9 files changed, 578 insertions(+) create mode 100644 ui-tests/test/editor.spec.ts-snapshots/file-editor-chromium-linux.png create mode 100644 ui-tests/test/editor.spec.ts-snapshots/file-editor-firefox-linux.png create mode 100644 ui-tests/test/help.spec.ts create mode 100644 ui-tests/test/terminal.spec.ts create mode 100644 ui-tests/test/topbar.spec.ts diff --git a/ui-tests/test/editor.spec.ts b/ui-tests/test/editor.spec.ts index f17271f60e3..871c587bff1 100644 --- a/ui-tests/test/editor.spec.ts +++ b/ui-tests/test/editor.spec.ts @@ -76,6 +76,50 @@ test.describe('Editor', () => { await expect(page.locator('.jp-Notebook')).toHaveCount(0); }); + test('Should take a screenshot of the file editor', async ({ + page, + tmpPath, + }) => { + const file = `${tmpPath}/${FILE}`; + await page.goto(`edit/${file}`); + + await expect(page.locator('.cm-editor')).toBeVisible(); + // wait for the file content to be rendered in the editor + await expect(page.locator('.cm-content')).toContainText('name: notebook'); + + // normalize the checkpoint indicator in the top bar since it may display + // dynamic strings such as "Last Checkpoint: 3 seconds ago" + await page + .locator('.jp-NotebookCheckpoint') + .evaluate((element) => (element.innerHTML = '')); + + // the editor might sometimes be focused after load, so blur it and hide + // the cursor layer to avoid capturing a blinking cursor in the screenshot + await page + .locator('.cm-content') + .evaluate((element) => (element as HTMLElement).blur()); + await page + .locator('.cm-cursorLayer') + .evaluate((element) => (element.style.display = 'none')); + + expect(await page.screenshot()).toMatchSnapshot('file-editor.png'); + }); + + test('Should not render the micro toolbar for files', async ({ + page, + tmpPath, + }) => { + const file = `${tmpPath}/${FILE}`; + await page.goto(`edit/${file}`); + + await expect(page.locator('.cm-editor')).toBeVisible(); + + // the micro toolbar is added to the DOM but should be hidden via CSS + const microToolbar = page.locator('.jp-MainAreaWidget > .jp-Toolbar-micro'); + await expect(microToolbar).toHaveCount(1); + await expect(microToolbar).toBeHidden(); + }); + test('Renaming the file via the menu entry', async ({ page, tmpPath }) => { const file = `${tmpPath}/${FILE}`; await page.goto(`edit/${file}`); diff --git a/ui-tests/test/editor.spec.ts-snapshots/file-editor-chromium-linux.png b/ui-tests/test/editor.spec.ts-snapshots/file-editor-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..bf71227e8389e7831ab6b62014fe79efbffcebff GIT binary patch literal 26901 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 literal 0 HcmV?d00001 diff --git a/ui-tests/test/editor.spec.ts-snapshots/file-editor-firefox-linux.png b/ui-tests/test/editor.spec.ts-snapshots/file-editor-firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9bad6047fbde4b1f2b9d5028212f7b68621383 GIT binary patch literal 48779 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 literal 0 HcmV?d00001 diff --git a/ui-tests/test/filebrowser.spec.ts b/ui-tests/test/filebrowser.spec.ts index 41cb88ea69e..fdfb7b5b2c8 100644 --- a/ui-tests/test/filebrowser.spec.ts +++ b/ui-tests/test/filebrowser.spec.ts @@ -103,6 +103,43 @@ test.describe('File Browser', () => { await notebook.close(); }); + test('Show the Upload button in the toolbar by default', async ({ page }) => { + const toolbar = page.locator('.jp-FileBrowser-toolbar'); + + await expect(toolbar.getByText('Upload')).toBeVisible(); + }); + + test('Filter the file browser listing with the file filter', async ({ + page, + }) => { + await page.filebrowser.refresh(); + + const toggleButton = page.locator( + 'jp-button[data-command="filebrowser:toggle-file-filter"]' + ); + const filterInput = page.locator('.jp-FileBrowser-filterBox input'); + const listing = page.locator('.jp-DirListing-item'); + + // the file filter input is hidden by default + await expect(filterInput).toBeHidden(); + await expect(listing).toHaveCount(3); + + // clicking the toggle button shows the filter input + await toggleButton.click(); + await expect(filterInput).toBeVisible(); + + // typing a query narrows down the listing + await filterInput.fill('folder1'); + await expect(listing).toHaveCount(1); + await expect(listing).toHaveText(/folder1/); + + // clicking the toggle button again hides the filter input and restores + // the full listing + await toggleButton.click(); + await expect(filterInput).toBeHidden(); + await expect(listing).toHaveCount(3); + }); + test('Toggle the Date Created column from the header context menu', async ({ page, }) => { @@ -138,3 +175,36 @@ test.describe('File Browser settings', () => { await expect(header.locator('.jp-id-created')).toBeVisible(); }); }); + +test.describe('File Browser toolbar settings', () => { + test.use({ + mockSettings: { + ...galata.DEFAULT_SETTINGS, + '@jupyter-notebook/tree-extension:widget': { + toolbar: [ + { + name: 'uploader', + disabled: true, + }, + ], + }, + }, + }); + + test('Should hide the Upload button when disabled in the settings', async ({ + page, + }) => { + const toolbar = page.locator('.jp-FileBrowser-toolbar'); + + // other toolbar items should still be visible + await expect(toolbar.getByText('New', { exact: true })).toBeVisible(); + await expect( + toolbar.locator('[data-jp-item-name="refresh"]') + ).toBeVisible(); + + // the Upload button should not be added to the toolbar + await expect(toolbar.locator('[data-jp-item-name="uploader"]')).toHaveCount( + 0 + ); + }); +}); diff --git a/ui-tests/test/help.spec.ts b/ui-tests/test/help.spec.ts new file mode 100644 index 00000000000..40b6bdf8ff3 --- /dev/null +++ b/ui-tests/test/help.spec.ts @@ -0,0 +1,73 @@ +// Copyright (c) Jupyter Development Team. +// Distributed under the terms of the Modified BSD License. + +import { expect } from '@jupyterlab/galata'; + +import { test } from './fixtures'; + +test.describe('Help menu', () => { + test('Should open the About dialog', async ({ page }) => { + await page.menu.clickMenuItem('Help>About Jupyter Notebook'); + + const dialog = page.locator('.jp-Dialog.jp-AboutNotebook'); + await expect(dialog).toBeVisible(); + + // The version reported in the dialog should be a valid version number + await expect(dialog.locator('.jp-AboutNotebook-version')).toHaveText( + /^Version: \d+\.\d+\.\d+/ + ); + + // The external links should open in a new tab + const githubLink = dialog.getByRole('link', { + name: 'JUPYTER NOTEBOOK ON GITHUB', + }); + await expect(githubLink).toHaveAttribute( + 'href', + 'https://github.com/jupyter/notebook' + ); + await expect(githubLink).toHaveAttribute('target', '_blank'); + + const contributorsLink = dialog.getByRole('link', { + name: 'CONTRIBUTOR LIST', + }); + await expect(contributorsLink).toHaveAttribute( + 'href', + 'https://github.com/jupyter/notebook/pulse' + ); + await expect(contributorsLink).toHaveAttribute('target', '_blank'); + + await expect( + dialog.locator('.jp-AboutNotebook-about-copyright') + ).toBeVisible(); + + // Dismiss the dialog + await dialog.getByRole('button', { name: 'Dismiss' }).click(); + await expect(dialog).toHaveCount(0); + }); + + test('Should open the Documentation in a new browser tab', async ({ + page, + }) => { + const documentationUrl = 'https://jupyter-notebook.readthedocs.io/'; + + // Stub the external website so the test does not depend on network access + await page.context().route(`${documentationUrl}**`, (route) => + route.fulfill({ + contentType: 'text/html', + body: 'Documentation', + }) + ); + + const [popup] = await Promise.all([ + page.waitForEvent('popup'), + page.menu.clickMenuItem('Help>Documentation'), + ]); + + // Only check the URL of the new tab, without waiting for the page to load + await popup.waitForURL(`${documentationUrl}en/stable/`, { + waitUntil: 'commit', + }); + expect(popup.url()).toEqual(`${documentationUrl}en/stable/`); + await popup.close(); + }); +}); diff --git a/ui-tests/test/notebook.spec.ts b/ui-tests/test/notebook.spec.ts index 803f1a06f93..4ce410f6ac4 100644 --- a/ui-tests/test/notebook.spec.ts +++ b/ui-tests/test/notebook.spec.ts @@ -156,6 +156,94 @@ test.describe('Notebook', () => { expect(await panel.screenshot()).toMatchSnapshot(imageName); }); + test('Edit Notebook Metadata should open the right panel with Advanced Tools expanded', async ({ + page, + tmpPath, + }) => { + const notebook = 'simple.ipynb'; + await page.contents.uploadFile( + path.resolve(__dirname, `./notebooks/${notebook}`), + `${tmpPath}/${notebook}` + ); + await page.goto(`notebooks/${tmpPath}/${notebook}`); + + await waitForKernelReady(page); + + await page.menu.clickMenuItem('Edit>Edit Notebook Metadata'); + + const panel = page.locator('#jp-right-stack'); + await expect(panel).toBeVisible(); + + const notebookTools = page.locator('#notebook-tools.jp-NotebookTools'); + await expect(notebookTools).toBeVisible(); + + // The Advanced Tools section should be expanded + const advancedTools = notebookTools.locator('.jp-Collapse', { + hasText: 'Advanced Tools', + }); + await expect(advancedTools.locator('.jp-Collapse-header')).not.toHaveClass( + /jp-Collapse-header-collapsed/ + ); + await expect(advancedTools.locator('.jp-Collapse-contents')).toBeVisible(); + }); + + test('Tab title should reflect the current document', async ({ + page, + tmpPath, + }) => { + const notebook = 'simple.ipynb'; + await page.contents.uploadFile( + path.resolve(__dirname, `./notebooks/${notebook}`), + `${tmpPath}/${notebook}` + ); + await page.goto(`notebooks/${tmpPath}/${notebook}`); + + // The tab title should be the notebook name with the ".ipynb" suffix stripped + await expect(page).toHaveTitle('simple'); + + // The tree page should have the default title + await page.goto(`tree/${tmpPath}`); + await expect(page).toHaveTitle('Home'); + }); + + test('Favicon should switch to busy while a cell is running', async ({ + page, + tmpPath, + }) => { + const notebook = 'empty.ipynb'; + await page.contents.uploadFile( + path.resolve(__dirname, `./notebooks/${notebook}`), + `${tmpPath}/${notebook}` + ); + await page.goto(`notebooks/${tmpPath}/${notebook}`); + + await waitForKernelReady(page); + + const favicon = page.locator('link[rel*="icon"]'); + + await page.click('.jp-Cell-inputArea'); + + // Enter code in the first cell + await page + .locator( + '.jp-Cell-inputArea >> .cm-editor >> .cm-content[contenteditable="true"]' + ) + .type('import time; time.sleep(3)'); + + // Run the cell + await runAndAdvance(page); + + // The favicon should switch to the busy icon while the kernel is busy + await expect(favicon).toHaveAttribute('href', /favicon-busy-1\.ico/, { + timeout: 15000, + }); + + // And back to the idle notebook icon when the execution is done + await expect(favicon).toHaveAttribute('href', /favicon-notebook\.ico/, { + timeout: 30000, + }); + }); + test('Clicking on "Close and Shut Down Notebook" should close the browser tab', async ({ page, tmpPath, diff --git a/ui-tests/test/terminal.spec.ts b/ui-tests/test/terminal.spec.ts new file mode 100644 index 00000000000..ecadd54d2b4 --- /dev/null +++ b/ui-tests/test/terminal.spec.ts @@ -0,0 +1,133 @@ +// Copyright (c) Jupyter Development Team. +// Distributed under the terms of the Modified BSD License. + +import { expect, IJupyterLabPageFixture } from '@jupyterlab/galata'; + +import { Page } from '@playwright/test'; + +import { test } from './fixtures'; + +/** + * Create a new terminal from the New dropdown of the file browser toolbar. + * + * The terminal session is created via the page so it is tracked by Galata + * and automatically disposed at the end of the test. + */ +const openTerminalFromNewDropdown = async ( + page: IJupyterLabPageFixture +): Promise<{ terminal: Page; name: string }> => { + const terminalPromise = page.waitForEvent('popup'); + await page.click('.jp-DropdownMenu >> text="New"'); + await page.click('.lm-Menu [data-command="terminal:create-new"]'); + const terminal = await terminalPromise; + await terminal.waitForLoadState(); + + // the terminal should open in a new tab on the /terminals/ page + await terminal.waitForURL(/\/terminals\/\w+/); + const name = new URL(terminal.url()).pathname.split('/').pop() ?? ''; + return { terminal, name }; +}; + +test.describe('Terminal', () => { + test('Create a terminal from the New dropdown', async ({ page }) => { + const { terminal } = await openTerminalFromNewDropdown(page); + + await expect(terminal.locator('.jp-Terminal')).toBeVisible(); + await expect(terminal.locator('.jp-Terminal .xterm-screen')).toBeVisible(); + + await terminal.close(); + }); + + test('Micro toolbars should not be visible on the terminal page', async ({ + page, + }) => { + const { terminal } = await openTerminalFromNewDropdown(page); + + await expect(terminal.locator('.jp-Terminal')).toBeVisible(); + + // the micro toolbar is added to the DOM but should be hidden via CSS + const microToolbar = terminal.locator( + '.jp-MainAreaWidget > .jp-Toolbar-micro' + ); + await expect(microToolbar).toHaveCount(1); + await expect(microToolbar).toBeHidden(); + + // there should not be any cell toolbar on the terminal page + await expect(terminal.locator('.jp-cell-toolbar')).toHaveCount(0); + + await terminal.close(); + }); + + test('Show and shut down a running terminal from the Running tab', async ({ + page, + }) => { + const { terminal, name } = await openTerminalFromNewDropdown(page); + + await expect(terminal.locator('.jp-Terminal')).toBeVisible(); + await terminal.close(); + + // open the Running tab on the tree page + await page.locator('.jp-TreePanel >> text="Running"').click(); + await expect( + page.locator('#main-panel #jp-running-sessions-tree') + ).toBeVisible(); + + const item = page.locator( + '#jp-running-sessions-tree .jp-RunningSessions-item', + { + hasText: `terminals/${name}`, + } + ); + await expect(item).toBeVisible(); + + // shut the terminal down from the running sessions list + await item.hover(); + await item.locator('.jp-RunningSessions-itemShutdown').click(); + + await expect(item).toHaveCount(0); + }); + + test('Execute a command in the terminal', async ({ page, request }) => { + const { terminal, name } = await openTerminalFromNewDropdown(page); + + await expect(terminal.locator('.jp-Terminal .xterm-screen')).toBeVisible(); + await terminal.locator('.jp-Terminal').click(); + + // the terminal output is not exposed in the DOM (xterm renders to a + // canvas), so exit the shell and check the terminal session gets + // terminated as a result. The shell may not be ready to process input + // right away, so retry typing the command until the session is gone. + await expect + .poll( + async () => { + await terminal.keyboard.type('exit'); + await terminal.keyboard.press('Enter'); + const response = await request.get('/api/terminals'); + const models = (await response.json()) as { name: string }[]; + return models.map((model) => model.name); + }, + { timeout: 30000 } + ) + .not.toContain(name); + + await terminal.close(); + }); + + test('Open a terminal directly from its URL', async ({ page, request }) => { + const { terminal, name } = await openTerminalFromNewDropdown(page); + + await expect(terminal.locator('.jp-Terminal')).toBeVisible(); + await terminal.close(); + + await page.goto(`terminals/${name}`); + + await expect(page.locator('.jp-Terminal')).toBeVisible(); + await expect(page.locator('.jp-Terminal .xterm-screen')).toBeVisible(); + + // the page should have connected to the existing terminal session + // instead of creating a new one + const response = await request.get('/api/terminals'); + const models = (await response.json()) as { name: string }[]; + expect(models.map((model) => model.name)).toEqual([name]); + }); +}); diff --git a/ui-tests/test/topbar.spec.ts b/ui-tests/test/topbar.spec.ts new file mode 100644 index 00000000000..5ff00deec44 --- /dev/null +++ b/ui-tests/test/topbar.spec.ts @@ -0,0 +1,115 @@ +// Copyright (c) Jupyter Development Team. +// Distributed under the terms of the Modified BSD License. + +import path from 'path'; + +import { expect } from '@jupyterlab/galata'; + +import { test } from './fixtures'; + +import { waitForKernelReady } from './utils'; + +test.use({ autoGoto: false }); + +test.describe('Top bar', () => { + test('Kernel logo should be displayed with the kernel name', async ({ + page, + tmpPath, + }) => { + const notebook = 'empty.ipynb'; + await page.contents.uploadFile( + path.resolve(__dirname, `./notebooks/${notebook}`), + `${tmpPath}/${notebook}` + ); + await page.goto(`notebooks/${tmpPath}/${notebook}`); + + await waitForKernelReady(page); + + const logo = page.locator('.jp-NotebookKernelLogo img'); + await expect(logo).toBeVisible(); + await expect(logo).toHaveAttribute('src', /kernelspecs/); + await expect(logo).toHaveAttribute('title', 'Python 3 (ipykernel)'); + }); + + test('Checkpoint indicator should be updated after saving the notebook', async ({ + page, + tmpPath, + }) => { + const notebook = 'empty.ipynb'; + await page.contents.uploadFile( + path.resolve(__dirname, `./notebooks/${notebook}`), + `${tmpPath}/${notebook}` + ); + await page.goto(`notebooks/${tmpPath}/${notebook}`); + + await waitForKernelReady(page); + + // a freshly uploaded notebook does not have a checkpoint yet, + // so the indicator should be empty + const checkpoint = page.locator('.jp-NotebookCheckpoint'); + await expect(checkpoint).toHaveText(''); + + // make an edit to the notebook + await page.click('.jp-Cell-inputArea'); + await page + .locator( + '.jp-Cell-inputArea >> .cm-editor >> .cm-content[contenteditable="true"]' + ) + .type('1 + 1'); + + // save the notebook, which also creates a checkpoint + await page.keyboard.press('Escape'); + await page.keyboard.press('ControlOrMeta+S'); + + // the indicator is refreshed shortly after the save + await expect(checkpoint).toContainText('Last Checkpoint:', { + timeout: 10000, + }); + }); + + test('A notebook with code cells should not be trusted by default', async ({ + page, + tmpPath, + }) => { + // empty.ipynb contains a code cell + const notebook = 'empty.ipynb'; + await page.contents.uploadFile( + path.resolve(__dirname, `./notebooks/${notebook}`), + `${tmpPath}/${notebook}` + ); + await page.goto(`notebooks/${tmpPath}/${notebook}`); + + await waitForKernelReady(page); + + const trustedButton = page.locator('button.jp-NotebookTrustedStatus'); + await expect(trustedButton).toHaveText('Not Trusted'); + + // clicking on the button should open a confirmation dialog to trust the notebook + await trustedButton.click(); + const dialog = page.locator('.jp-Dialog'); + await expect(dialog).toBeVisible(); + await expect(dialog).toContainText('Trust this notebook?'); + + // accepting the dialog should trust the notebook + await dialog.locator('.jp-Dialog-button.jp-mod-accept').click(); + await expect(trustedButton).toHaveText('Trusted'); + }); + + test('A notebook without code cells should be trusted', async ({ + page, + tmpPath, + }) => { + // simple.ipynb only contains a markdown cell + const notebook = 'simple.ipynb'; + await page.contents.uploadFile( + path.resolve(__dirname, `./notebooks/${notebook}`), + `${tmpPath}/${notebook}` + ); + await page.goto(`notebooks/${tmpPath}/${notebook}`); + + await waitForKernelReady(page); + + const trustedButton = page.locator('button.jp-NotebookTrustedStatus'); + await expect(trustedButton).toHaveText('Trusted'); + }); +}); diff --git a/ui-tests/test/tree.spec.ts b/ui-tests/test/tree.spec.ts index 74eba32df96..d9b65d04df3 100644 --- a/ui-tests/test/tree.spec.ts +++ b/ui-tests/test/tree.spec.ts @@ -64,3 +64,58 @@ test('Should activate file browser tab', async ({ page, tmpPath }) => { await page.menu.clickMenuItem('View>File Browser'); await expect(page.locator('#main-panel #filebrowser')).toBeVisible(); }); + +test.describe('Toolbar New dropdown', () => { + test('New > New Folder should create a new folder', async ({ + page, + tmpPath, + }) => { + await page.click('.jp-DropdownMenu >> text="New"'); + await page.click( + '.lm-Menu [data-command="filebrowser:create-new-directory"]' + ); + + // the new folder is created in inline-rename mode, commit the default name + await page.waitForSelector('.jp-DirListing-editor'); + await page.keyboard.press('Enter'); + + await expect( + page.locator('.jp-DirListing-item >> text="Untitled Folder"') + ).toBeVisible(); + expect( + await page.contents.directoryExists(`${tmpPath}/Untitled Folder`) + ).toBe(true); + }); + + test('New > New File should create a new file', async ({ page, tmpPath }) => { + await page.click('.jp-DropdownMenu >> text="New"'); + await page.click('.lm-Menu [data-command="filebrowser:create-new-file"]'); + + // the new file is created in inline-rename mode, commit the default name + await page.waitForSelector('.jp-DirListing-editor'); + await page.keyboard.press('Enter'); + + await expect( + page.locator('.jp-DirListing-item >> text="untitled.txt"') + ).toBeVisible(); + expect(await page.contents.fileExists(`${tmpPath}/untitled.txt`)).toBe( + true + ); + }); + + test('New > Console should open a new console', async ({ page }) => { + await page.click('.jp-DropdownMenu >> text="New"'); + await page.click('.lm-Menu [data-command="console:create"]'); + + // choose the default kernel in the kernel selection dialog + const [consolePage] = await Promise.all([ + page.waitForEvent('popup'), + page.click('.jp-Dialog >> text="Select"'), + ]); + await consolePage.waitForLoadState(); + + expect(new URL(consolePage.url()).pathname).toContain('/consoles/'); + await consolePage.waitForSelector('.jp-CodeConsole'); + await consolePage.close(); + }); +}); From ac04a33c99aaeb4513f1525d971bfed686bc8591 Mon Sep 17 00:00:00 2001 From: Jeremy Tuloup Date: Fri, 21 Aug 2026 11:54:22 +0200 Subject: [PATCH 2/2] Check the file editor partial view instead of taking a snapshot --- ui-tests/test/editor.spec.ts | 24 +++++------------- .../file-editor-chromium-linux.png | Bin 26901 -> 0 bytes .../file-editor-firefox-linux.png | Bin 48779 -> 0 bytes 3 files changed, 7 insertions(+), 17 deletions(-) delete mode 100644 ui-tests/test/editor.spec.ts-snapshots/file-editor-chromium-linux.png delete mode 100644 ui-tests/test/editor.spec.ts-snapshots/file-editor-firefox-linux.png diff --git a/ui-tests/test/editor.spec.ts b/ui-tests/test/editor.spec.ts index 871c587bff1..bf3d216d278 100644 --- a/ui-tests/test/editor.spec.ts +++ b/ui-tests/test/editor.spec.ts @@ -76,7 +76,7 @@ test.describe('Editor', () => { await expect(page.locator('.jp-Notebook')).toHaveCount(0); }); - test('Should take a screenshot of the file editor', async ({ + test('Should display a partial view with white space at the bottom', async ({ page, tmpPath, }) => { @@ -87,22 +87,12 @@ test.describe('Editor', () => { // wait for the file content to be rendered in the editor await expect(page.locator('.cm-content')).toContainText('name: notebook'); - // normalize the checkpoint indicator in the top bar since it may display - // dynamic strings such as "Last Checkpoint: 3 seconds ago" - await page - .locator('.jp-NotebookCheckpoint') - .evaluate((element) => (element.innerHTML = '')); - - // the editor might sometimes be focused after load, so blur it and hide - // the cursor layer to avoid capturing a blinking cursor in the screenshot - await page - .locator('.cm-content') - .evaluate((element) => (element as HTMLElement).blur()); - await page - .locator('.cm-cursorLayer') - .evaluate((element) => (element.style.display = 'none')); - - expect(await page.screenshot()).toMatchSnapshot('file-editor.png'); + // the edit page should display a partial view, with white space below + // the main panel + const spacer = page.locator('#spacer-widget-bottom'); + await expect(spacer).toBeVisible(); + const spacerBox = await spacer.boundingBox(); + expect(spacerBox?.height).toBeGreaterThanOrEqual(16); }); test('Should not render the micro toolbar for files', async ({ diff --git a/ui-tests/test/editor.spec.ts-snapshots/file-editor-chromium-linux.png b/ui-tests/test/editor.spec.ts-snapshots/file-editor-chromium-linux.png deleted file mode 100644 index bf71227e8389e7831ab6b62014fe79efbffcebff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26901 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 diff --git a/ui-tests/test/editor.spec.ts-snapshots/file-editor-firefox-linux.png b/ui-tests/test/editor.spec.ts-snapshots/file-editor-firefox-linux.png deleted file mode 100644 index 9e9bad6047fbde4b1f2b9d5028212f7b68621383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48779 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