projectdiscovery/katana · info

ErrEmptyPage

ErrEmptyPage

Error message

page is empty

What it means

ErrEmptyPage is produced by newPageState when page.Info() returns an empty URL or 'about:blank', meaning the browser tab holds no real page to snapshot. getPageHash treats it specially and returns the sentinel emptyPageHash instead of failing. It prevents blank tabs from being recorded as crawl states.

Source

Thrown at pkg/engine/headless/crawler/state.go:65

			return originPageState.UniqueID, pageState, nil
		}
	}

	return "", pageState, fmt.Errorf("failed to navigate back to origin page: %s != %s", currentPageHash, action.OriginID)
}

func getPageHash(page *browser.BrowserPage) (string, *types.PageState, error) {
	pageState, err := newPageState(page, nil)
	if err == ErrEmptyPage {
		return emptyPageHash, nil, nil
	}
	if err != nil {
		return "", nil, errors.Wrap(err, "could not get page state")
	}
	return pageState.UniqueID, pageState, nil
}

var ErrEmptyPage = errors.New("page is empty")

func newPageState(page *browser.BrowserPage, action *types.Action) (*types.PageState, error) {
	pageInfo, err := page.Info()
	if err != nil {
		return nil, errors.Wrap(err, "could not get page info")
	}
	if pageInfo.URL == "" || pageInfo.URL == "about:blank" {
		return nil, ErrEmptyPage
	}

	outerHTML, err := page.HTML()
	if err != nil {
		return nil, errors.Wrap(err, "could not get html content")
	}

	state := &types.PageState{
		URL:              pageInfo.URL,
		DOM:              outerHTML,

View on GitHub (pinned to e3e742739c)

Solutions

  1. Nothing to fix — the crawler silently uses emptyPageHash for such pages
  2. If seen frequently, add navigation wait/delay so pages finish loading before state capture
  3. Check hooks or custom navigations that might open new tabs that remain on about:blank

Example fix

// before: navigating then immediately snapshotting
page.Navigate(url); state := newPageState(page, action)
// after
page.Navigate(url); page.WaitLoad(); state := newPageState(page, action)
Defensive patterns

Strategy: type-guard

Validate before calling

info, err := page.Info()
if err != nil || info.URL == "" || info.URL == "about:blank" {
    page.WaitLoad() // or skip capturing this state
}

Type guard

func isEmptyPage(err error) bool { return errors.Is(err, crawler.ErrEmptyPage) }

Try / catch

pageState, err := newPageState(page, action)
if errors.Is(err, crawler.ErrEmptyPage) {
    return emptyPageHash, nil, nil // mirror library behavior
}

Prevention

When it happens

Trigger: newPageState called on a page whose Info().URL is "" or "about:blank" (state.go:73) — e.g. a freshly opened tab, a navigation that landed on about:blank, or a popup/target that never loaded.

Common situations: Popup-heavy sites opening about:blank windows before redirecting; SPA routes that briefly blank the document; timing races where the crawler snapshots the tab between navigations.

Related errors


AI-assisted analysis of projectdiscovery/katana@e3e742739c (2026-09-03). Data as JSON: /api/errors/c5ba3aec2286ce96. Report an issue: GitHub.