fix: stabilize youtube navigation ready-state assertion
Retry the post-goto readyState check when Chromium tears down the execution context during ongoing navigation, so the relay navigation test validates page readiness without intermittent race failures.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
||||||
import { chromium } from '@xmorse/playwright-core'
|
import { chromium, type Page } from '@xmorse/playwright-core'
|
||||||
import { getCdpUrl } from './utils.js'
|
import { getCdpUrl } from './utils.js'
|
||||||
import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, type TestContext, withTimeout, createSimpleServer } from './test-utils.js'
|
import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, type TestContext, withTimeout, createSimpleServer } from './test-utils.js'
|
||||||
import './test-declarations.js'
|
import './test-declarations.js'
|
||||||
@@ -23,6 +23,35 @@ describe('Relay Navigation Tests', () => {
|
|||||||
return testCtx.browserContext
|
return testCtx.browserContext
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const waitForStableDocumentReadyState = async ({
|
||||||
|
page,
|
||||||
|
timeoutMs,
|
||||||
|
}: {
|
||||||
|
page: Page
|
||||||
|
timeoutMs: number
|
||||||
|
}) => {
|
||||||
|
const startTime = Date.now()
|
||||||
|
|
||||||
|
while (Date.now() - startTime < timeoutMs) {
|
||||||
|
try {
|
||||||
|
const readyState = await page.evaluate(() => {
|
||||||
|
return document.readyState
|
||||||
|
})
|
||||||
|
if (readyState !== 'loading') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
if (!(e instanceof Error) || !e.message.includes('Execution context was destroyed')) {
|
||||||
|
throw new Error('Failed while waiting for stable document readyState', { cause: e })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await page.waitForTimeout(100)
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`Timed out waiting for stable document readyState after ${timeoutMs}ms`)
|
||||||
|
}
|
||||||
|
|
||||||
it('should be usable after toggle with valid URL', async () => {
|
it('should be usable after toggle with valid URL', async () => {
|
||||||
// Validates the extension waits for a non-empty URL before attaching.
|
// Validates the extension waits for a non-empty URL before attaching.
|
||||||
|
|
||||||
@@ -232,7 +261,7 @@ describe('Relay Navigation Tests', () => {
|
|||||||
|
|
||||||
expect(responseUrl).toContain('youtube')
|
expect(responseUrl).toContain('youtube')
|
||||||
expect(currentUrl).toContain('youtube')
|
expect(currentUrl).toContain('youtube')
|
||||||
expect(await cdpPage!.evaluate(() => document.readyState)).not.toBe('loading')
|
await waitForStableDocumentReadyState({ page: cdpPage!, timeoutMs: 5000 })
|
||||||
|
|
||||||
await browser.close()
|
await browser.close()
|
||||||
await page.close()
|
await page.close()
|
||||||
|
|||||||
Reference in New Issue
Block a user