{"record":{"id":"c0886b0103ee614f","repo":"jackwener/OpenCLI","slug":"linkedin-sent-invitation-cards-were-not-found-the","errorCode":null,"errorMessage":"LinkedIn sent invitation cards were not found; the page structure may have changed.","messagePattern":"LinkedIn sent invitation cards were not found; the page structure may have changed\\.","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/linkedin/sent-invitations.js","lineNumber":112,"sourceCode":"    let result = unwrapEvaluateResult(await page.evaluate(buildSentInvitationsScript()));\n    if (result?.authRequired) {\n      throw new AuthRequiredError(LINKEDIN_DOMAIN, 'LinkedIn sent invitations requires an active signed-in browser session.');\n    }\n    if (result?.warning) {\n      throw new CommandExecutionError('LinkedIn warning/restriction state visible on sent invitations page.');\n    }\n    if (!result || typeof result !== 'object' || Array.isArray(result) || !Array.isArray(result.rows)) {\n      throw new CommandExecutionError('LinkedIn sent invitations returned a malformed extraction payload.');\n    }\n    if (result.malformedCount > 0) {\n      throw new CommandExecutionError('LinkedIn sent invitations contained a malformed invitation card.');\n    }\n    const rows = result.rows;\n    if (rows.length === 0) {\n      if (result.explicitEmpty) {\n        throw new EmptyResultError('linkedin sent-invitations', 'No pending sent invitations were found.');\n      }\n      throw new CommandExecutionError('LinkedIn sent invitation cards were not found; the page structure may have changed.');\n    }\n    return rows.map((row, index) => ({\n      rank: index + 1,\n      name: row.name || '',\n      profile_url: row.profile_url || '',\n      invited_date_text: row.invited_date_text || '',\n    }));\n  },\n});\n\nexport const __test__ = {\n  buildSentInvitationsScript,\n};\n","sourceCodeStart":94,"sourceCodeEnd":126,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/linkedin/sent-invitations.js#L94-L126","documentation":"This CommandExecutionError is thrown when the sent-invitations scraper found zero invitation cards but LinkedIn did NOT render a recognizable empty-state. The command cannot distinguish 'no invitations' from 'the page HTML changed', so it fails conservatively and suggests the page structure may have changed.","triggerScenarios":"Running `linkedin sent-invitations` when result.rows is empty and result.explicitEmpty is false — the extractor matched no invitation card selectors and no explicit empty indicator was found on the page.","commonSituations":"LinkedIn shipped a DOM/markup change to the invitation manager; a login wall, CAPTCHA, or interstitial page replaced the list; a localized page renders an empty-state the detector does not recognize.","solutions":["Open the sent-invitations page in the browser session and confirm what LinkedIn actually renders; if it is a real empty state, report/update the empty-state detector.","Update the card/empty-state selectors in the scraper to match current LinkedIn markup.","Re-authenticate and retry to rule out an auth-wall or interstitial page being misread as empty content."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  rows = await runCommand('linkedin sent-invitations');\n} catch (e) {\n  if (/page structure may have changed/.test(e.message)) {\n    // alert maintainers / retry once, then fail loudly\n  }\n}","preventionTips":["Retry once after re-login before escalating; auth walls can masquerade as missing content.","Pin scraper selector versions and re-verify after LinkedIn UI updates.","Capture a page screenshot/HTML snapshot on this error to aid selector fixes."],"tags":["linkedin","scraping","dom-change","selector"],"backgroundTag":"dom-structure-changed","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}