{"record":{"id":"e481fbfc60001a8e","repo":"sickn33/agentic-awesome-skills","slug":"page-load-timeout-continuing","errorCode":null,"errorMessage":"Page load timeout, continuing...","messagePattern":"Page load timeout, continuing\\.\\.\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"skills/playwright-skill/lib/helpers.js","lineNumber":100,"sourceCode":"}\n\n/**\n * Smart wait for page to be ready\n * @param {Object} page - Playwright page\n * @param {Object} options - Wait options\n */\nasync function waitForPageReady(page, options = {}) {\n  const waitOptions = {\n    waitUntil: options.waitUntil || 'networkidle',\n    timeout: options.timeout || 30000\n  };\n  \n  try {\n    await page.waitForLoadState(waitOptions.waitUntil, { \n      timeout: waitOptions.timeout \n    });\n  } catch (e) {\n    console.warn('Page load timeout, continuing...');\n  }\n  \n  // Additional wait for dynamic content if selector provided\n  if (options.waitForSelector) {\n    await page.waitForSelector(options.waitForSelector, { \n      timeout: options.timeout \n    });\n  }\n}\n\n/**\n * Safe click with retry logic\n * @param {Object} page - Playwright page\n * @param {string} selector - Element selector\n * @param {Object} options - Click options\n */\nasync function safeClick(page, selector, options = {}) {\n  const maxRetries = options.retries || 3;","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/sickn33/agentic-awesome-skills/blob/58d857988fcfac6986206bca2b2fe223aa437e4b/skills/playwright-skill/lib/helpers.js#L82-L118","documentation":"waitForPageReady called page.waitForLoadState with the configured waitUntil state and timeout, and Playwright gave up before the page reached that state. The helper deliberately swallows the error ('continuing...') because many pages never reach 'networkidle'; the flow then proceeds to optional selector waits and content extraction. The warning means readiness is unconfirmed, not that navigation failed.","triggerScenarios":"Waiting for 'networkidle' on an SPA with websockets, analytics beacons, or long-polling; a slow third-party resource blocking 'load'; timeout too small for CI networks or throttled CPUs.","commonSituations":"Default networkidle strategy against modern apps; a hung font or tracking script keeping the network busy; heavy pages under CI where everything is slower; the document actually loaded fine and only the readiness signal was late.","solutions":["Use waitUntil: 'domcontentloaded' or 'load' instead of 'networkidle' for SPAs","Raise the timeout passed in options for slow targets or CI environments","Anchor readiness to a concrete element with options.waitForSelector instead of a load state"],"exampleFix":"// before\nawait waitForPageReady(page, { waitUntil: 'networkidle', timeout: 10000 });\n\n// after\nawait waitForPageReady(page, { waitUntil: 'domcontentloaded', timeout: 30000, waitForSelector: '#results' });","handlingStrategy":"fallback","validationCode":"await waitForPageReady(page, { waitUntil: 'domcontentloaded', timeout: 30000, waitForSelector: '#main-content' });","typeGuard":null,"tryCatchPattern":"// Anchor readiness to a selector with its own timeout instead of load-state waits\ntry {\n  await page.waitForSelector(selector, { timeout });\n} catch {\n  await page.screenshot({ path: 'timeout-debug.png' }); // diagnose, then decide\n}","preventionTips":["Avoid 'networkidle' on SPAs and long-polling pages","Treat a load-state timeout as a soft signal; verify a concrete selector before scraping"],"tags":["playwright","timeout","navigation","spa","networkidle"],"backgroundTag":"page-load-timeout","analyzedSha":"58d857988fcfac6986206bca2b2fe223aa437e4b","analyzedAt":"2026-08-26T11:55:59.350Z","schemaVersion":2},"datasetVersion":"2026-08-26T14:46:13.012Z"}