jackwener/OpenCLI · error · EmptyResultError
No purchased courses found — login session may have expired
Error message
No purchased courses found — login session may have expired or the "内容" tab has no items
What it means
The study.xiaoe-tech.com page evaluated fine but returned no course rows. The library treats an empty result as EmptyResultError for xiaoe/courses, since purchased courses should exist for an authenticated user — the most likely cause is an expired login session or the '内容' (Content) tab genuinely having no items.
Source
Thrown at clis/xiaoe/courses.js:105
}
return results;
})()`;
}
async function getXiaoeCourses(page) {
let rows;
try {
await page.goto('https://study.xiaoe-tech.com/', { waitUntil: 'load', settleMs: 8000 });
rows = await page.evaluate(buildCoursesScript());
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
throw new CommandExecutionError(
`Failed to list xiaoe courses: ${message}`,
'page may not have rendered or auth may be required',
);
}
if (!Array.isArray(rows) || rows.length === 0) {
throw new EmptyResultError(
'xiaoe/courses',
'No purchased courses found — login session may have expired or the "内容" tab has no items',
);
}
return rows;
}
export const coursesCommand = cli({
site: 'xiaoe',
name: 'courses',
access: 'read',
description: '列出已购小鹅通课程(含 URL 和店铺名)',
domain: 'study.xiaoe-tech.com',
strategy: Strategy.COOKIE,
browser: true,
columns: ['title', 'shop', 'url'],
func: getXiaoeCourses,
});View on GitHub (pinned to 49907e53dc)
Solutions
- Log back in to xiaoe and retry the command
- Confirm in a browser that the account actually has items under the '内容' tab
- Retry once — the list may still have been loading
- Update the selectors/flow in buildCoursesScript if the site layout changed
Defensive patterns
Strategy: fallback
Validate before calling
null
Type guard
null
Try / catch
try {
const courses = await getXiaoeCourses();
} catch (e) {
if (e.name === 'EmptyResultError' && /No purchased courses found/.test(e.message)) {
await refreshXiaoeSession();
const retry = await getXiaoeCourses();
if (!retry.length) throw new Error('account genuinely has no items under 内容');
return retry;
}
throw e;
} Prevention
- Confirm the account actually owns content under the '内容' tab before automating
- Re-login before long-running course-list jobs
- Retry once in case lazy loading missed the settle window
- Watch for site redesigns that rename or move the '内容' tab
When it happens
Trigger: page.evaluate(buildCoursesScript()) returns [] or a non-array: the '内容' tab is empty, the evaluator ran before the course list rendered, or the user is logged out and the DOM is an auth shell.
Common situations: Expired session cookie producing an empty-shell page; a brand-new account with no purchased content; slow lazy-loading of the course list past the settle window; site redesign renaming the '内容' tab.
Related errors
- No article content extracted — login session may have expire
- No catalog rows extracted — the URL may not be a course page
- No rows returned from page evaluator (page structure may hav
- No prices returned for train_no=${trainNo} ${fromStation.nam
- No 12306 stations match "${keyword}"
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/78d59728fe8cbc51.
Report an issue: GitHub.