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
- Nothing to fix — the crawler silently uses emptyPageHash for such pages
- If seen frequently, add navigation wait/delay so pages finish loading before state capture
- 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
- Call page.WaitLoad() / navigation waits before snapshotting state
- Configure popup blocking for popup-heavy sites
- Ignore this error — the library already maps it to emptyPageHash
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
- could not get page state
- ErrNoCrawlingAction
- ErrElementNotVisible
- ErrNoNavigationPossible
- could not create new page
AI-assisted analysis of projectdiscovery/katana@e3e742739c (2026-09-03).
Data as JSON: /api/errors/c5ba3aec2286ce96.
Report an issue: GitHub.