diff --git a/tests/3DFourUp.spec.ts b/tests/3DFourUp.spec.ts index 76ab78d51..4e58fb916 100644 --- a/tests/3DFourUp.spec.ts +++ b/tests/3DFourUp.spec.ts @@ -5,6 +5,7 @@ import { screenShotPaths, test, visitStudy, + waitForViewportsRendered, } from './utils'; test.beforeEach(async ({ page }) => { @@ -19,7 +20,7 @@ test.describe('3D four up Test', async () => { await attemptAction(() => reduce3DViewportSize(page), 10, 100); - await mainToolbarPageObject.waitForVolumeLoad(); + await waitForViewportsRendered(page); await checkForScreenshot( page, diff --git a/tests/3DMain.spec.ts b/tests/3DMain.spec.ts index 48acb7d77..7ebe9b120 100644 --- a/tests/3DMain.spec.ts +++ b/tests/3DMain.spec.ts @@ -5,6 +5,7 @@ import { screenShotPaths, test, visitStudy, + waitForViewportsRendered, } from './utils'; test.beforeEach(async ({ page }) => { @@ -17,7 +18,7 @@ test.describe('3D main Test', async () => { test('should render 3D main correctly.', async ({ page, mainToolbarPageObject }) => { await mainToolbarPageObject.layoutSelection.threeDMain.click(); await attemptAction(() => reduce3DViewportSize(page), 10, 100); - await mainToolbarPageObject.waitForVolumeLoad(); + await waitForViewportsRendered(page); await checkForScreenshot(page, page, screenShotPaths.threeDMain.threeDMainDisplayedCorrectly); }); }); diff --git a/tests/3DOnly.spec.ts b/tests/3DOnly.spec.ts index c2df3dd80..81c06b0de 100644 --- a/tests/3DOnly.spec.ts +++ b/tests/3DOnly.spec.ts @@ -5,6 +5,7 @@ import { screenShotPaths, test, visitStudy, + waitForViewportsRendered, } from './utils'; test.beforeEach(async ({ page }) => { @@ -17,7 +18,7 @@ test.describe('3D only Test', async () => { test('should render 3D only correctly.', async ({ page, mainToolbarPageObject }) => { await mainToolbarPageObject.layoutSelection.threeDOnly.click(); await attemptAction(() => reduce3DViewportSize(page), 10, 100); - await mainToolbarPageObject.waitForVolumeLoad(); + await waitForViewportsRendered(page); // Use a 4 percent diff pixel ratio to account for slight color differences in the 3D viewport await checkForScreenshot({ page, diff --git a/tests/3DPrimary.spec.ts b/tests/3DPrimary.spec.ts index 51cd329d6..bf41c1f01 100644 --- a/tests/3DPrimary.spec.ts +++ b/tests/3DPrimary.spec.ts @@ -5,6 +5,7 @@ import { screenShotPaths, test, visitStudy, + waitForViewportsRendered, } from './utils'; test.beforeEach(async ({ page }) => { @@ -18,7 +19,7 @@ test.describe('3D primary Test', async () => { await mainToolbarPageObject.layoutSelection.threeDPrimary.click(); await attemptAction(() => reduce3DViewportSize(page), 10, 100); - await mainToolbarPageObject.waitForVolumeLoad(); + await waitForViewportsRendered(page); await checkForScreenshot( page, page, diff --git a/tests/ArrowAnnotate.spec.ts b/tests/ArrowAnnotate.spec.ts index fafb8babd..c18d70221 100644 --- a/tests/ArrowAnnotate.spec.ts +++ b/tests/ArrowAnnotate.spec.ts @@ -1,4 +1,10 @@ -import { checkForScreenshot, screenShotPaths, test, visitStudy } from './utils'; +import { + checkForScreenshot, + screenShotPaths, + test, + visitStudy, + waitForViewportRenderCycle, +} from './utils'; test.beforeEach(async ({ page }) => { const studyInstanceUID = '1.3.6.1.4.1.25403.345050719074.3824.20170125095438.5'; @@ -27,9 +33,11 @@ test('should display the arrow tool and allow free-form text to be entered', asy 'Ringo Starr was the drummer for The Beatles' ); + const viewportRenderCycle = waitForViewportRenderCycle(page); + await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await mainToolbarPageObject.waitForVolumeLoad(); + await viewportRenderCycle; await checkForScreenshot({ page, @@ -43,8 +51,6 @@ test('should display the arrow tool and allow free-form text to be entered', asy await DOMOverlayPageObject.dialog.input.fillAndSave('Neil Peart was the drummer for Rush'); - await mainToolbarPageObject.waitForVolumeLoad(); - await checkForScreenshot({ page, maxDiffPixelRatio: 0.0075, @@ -57,8 +63,6 @@ test('should display the arrow tool and allow free-form text to be entered', asy .nthMeasurement(0) .actions.rename('Drummer annotation arrow'); - await mainToolbarPageObject.waitForVolumeLoad(); - await checkForScreenshot({ page, maxDiffPixelRatio: 0.0075, diff --git a/tests/DicomTagBrowser.spec.ts b/tests/DicomTagBrowser.spec.ts index 92719e898..bbbd8abcb 100644 --- a/tests/DicomTagBrowser.spec.ts +++ b/tests/DicomTagBrowser.spec.ts @@ -1,4 +1,11 @@ -import { checkForScreenshot, screenShotPaths, test, visitStudy, expect } from './utils'; +import { + checkForScreenshot, + screenShotPaths, + test, + visitStudy, + expect, + waitForViewportsRendered, +} from './utils'; import { assertBoundingBoxIsContainedWithin } from './utils/assertions'; async function expectSelectedSeriesExistsInOptions(seriesSelect) { @@ -23,7 +30,6 @@ test('should display the dicom tag browser', async ({ page, mainToolbarPageObjec const mode = 'viewer'; await visitStudy(page, studyInstanceUID, mode, 2000); - await mainToolbarPageObject.waitForVolumeLoad(); await mainToolbarPageObject.moreTools.tagBrowser.click(); await checkForScreenshot( page, @@ -40,7 +46,6 @@ test('should render the scroll bar with the correct look-and-feel', async ({ const mode = 'viewer'; await visitStudy(page, studyInstanceUID, mode, 2000); - await mainToolbarPageObject.waitForVolumeLoad(); await mainToolbarPageObject.moreTools.tagBrowser.click(); await checkForScreenshot({ page, @@ -58,7 +63,6 @@ test('should display the long series name properly within the series select butt const mode = 'viewer'; await visitStudy(page, studyInstanceUID, mode, 2000); - await mainToolbarPageObject.waitForVolumeLoad(); await mainToolbarPageObject.moreTools.tagBrowser.click(); const dicomTagBrowser = DOMOverlayPageObject.dialog.dicomTagBrowser; @@ -94,7 +98,8 @@ test('should open DICOM Tag Browser from empty viewport and show default series' // Switch to 3x3 layout await mainToolbarPageObject.layoutSelection.click(); await page.getByTestId('Layout-2-2').click(); - await mainToolbarPageObject.waitForVolumeLoad(); + + await waitForViewportsRendered(page); await viewportPageObject.getNthLocator(6).click(); @@ -119,7 +124,8 @@ test('should open DICOM Tag Browser with active viewport series when viewport ha await mainToolbarPageObject.layoutSelection.click(); await page.getByTestId('Layout-2-2').click(); - await mainToolbarPageObject.waitForVolumeLoad(); + + await waitForViewportsRendered(page); await (await viewportPageObject.getNth(2)).pane.click(); diff --git a/tests/Invert.spec.ts b/tests/Invert.spec.ts index 3b1ab9990..f6bfaf573 100644 --- a/tests/Invert.spec.ts +++ b/tests/Invert.spec.ts @@ -1,4 +1,10 @@ -import { checkForScreenshot, screenShotPaths, test, visitStudy } from './utils'; +import { + checkForScreenshot, + screenShotPaths, + test, + visitStudy, + waitForViewportsRendered, +} from './utils'; test.beforeEach(async ({ page }) => { const studyInstanceUID = '1.3.6.1.4.1.25403.345050719074.3824.20170125095438.5'; @@ -8,6 +14,6 @@ test.beforeEach(async ({ page }) => { test('should invert the image', async ({ page, mainToolbarPageObject }) => { await mainToolbarPageObject.moreTools.invert.click(); - await mainToolbarPageObject.waitForVolumeLoad(); + await waitForViewportsRendered(page); await checkForScreenshot(page, page, screenShotPaths.invert.invertDisplayedCorrectly); }); diff --git a/tests/MPRThenRTOverlayNoHydration.spec.ts b/tests/MPRThenRTOverlayNoHydration.spec.ts index 2bbde7bc6..1125273e7 100644 --- a/tests/MPRThenRTOverlayNoHydration.spec.ts +++ b/tests/MPRThenRTOverlayNoHydration.spec.ts @@ -1,4 +1,11 @@ -import { checkForScreenshot, screenShotPaths, test, visitStudy } from './utils'; +import { + checkForScreenshot, + screenShotPaths, + test, + visitStudy, + waitForViewportRenderCycle, + waitForViewportsRendered, +} from './utils'; import { assertNumberOfModalityLoadBadges } from './utils/assertions'; test.beforeEach(async ({ page }) => { @@ -14,7 +21,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me }) => { await mainToolbarPageObject.layoutSelection.MPR.click(); - await mainToolbarPageObject.waitForVolumeLoad(); + await waitForViewportsRendered(page); await checkForScreenshot( page, @@ -27,6 +34,8 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me await sagittalViewport.pane.hover(); const dataOverlayPageObject = sagittalViewport.overlayMenu.dataOverlay; await dataOverlayPageObject.toggle(); + + const viewportRenderCycle = waitForViewportRenderCycle(page); await dataOverlayPageObject.addSegmentation('ARIA RadOnc Structure Sets'); // Hide the overlay menu. @@ -35,7 +44,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me // Adding an overlay should not show the LOAD button. await assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); - await mainToolbarPageObject.waitForVolumeLoad(); + await viewportRenderCycle; await checkForScreenshot({ page, diff --git a/tests/MultipleSegmentationDataOverlays.spec.ts b/tests/MultipleSegmentationDataOverlays.spec.ts index f56250707..fb7830ced 100644 --- a/tests/MultipleSegmentationDataOverlays.spec.ts +++ b/tests/MultipleSegmentationDataOverlays.spec.ts @@ -1,4 +1,11 @@ -import { checkForScreenshot, screenShotPaths, test, visitStudy } from './utils'; +import { + checkForScreenshot, + screenShotPaths, + test, + visitStudy, + waitForViewportRenderCycle, + waitForViewportsRendered, +} from './utils'; import { press } from './utils/keyboardUtils'; import { assertNumberOfModalityLoadBadges } from './utils/assertions'; @@ -10,35 +17,35 @@ test.beforeEach(async ({ page }) => { test('should display multiple segmentation overlays (both SEG and RT)', async ({ page, - mainToolbarPageObject, rightPanelPageObject, viewportPageObject, }) => { await rightPanelPageObject.toggle(); // Add multiple segmentation overlays and ensure the overlay menu reflects this change. - const dataOverlayPageObject = (await viewportPageObject.getById('default')).overlayMenu.dataOverlay; + const dataOverlayPageObject = (await viewportPageObject.getById('default')).overlayMenu + .dataOverlay; await dataOverlayPageObject.toggle(); + let viewportRenderCycle = waitForViewportRenderCycle(page); await dataOverlayPageObject.addSegmentation('2d-tta_nnU-Net_Segmentation'); - - await mainToolbarPageObject.waitForVolumeLoad(); + await viewportRenderCycle; // Adding an overlay should not show the LOAD button. - assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); + await assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); + viewportRenderCycle = waitForViewportRenderCycle(page); await dataOverlayPageObject.addSegmentation('Segmentation'); - - await mainToolbarPageObject.waitForVolumeLoad(); + await viewportRenderCycle; // Adding an overlay should not show the LOAD button. - assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); + await assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); + viewportRenderCycle = waitForViewportRenderCycle(page); await dataOverlayPageObject.addSegmentation('3d_lowres-tta_nnU-Net_Segmentation'); - - await mainToolbarPageObject.waitForVolumeLoad(); + await viewportRenderCycle; // Adding an overlay should not show the LOAD button. - assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); + await assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); await checkForScreenshot({ page, @@ -59,7 +66,7 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({ // Navigate to image 56. await press({ page, key: 'ArrowDown', nTimes: 55 }); - await mainToolbarPageObject.waitForVolumeLoad(); + await waitForViewportsRendered(page); await checkForScreenshot({ page, @@ -69,12 +76,12 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({ // Now add the RT overlay await dataOverlayPageObject.toggle(); + viewportRenderCycle = waitForViewportRenderCycle(page); await dataOverlayPageObject.addSegmentation('Series 3 - RTSTRUCT'); - - await mainToolbarPageObject.waitForVolumeLoad(); + await viewportRenderCycle; // Adding an overlay should not show the LOAD button. - assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); + await assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); await checkForScreenshot({ page, diff --git a/tests/RTDataOverlayNoHydrationThenMPR.spec.ts b/tests/RTDataOverlayNoHydrationThenMPR.spec.ts index ed5f40824..8d272be19 100644 --- a/tests/RTDataOverlayNoHydrationThenMPR.spec.ts +++ b/tests/RTDataOverlayNoHydrationThenMPR.spec.ts @@ -1,4 +1,11 @@ -import { checkForScreenshot, screenShotPaths, test, visitStudy } from './utils'; +import { + checkForScreenshot, + screenShotPaths, + test, + visitStudy, + waitForViewportRenderCycle, + waitForViewportsRendered, +} from './utils'; import { assertNumberOfModalityLoadBadges } from './utils/assertions'; test.beforeEach(async ({ page }) => { @@ -14,17 +21,19 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me viewportPageObject, }) => { await rightPanelPageObject.toggle(); - const dataOverlayPageObject = (await viewportPageObject.getById('default')).overlayMenu.dataOverlay; + const dataOverlayPageObject = (await viewportPageObject.getById('default')).overlayMenu + .dataOverlay; await dataOverlayPageObject.toggle(); + const viewportRenderCycle = waitForViewportRenderCycle(page); await dataOverlayPageObject.addSegmentation('ARIA RadOnc Structure Sets'); // Adding an overlay should not show the LOAD button. - assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); + await assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); // Hide the overlay menu. await dataOverlayPageObject.toggle(); - await mainToolbarPageObject.waitForVolumeLoad(); + await viewportRenderCycle; await checkForScreenshot( page, @@ -34,7 +43,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me await mainToolbarPageObject.layoutSelection.MPR.click(); - await mainToolbarPageObject.waitForVolumeLoad(); + await waitForViewportsRendered(page, { timeout: 40000 }); await checkForScreenshot( page, @@ -43,5 +52,5 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me ); // Adding an overlay should not show the LOAD button. - assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); + await assertNumberOfModalityLoadBadges({ page, expectedCount: 0 }); }); diff --git a/tests/mpr2.spec.ts b/tests/mpr2.spec.ts index 6d73c1c8b..c85bd6a9e 100644 --- a/tests/mpr2.spec.ts +++ b/tests/mpr2.spec.ts @@ -1,4 +1,10 @@ -import { test, visitStudy, checkForScreenshot, screenShotPaths } from './utils'; +import { + test, + visitStudy, + checkForScreenshot, + screenShotPaths, + waitForViewportsRendered, +} from './utils'; test.beforeEach(async ({ page }) => { const studyInstanceUID = @@ -7,12 +13,7 @@ test.beforeEach(async ({ page }) => { await visitStudy(page, studyInstanceUID, mode, 10000); }); -test('should properly display MPR for MR', async ({ - page, - mainToolbarPageObject, - viewportPageObject, -}) => { - await mainToolbarPageObject.waitForVolumeLoad(); +test('should properly display MPR for MR', async ({ page, viewportPageObject }) => { await page.getByTestId('side-panel-header-right').click(); // await page.getByTestId('study-browser-thumbnail-no-image').dblclick(); await checkForScreenshot({ @@ -43,6 +44,8 @@ test('should properly display MPR for MR', async ({ } }); + await waitForViewportsRendered(page); + await checkForScreenshot({ page, locator: viewportPageObject.grid, diff --git a/tests/pages/MainToolbarPageObject.ts b/tests/pages/MainToolbarPageObject.ts index 91a855edb..7c3022c12 100644 --- a/tests/pages/MainToolbarPageObject.ts +++ b/tests/pages/MainToolbarPageObject.ts @@ -52,7 +52,6 @@ export class MainToolbarPageObject { async click() { await layoutSelection.click(); await button.click(); - await self.waitForVolumeLoad(); }, }; }, @@ -63,7 +62,6 @@ export class MainToolbarPageObject { async click() { await layoutSelection.click(); await button.click(); - await self.waitForVolumeLoad(); }, }; }, @@ -74,7 +72,6 @@ export class MainToolbarPageObject { async click() { await layoutSelection.click(); await button.click(); - await self.waitForVolumeLoad(); }, }; }, @@ -85,7 +82,6 @@ export class MainToolbarPageObject { async click() { await layoutSelection.click(); await button.click(); - await self.waitForVolumeLoad(); }, }; }, @@ -96,7 +92,6 @@ export class MainToolbarPageObject { async click() { await layoutSelection.click(); await button.click(); - await self.waitForVolumeLoad(); }, }; },