Skip to content

feat(response-example): support previewing pdf images and videos for 'save responses' #3513

feat(response-example): support previewing pdf images and videos for 'save responses'

feat(response-example): support previewing pdf images and videos for 'save responses' #3513

Triggered via pull request August 20, 2026 12:11
Status Failure
Total duration 37m 53s
Artifacts 7

tests-linux.yml

on: pull_request
Matrix: e2e-test
Unit Tests (Linux)
7m 23s
Unit Tests (Linux)
CLI Tests (Linux)
3m 24s
CLI Tests (Linux)
SSL Tests (Linux)
16m 4s
SSL Tests (Linux)
OAuth 1.0 Auth Tests (Linux)
14m 45s
OAuth 1.0 Auth Tests (Linux)
Merge Playwright Reports (Linux)
1m 8s
Merge Playwright Reports (Linux)
Fit to window
Zoom out
Zoom in

Annotations

26 errors, 9 warnings, and 6 notices
[default] › tests/preferences/system-proxy-timestamp.spec.ts:34:7 › System Proxy - last refreshed timestamp › updates the timestamp on a subsequent Refresh: tests/preferences/system-proxy-timestamp.spec.ts#L73
1) [default] › tests/preferences/system-proxy-timestamp.spec.ts:34:7 › System Proxy - last refreshed timestamp › updates the timestamp on a subsequent Refresh Error: expect(received).toBeGreaterThan(expected) Expected: > 1000 Received: 399 71 | 72 | // the two refreshes should be more than 1 second apart > 73 | expect(secondRefreshedAt - firstRefreshedAt).toBeGreaterThan(1000); | ^ 74 | }); 75 | }); 76 | at /home/runner/work/usebruno-bruno/bruno/bruno/tests/preferences/system-proxy-timestamp.spec.ts:73:50
[default] › tests/richtext-editor/shortcut-passthrough.spec.ts:105:7 › Rich Text Editor - Keyboard Shortcut with Global Hotkeys (remapped) › a shortcut Tiptap does bind only runs the editor action: tests/richtext-editor/shortcut-passthrough.spec.ts#L126
3) [default] › tests/richtext-editor/shortcut-passthrough.spec.ts:105:7 › Rich Text Editor - Keyboard Shortcut with Global Hotkeys (remapped) › a shortcut Tiptap does bind only runs the editor action, not a colliding global shortcut › Cmd/Ctrl+B only bolds the selection. it does not open Preferences Error: expect(locator).toHaveText(expected) failed Locator: locator('.ProseMirror').locator('strong') Expected: "World" Timeout: 5000ms Error: element(s) not found Call log: - Expect "toHaveText" with timeout 5000ms - waiting for locator('.ProseMirror').locator('strong') 124 | await test.step('Cmd/Ctrl+B only bolds the selection. it does not open Preferences', async () => { 125 | await pressShortcut(page, modifier, 'KeyB'); > 126 | await expect(prosemirror.locator('strong')).toHaveText('World'); | ^ 127 | await expect(locators.tabs.requestTab('Preferences')).not.toBeVisible(); 128 | }); 129 | }); at /home/runner/work/usebruno-bruno/bruno/bruno/tests/richtext-editor/shortcut-passthrough.spec.ts:126:51 at /home/runner/work/usebruno-bruno/bruno/bruno/tests/richtext-editor/shortcut-passthrough.spec.ts:124:5
[default] › tests/richtext-editor/links.spec.ts:154:7 › Rich Text Editor Edge Cases - Links › Link popovers - scroll tracking: tests/richtext-editor/links.spec.ts#L260
2) [default] › tests/richtext-editor/links.spec.ts:154:7 › Rich Text Editor Edge Cases - Links › Link popovers - scroll tracking, hiding, and flipping › Flipping (bottom of viewport) Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toHaveAttribute(expected) failed Locator: locator('[data-editor-link-popover="true"]') Expected pattern: /^top/ Received string: "bottom" Timeout: 5000ms Call log: - Expect "toHaveAttribute" with timeout 5000ms - waiting for locator('[data-editor-link-popover="true"]') 14 × locator resolved to <div data-popper-placement="bottom" data-editor-link-popover="true" class="StyledWrapper-eoHZkQ bykcxl">…</div> - unexpected value "bottom" 258 | // the popover should flip and appear ABOVE the link. 259 | // Popper handles this automatically. We can verify if data-popper-placement starts with 'top'. > 260 | await expect(editPopover).toHaveAttribute('data-popper-placement', /^top/); | ^ 261 | }); 262 | }); 263 | at /home/runner/work/usebruno-bruno/bruno/bruno/tests/richtext-editor/links.spec.ts:260:33 at /home/runner/work/usebruno-bruno/bruno/bruno/tests/richtext-editor/links.spec.ts:232:5
[default] › tests/richtext-editor/links.spec.ts:154:7 › Rich Text Editor Edge Cases - Links › Link popovers - scroll tracking: tests/richtext-editor/links.spec.ts#L260
2) [default] › tests/richtext-editor/links.spec.ts:154:7 › Rich Text Editor Edge Cases - Links › Link popovers - scroll tracking, hiding, and flipping › Flipping (bottom of viewport) Error: expect(locator).toHaveAttribute(expected) failed Locator: locator('[data-editor-link-popover="true"]') Expected pattern: /^top/ Received string: "bottom" Timeout: 5000ms Call log: - Expect "toHaveAttribute" with timeout 5000ms - waiting for locator('[data-editor-link-popover="true"]') 14 × locator resolved to <div data-popper-placement="bottom" data-editor-link-popover="true" class="StyledWrapper-eoHZkQ bykcxl">…</div> - unexpected value "bottom" 258 | // the popover should flip and appear ABOVE the link. 259 | // Popper handles this automatically. We can verify if data-popper-placement starts with 'top'. > 260 | await expect(editPopover).toHaveAttribute('data-popper-placement', /^top/); | ^ 261 | }); 262 | }); 263 | at /home/runner/work/usebruno-bruno/bruno/bruno/tests/richtext-editor/links.spec.ts:260:33 at /home/runner/work/usebruno-bruno/bruno/bruno/tests/richtext-editor/links.spec.ts:232:5
[default] › tests/request/multipart-form/multipart-form-file-chips.spec.ts:155:7 › Multipart Form - Multiple File Upload › each file can be removed individually: tests/request/multipart-form/multipart-form-file-chips.spec.ts#L134
1) [default] › tests/request/multipart-form/multipart-form-file-chips.spec.ts:155:7 › Multipart Form - Multiple File Upload › each file can be removed individually TimeoutError: locator.click: Timeout 30000ms exceeded. Call log: - waiting for getByTestId('multipart-file-more') 132 | const more = page.getByTestId('multipart-file-more'); 133 | const trigger = (await summary.count()) > 0 ? summary : more; > 134 | await trigger.click(); | ^ 135 | 136 | const row = page.getByTestId('multipart-file-overflow-row').filter({ hasText: fileName }); 137 | await expect(row).toBeVisible(); at removeFileByName (/home/runner/work/usebruno-bruno/bruno/bruno/tests/request/multipart-form/multipart-form-file-chips.spec.ts:134:19) at /home/runner/work/usebruno-bruno/bruno/bruno/tests/request/multipart-form/multipart-form-file-chips.spec.ts:158:5
[default] › tests/request/multipart-form/multipart-form-file-chips.spec.ts:155:7 › Multipart Form - Multiple File Upload › each file can be removed individually: tests/request/multipart-form/multipart-form-file-chips.spec.ts#L0
1) [default] › tests/request/multipart-form/multipart-form-file-chips.spec.ts:155:7 › Multipart Form - Multiple File Upload › each file can be removed individually Test timeout of 30000ms exceeded.
[default] › tests/environments/collection-default-environment/collection-default-environment.spec.ts:47:7 › Collection Default Environment › resolves request variables from the default environment (verified in Timeline): tests/utils/page/actions.ts#L110
6) [default] › tests/environments/collection-default-environment/collection-default-environment.spec.ts:47:7 › Collection Default Environment › resolves request variables from the default environment (verified in Timeline) › Open collection and confirm default applied › Open collection "collection-default-environment" Error: locator.click: Target page, context or browser has been closed Call log: - waiting for locator('#sidebar-collection-name').filter({ hasText: 'collection-default-environment' }) at tests/utils/page/actions.ts:110 108 | const openCollection = async (page: Page, collectionName: string) => { 109 | await test.step(`Open collection "${collectionName}"`, async () => { > 110 | await page.locator('#sidebar-collection-name').filter({ hasText: collectionName }).click(); | ^ 111 | }); 112 | }; 113 | at /home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:110:88 at openCollection (/home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:109:3) at /home/runner/work/usebruno-bruno/bruno/bruno/tests/environments/collection-default-environment/collection-default-environment.spec.ts:53:7 at /home/runner/work/usebruno-bruno/bruno/bruno/tests/environments/collection-default-environment/collection-default-environment.spec.ts:52:5
[default] › tests/environments/collection-default-environment/collection-default-environment.spec.ts:47:7 › Collection Default Environment › resolves request variables from the default environment (verified in Timeline): tests/environments/collection-default-environment/collection-default-environment.spec.ts#L0
6) [default] › tests/environments/collection-default-environment/collection-default-environment.spec.ts:47:7 › Collection Default Environment › resolves request variables from the default environment (verified in Timeline) › Open collection and confirm default applied › Open collection "collection-default-environment" Test timeout of 30000ms exceeded.
[default] › tests/cookies/corrupted-passkey.spec.ts:6:5 › should handle corrupted passkey and still display saved cookie list: tests/cookies/corrupted-passkey.spec.ts#L45
5) [default] › tests/cookies/corrupted-passkey.spec.ts:6:5 › should handle corrupted passkey and still display saved cookie list Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByText('example.com') Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByText('example.com') 43 | 44 | // The domain row should still be visible (even if cookie values are blank). > 45 | await expect(page2.getByText('example.com')).toBeVisible(); | ^ 46 | 47 | await closeElectronApp(app2); 48 | }); at /home/runner/work/usebruno-bruno/bruno/bruno/tests/cookies/corrupted-passkey.spec.ts:45:48
[default] › tests/cookies/corrupted-passkey.spec.ts:6:5 › should handle corrupted passkey and still display saved cookie list: tests/cookies/corrupted-passkey.spec.ts#L45
5) [default] › tests/cookies/corrupted-passkey.spec.ts:6:5 › should handle corrupted passkey and still display saved cookie list Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByText('example.com') Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByText('example.com') 43 | 44 | // The domain row should still be visible (even if cookie values are blank). > 45 | await expect(page2.getByText('example.com')).toBeVisible(); | ^ 46 | 47 | await closeElectronApp(app2); 48 | }); at /home/runner/work/usebruno-bruno/bruno/bruno/tests/cookies/corrupted-passkey.spec.ts:45:48
[default] › tests/cookies/corrupted-passkey.spec.ts:6:5 › should handle corrupted passkey and still display saved cookie list: tests/cookies/corrupted-passkey.spec.ts#L45
5) [default] › tests/cookies/corrupted-passkey.spec.ts:6:5 › should handle corrupted passkey and still display saved cookie list Error: expect(locator).toBeVisible() failed Locator: getByText('example.com') Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByText('example.com') 43 | 44 | // The domain row should still be visible (even if cookie values are blank). > 45 | await expect(page2.getByText('example.com')).toBeVisible(); | ^ 46 | 47 | await closeElectronApp(app2); 48 | }); at /home/runner/work/usebruno-bruno/bruno/bruno/tests/cookies/corrupted-passkey.spec.ts:45:48
[default] › tests/collection/migrate-to-yml-drafts/transient-blocks-save-all.spec.ts:25:7 › Migrate to YML — a transient request blocks Save All until it is saved › save the transient via its per-item Save button: tests/collection/migrate-to-yml-drafts/transient-blocks-save-all.spec.ts#L71
4) [default] › tests/collection/migrate-to-yml-drafts/transient-blocks-save-all.spec.ts:25:7 › Migrate to YML — a transient request blocks Save All until it is saved › save the transient via its per-item Save button, then Save All completes migration › Save All completes migration Error: expect(locator).toBeVisible() failed Locator: getByText('Collection migrated to YML format successfully') Expected: visible Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 30000ms - waiting for getByText('Collection migrated to YML format successfully') - Target page, context or browser has been closed 69 | await test.step('Save All completes migration', async () => { 70 | await saveAllDraftsAndMigrate(page); > 71 | await expect(page.getByText('Collection migrated to YML format successfully')).toBeVisible({ timeout: 30000 }); | ^ 72 | }); 73 | 74 | await test.step('The saved request survives as a .yml on disk', async () => { at /home/runner/work/usebruno-bruno/bruno/bruno/tests/collection/migrate-to-yml-drafts/transient-blocks-save-all.spec.ts:71:86 at /home/runner/work/usebruno-bruno/bruno/bruno/tests/collection/migrate-to-yml-drafts/transient-blocks-save-all.spec.ts:69:5
[default] › tests/collection/migrate-to-yml-drafts/transient-blocks-save-all.spec.ts:25:7 › Migrate to YML — a transient request blocks Save All until it is saved › save the transient via its per-item Save button: tests/collection/migrate-to-yml-drafts/transient-blocks-save-all.spec.ts#L0
4) [default] › tests/collection/migrate-to-yml-drafts/transient-blocks-save-all.spec.ts:25:7 › Migrate to YML — a transient request blocks Save All until it is saved › save the transient via its per-item Save button, then Save All completes migration › Save All completes migration Test timeout of 30000ms exceeded.
[default] › tests/apps/collection-apps.spec.ts:201:7 › Collection apps › bru.ctx.collection exposes the active collection: tests/utils/page/actions.ts#L1801
3) [default] › tests/apps/collection-apps.spec.ts:201:7 › Collection apps › bru.ctx.collection exposes the active collection › Save request Error: expect(locator).toBeVisible() failed Locator: getByText('Request saved successfully').last() Expected: visible Timeout: 3000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 3000ms - waiting for getByText('Request saved successfully').last() at tests/utils/page/actions.ts:1801 1799 | const saveShortcut = process.platform === 'darwin' ? 'Meta+s' : 'Control+s'; 1800 | await page.keyboard.press(saveShortcut); > 1801 | await expect(page.getByText('Request saved successfully').last()).toBeVisible({ timeout: 3000 }); | ^ 1802 | await page.waitForTimeout(200); 1803 | }); 1804 | }; at /home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1801:71 at saveRequest (/home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1798:3) at /home/runner/work/usebruno-bruno/bruno/bruno/tests/apps/collection-apps.spec.ts:207:5
[default] › tests/apps/apps-ctx-api.spec.ts:180:7 › Apps - ctx API › bru.ctx.variables.runtime.set persists for subsequent sends: tests/apps/apps-ctx-api.spec.ts#L198
2) [default] › tests/apps/apps-ctx-api.spec.ts:180:7 › Apps - ctx API › bru.ctx.variables.runtime.set persists for subsequent sends Error: expect(received).toBe(expected) // Object.is equality Expected: "viaSet" Received: undefined Call Log: - Timeout 15000ms exceeded while waiting on the predicate 196 | await expect 197 | .poll(() => guestEval(electronApp, `window.bru && window.bru.ctx.variables.resolved && window.bru.ctx.variables.resolved.q`), { timeout: 15000 }) > 198 | .toBe('viaSet'); | ^ 199 | await guestEval(electronApp, 'void window.__send()'); 200 | await expect.poll(() => guestResult(electronApp), { timeout: 15000 }).toBe('viaSet'); 201 | }); at /home/runner/work/usebruno-bruno/bruno/bruno/tests/apps/apps-ctx-api.spec.ts:198:8
[default] › tests/apps/apps-ctx-api.spec.ts:157:7 › Apps - ctx API › bru.ctx.submitRequest sends the request and resolves with the response: tests/apps/apps-ctx-api.spec.ts#L171
1) [default] › tests/apps/apps-ctx-api.spec.ts:157:7 › Apps - ctx API › bru.ctx.submitRequest sends the request and resolves with the response › runtimeVariables override the request body Error: expect(received).toBe(expected) // Object.is equality Expected: "reflectme" Received: "pending" Call Log: - Timeout 15000ms exceeded while waiting on the predicate 169 | await test.step('runtimeVariables override the request body', async () => { 170 | await guestEval(electronApp, `void window.__send({ runtimeVariables: { q: 'reflectme' } })`); > 171 | await expect.poll(() => guestResult(electronApp), { timeout: 15000 }).toBe('reflectme'); | ^ 172 | }); 173 | 174 | await test.step('a subsequent runtimeVariables override is honoured', async () => { at /home/runner/work/usebruno-bruno/bruno/bruno/tests/apps/apps-ctx-api.spec.ts:171:77 at /home/runner/work/usebruno-bruno/bruno/bruno/tests/apps/apps-ctx-api.spec.ts:169:5
[default] › tests/websockets/multi-message-bru/message-name-style.spec.ts:20:7 › websocket message name styling › long message name truncates instead of overflowing: tests/utils/page/actions.ts#L1122
5) [default] › tests/websockets/multi-message-bru/message-name-style.spec.ts:20:7 › websocket message name styling › long message name truncates instead of overflowing › Navigate to collection "ws-multi-message" and open request "ws-single-msg" TimeoutError: locator.click: Timeout 30000ms exceeded. Call log: - waiting for getByTestId('sidebar-collection-row').filter({ hasText: 'ws-multi-message' }) at tests/utils/page/actions.ts:1122 1120 | await test.step(`Navigate to collection "${collectionName}" and open request "${requestName}"`, async () => { 1121 | const collectionContainer = page.getByTestId('sidebar-collection-row').filter({ hasText: collectionName }); > 1122 | await collectionContainer.click(); | ^ 1123 | const collectionWrapper = collectionContainer.locator('..'); 1124 | const request = collectionWrapper.getByTestId('sidebar-collection-item-row').filter({ hasText: requestName }); 1125 | if (!persist) { at /home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1122:31 at openRequest (/home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1120:3) at /home/runner/work/usebruno-bruno/bruno/bruno/tests/websockets/multi-message-bru/message-name-style.spec.ts:22:5
[default] › tests/websockets/multi-message-bru/message-name-style.spec.ts:20:7 › websocket message name styling › long message name truncates instead of overflowing: tests/websockets/multi-message-bru/message-name-style.spec.ts#L0
5) [default] › tests/websockets/multi-message-bru/message-name-style.spec.ts:20:7 › websocket message name styling › long message name truncates instead of overflowing › Navigate to collection "ws-multi-message" and open request "ws-single-msg" Test timeout of 30000ms exceeded.
[default] › tests/websockets/message-scroll.spec.ts:84:7 › websocket message list scroll on tab switch › restores both list and editor scroll at the bottom after switching tabs: tests/utils/page/actions.ts#L1122
4) [default] › tests/websockets/message-scroll.spec.ts:84:7 › websocket message list scroll on tab switch › restores both list and editor scroll at the bottom after switching tabs › Navigate to collection "collection" and open request "ws-two-long-msgs" Error: locator.click: Target page, context or browser has been closed Call log: - waiting for getByTestId('sidebar-collection-row').filter({ hasText: 'collection' }) at tests/utils/page/actions.ts:1122 1120 | await test.step(`Navigate to collection "${collectionName}" and open request "${requestName}"`, async () => { 1121 | const collectionContainer = page.getByTestId('sidebar-collection-row').filter({ hasText: collectionName }); > 1122 | await collectionContainer.click(); | ^ 1123 | const collectionWrapper = collectionContainer.locator('..'); 1124 | const request = collectionWrapper.getByTestId('sidebar-collection-item-row').filter({ hasText: requestName }); 1125 | if (!persist) { at /home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1122:31 at openRequest (/home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1120:3) at /home/runner/work/usebruno-bruno/bruno/bruno/tests/websockets/message-scroll.spec.ts:86:5
[default] › tests/websockets/message-scroll.spec.ts:84:7 › websocket message list scroll on tab switch › restores both list and editor scroll at the bottom after switching tabs: tests/websockets/message-scroll.spec.ts#L0
4) [default] › tests/websockets/message-scroll.spec.ts:84:7 › websocket message list scroll on tab switch › restores both list and editor scroll at the bottom after switching tabs › Navigate to collection "collection" and open request "ws-two-long-msgs" Test timeout of 30000ms exceeded.
[default] › tests/websockets/message-editor-scroll.spec.ts:112:7 › websocket message editor scroll behaviour › clicking a reopened message body does not move the scroll position: tests/utils/page/actions.ts#L1122
3) [default] › tests/websockets/message-editor-scroll.spec.ts:112:7 › websocket message editor scroll behaviour › clicking a reopened message body does not move the scroll position › Navigate to collection "collection" and open request "ws-two-long-msgs" Error: locator.click: Target page, context or browser has been closed Call log: - waiting for getByTestId('sidebar-collection-row').filter({ hasText: 'collection' }) at tests/utils/page/actions.ts:1122 1120 | await test.step(`Navigate to collection "${collectionName}" and open request "${requestName}"`, async () => { 1121 | const collectionContainer = page.getByTestId('sidebar-collection-row').filter({ hasText: collectionName }); > 1122 | await collectionContainer.click(); | ^ 1123 | const collectionWrapper = collectionContainer.locator('..'); 1124 | const request = collectionWrapper.getByTestId('sidebar-collection-item-row').filter({ hasText: requestName }); 1125 | if (!persist) { at /home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1122:31 at openRequest (/home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1120:3) at /home/runner/work/usebruno-bruno/bruno/bruno/tests/websockets/message-editor-scroll.spec.ts:117:5
[default] › tests/websockets/message-editor-scroll.spec.ts:112:7 › websocket message editor scroll behaviour › clicking a reopened message body does not move the scroll position: tests/websockets/message-editor-scroll.spec.ts#L0
3) [default] › tests/websockets/message-editor-scroll.spec.ts:112:7 › websocket message editor scroll behaviour › clicking a reopened message body does not move the scroll position › Navigate to collection "collection" and open request "ws-two-long-msgs" Test timeout of 30000ms exceeded.
[default] › tests/websockets/message-editor-scroll.spec.ts:81:7 › websocket message editor scroll behaviour › selecting another message does not reset the deselected editor scroll to top: tests/utils/page/actions.ts#L1122
2) [default] › tests/websockets/message-editor-scroll.spec.ts:81:7 › websocket message editor scroll behaviour › selecting another message does not reset the deselected editor scroll to top › Navigate to collection "collection" and open request "ws-two-long-msgs" Error: locator.click: Target page, context or browser has been closed Call log: - waiting for getByTestId('sidebar-collection-row').filter({ hasText: 'collection' }) at tests/utils/page/actions.ts:1122 1120 | await test.step(`Navigate to collection "${collectionName}" and open request "${requestName}"`, async () => { 1121 | const collectionContainer = page.getByTestId('sidebar-collection-row').filter({ hasText: collectionName }); > 1122 | await collectionContainer.click(); | ^ 1123 | const collectionWrapper = collectionContainer.locator('..'); 1124 | const request = collectionWrapper.getByTestId('sidebar-collection-item-row').filter({ hasText: requestName }); 1125 | if (!persist) { at /home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1122:31 at openRequest (/home/runner/work/usebruno-bruno/bruno/bruno/tests/utils/page/actions.ts:1120:3) at /home/runner/work/usebruno-bruno/bruno/bruno/tests/websockets/message-editor-scroll.spec.ts:87:5
[default] › tests/websockets/message-editor-scroll.spec.ts:81:7 › websocket message editor scroll behaviour › selecting another message does not reset the deselected editor scroll to top: tests/websockets/message-editor-scroll.spec.ts#L0
2) [default] › tests/websockets/message-editor-scroll.spec.ts:81:7 › websocket message editor scroll behaviour › selecting another message does not reset the deselected editor scroll to top › Navigate to collection "collection" and open request "ws-two-long-msgs" Test timeout of 30000ms exceeded.
[default] › tests/variables-tab/variables-tab.spec.ts:453:7 › Variables tab › restores the scroll position after leaving and reopening the tab: tests/variables-tab/variables-tab.spec.ts#L473
1) [default] › tests/variables-tab/variables-tab.spec.ts:453:7 › Variables tab › restores the scroll position after leaving and reopening the tab Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(received).toBe(expected) // Object.is equality Expected: 300 Received: 0 Call Log: - Timeout 5000ms exceeded while waiting on the predicate 471 | await reopenVariablesTab(page, 'seed'); 472 | > 473 | await expect.poll(() => getVariablesScrollTop(page)).toBe(SCROLL_TOP); | ^ 474 | }); 475 | 476 | test('restores a long object value\'s own scroll position inside its cell', async ({ pageWithUserData: page }) => { at /home/runner/work/usebruno-bruno/bruno/bruno/tests/variables-tab/variables-tab.spec.ts:473:58
[default] › tests/variables-tab/variables-tab.spec.ts:453:7 › Variables tab › restores the scroll position after leaving and reopening the tab: tests/variables-tab/variables-tab.spec.ts#L473
1) [default] › tests/variables-tab/variables-tab.spec.ts:453:7 › Variables tab › restores the scroll position after leaving and reopening the tab Error: expect(received).toBe(expected) // Object.is equality Expected: 300 Received: 0 Call Log: - Timeout 5000ms exceeded while waiting on the predicate 471 | await reopenVariablesTab(page, 'seed'); 472 | > 473 | await expect.poll(() => getVariablesScrollTop(page)).toBe(SCROLL_TOP); | ^ 474 | }); 475 | 476 | test('restores a long object value\'s own scroll position inside its cell', async ({ pageWithUserData: page }) => { at /home/runner/work/usebruno-bruno/bruno/bruno/tests/variables-tab/variables-tab.spec.ts:473:58
CLI Tests (Linux)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Unit Tests (Linux)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
OAuth 1.0 Auth Tests (Linux)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-node@v4, actions/upload-artifact@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
SSL Tests (Linux)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-node@v4, actions/upload-artifact@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Playwright E2E Tests (Linux) 2/4
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Playwright E2E Tests (Linux) 3/4
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Playwright E2E Tests (Linux) 1/4
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Playwright E2E Tests (Linux) 4/4
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Merge Playwright Reports (Linux)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/download-artifact@v6, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
🎭 Playwright Run Summary
34 passed (4.5m)
🎭 Playwright Run Summary
57 passed (5.3m)
🎭 Playwright Run Summary
1 flaky [default] › tests/preferences/system-proxy-timestamp.spec.ts:34:7 › System Proxy - last refreshed timestamp › updates the timestamp on a subsequent Refresh 2 skipped 310 passed (14.7m)
🎭 Playwright Run Summary
3 flaky [default] › tests/request/multipart-form/multipart-form-file-chips.spec.ts:155:7 › Multipart Form - Multiple File Upload › each file can be removed individually [default] › tests/richtext-editor/links.spec.ts:154:7 › Rich Text Editor Edge Cases - Links › Link popovers - scroll tracking, hiding, and flipping [default] › tests/richtext-editor/shortcut-passthrough.spec.ts:105:7 › Rich Text Editor - Keyboard Shortcut with Global Hotkeys (remapped) › a shortcut Tiptap does bind only runs the editor action, not a colliding global shortcut 2 skipped 308 passed (21.0m)
🎭 Playwright Run Summary
1 failed [default] › tests/cookies/corrupted-passkey.spec.ts:6:5 › should handle corrupted passkey and still display saved cookie list 8 flaky [default] › tests/apps/apps-ctx-api.spec.ts:157:7 › Apps - ctx API › bru.ctx.submitRequest sends the request and resolves with the response [default] › tests/apps/apps-ctx-api.spec.ts:180:7 › Apps - ctx API › bru.ctx.variables.runtime.set persists for subsequent sends [default] › tests/apps/collection-apps.spec.ts:201:7 › Collection apps › bru.ctx.collection exposes the active collection [default] › tests/collection/migrate-to-yml-drafts/transient-blocks-save-all.spec.ts:25:7 › Migrate to YML — a transient request blocks Save All until it is saved › save the transient via its per-item Save button, then Save All completes migration [default] › tests/environments/collection-default-environment/collection-default-environment.spec.ts:47:7 › Collection Default Environment › resolves request variables from the default environment (verified in Timeline) [default] › tests/environments/create-environment/global-env-create.spec.ts:23:7 › Global Environment Create Tests › should import collection and create global environment for request usage [default] › tests/environments/environment-tabs/environment-tabs.spec.ts:184:7 › Environment Variables / Secrets tab separation › the unsaved indicator appears only on the tab with unsaved edits [default] › tests/environments/environment-tabs/environment-tabs.spec.ts:698:7 › Global Environment Variables / Secrets tab separation › the unsaved indicator appears only on the tab with unsaved edits 5 skipped 300 passed (23.9m)
🎭 Playwright Run Summary
5 flaky [default] › tests/variables-tab/variables-tab.spec.ts:453:7 › Variables tab › restores the scroll position after leaving and reopening the tab [default] › tests/websockets/message-editor-scroll.spec.ts:81:7 › websocket message editor scroll behaviour › selecting another message does not reset the deselected editor scroll to top [default] › tests/websockets/message-editor-scroll.spec.ts:112:7 › websocket message editor scroll behaviour › clicking a reopened message body does not move the scroll position [default] › tests/websockets/message-scroll.spec.ts:84:7 › websocket message list scroll on tab switch › restores both list and editor scroll at the bottom after switching tabs [default] › tests/websockets/multi-message-bru/message-name-style.spec.ts:20:7 › websocket message name styling › long message name truncates instead of overflowing 308 passed (28.4m)

Artifacts

Produced during runtime
Name Size Digest
blob-report-linux-1 Expired
60.4 MB
sha256:b25abf0644214c047985775881e5c4774e715ca6f5779c1e12f64e4f935c306c
blob-report-linux-2 Expired
1.76 MB
sha256:2088df455a606c27c146e01c294bf14bf667663787033f13257907d5c96f216d
blob-report-linux-3 Expired
18.4 MB
sha256:53fe848c229b13367286fb80aaaf13e24d0b225a10cb458398c8b7217c3db0cb
blob-report-linux-4 Expired
15 MB
sha256:56263282646ab74aee4a246d7a96c782e1585e84b65883a4a6700d8b76905161
playwright-report-auth-linux
661 KB
sha256:d61e7ac861b7f0c8f906686575aa2b48d8074eebf3d26187f5d13275c1089ad1
playwright-report-linux
93.8 MB
sha256:89cabb6b52c51c4ae09d4cefb436c664b237ad4a019b2c366817caacddb853d7
playwright-report-linux-ssl
622 KB
sha256:523f14c6b4a591b6f96d99c996528b2cec48a554e6747e0694a58931d1e148b0