Mintplex-Labs/anything-llm · error · Error

No browser pages open.

Error message

No browser pages open.

What it means

Thrown by cdp-eval.js after Target.getTargets returns zero pages (all targets are chrome://, devtools://, or non-page types). The browser is up and CDP works, but there is no evaluatable page to inject the expression into.

Source

Thrown at open-computer/services/interface-service/utils/cdp-eval.js:85

async function main() {
  const versionRaw = await httpGet("http://127.0.0.1:9222/json/version");
  const version = JSON.parse(versionRaw);
  const browserWsUrl = version.webSocketDebuggerUrl;
  if (!browserWsUrl) throw new Error("No webSocketDebuggerUrl — is Chromium running?");

  const ws = await new Promise((resolve, reject) => {
    const socket = new WebSocket(browserWsUrl);
    const t = setTimeout(() => reject(new Error("WS connect timeout")), 5000);
    socket.on("open", () => { clearTimeout(t); resolve(socket); });
    socket.on("error", (err) => { clearTimeout(t); reject(err); });
  });

  try {
    const { targetInfos } = await cdpSend(ws, "Target.getTargets");
    const pages = targetInfos.filter(
      (t) => t.type === "page" && !t.url.startsWith("chrome://") && !t.url.startsWith("devtools://")
    );
    if (pages.length === 0) throw new Error("No browser pages open.");

    let target = pages[pages.length - 1];
    if (targetUrl) {
      const match = pages.find(
        (p) => p.url.includes(targetUrl) || p.title.toLowerCase().includes(targetUrl.toLowerCase())
      );
      if (!match) {
        const openTabs = pages.map((p) => `- ${p.title} ${p.url}`).join("\n");
        throw new Error(`No browser tab matching "${targetUrl}". Open tabs:\n${openTabs}`);
      }
      if (match) target = match;
    }

    const { sessionId } = await cdpSend(ws, "Target.attachToTarget", {
      targetId: target.targetId,
      flatten: true,
    });

View on GitHub (pinned to 526360e320)

Solutions

  1. Open at least one http/https/content page in Chromium before invoking cdp-eval.
  2. Launch Chromium with `--app=http://localhost` or similar so a content page exists.
  3. For headless mode, pass a startup URL so a page target is created.

Example fix

# before — no content page
chromium-browser --remote-debugging-port=9222

# after — startup URL creates a page target
chromium-browser --remote-debugging-port=9222 about:blank
Defensive patterns

Strategy: validation

Validate before calling

// Confirm at least one content page exists before evaluating.
async function hasOpenPage() {
  const tabs = JSON.parse(await httpGet('http://127.0.0.1:9222/json'));
  return Array.isArray(tabs) && tabs.some(t => t.type === 'page' && !t.url.startsWith('chrome://'));
}

Try / catch

if (!await hasOpenPage()) {
  console.error('Open at least one content page in Chromium.');
  process.exit(2);
}

Prevention

When it happens

Trigger: Chromium was launched with no startup URL and only shows the new-tab page filtered out, all tabs were closed leaving only devtools windows, or the browser is headless with no about:blank page.

Common situations: Headless Chrome started without a URL arg; user closed every tab manually; only chrome://settings and devtools windows remain; the launcher opened DevTools-for-DevTools but no content page.

Related errors


AI-assisted analysis of Mintplex-Labs/anything-llm@526360e320 (2026-08-13). Data as JSON: /api/errors/d4ea5693ba14dea9. Report an issue: GitHub.