Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use await browser.pages() to get a Page[] for open pages across a Puppeteer browser’s contexts. To list pages in only one context, use await context.pages(). Both calls are asynchronous; await them before iterating over the result.

List pages across the browser

Call pages() on the Browser instance. Puppeteer documents this as returning open pages from all browser contexts. The result is a promise that resolves to an array of Page objects.

const pages = await browser.pages();

for (const page of pages) {
  console.log(await page.title(), page.url());
}

This example assumes you already have a connected or launched Puppeteer browser stored in browser. The title and URL calls are asynchronous page methods, so await the title; url() returns the current URL. See the Browser.pages() API reference.

Limit the list to one browser context

Use pages() on the relevant BrowserContext when you do not want pages from other contexts included.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const contextPages = await context.pages();

for (const page of contextPages) {
  console.log(page.url());
}

A browser context is an individual user context. A newly launched browser has at least one default context, and additional contexts may exist. A popup opened by a page belongs to that page’s context. Choose the browser-level method for browser-wide discovery and the context-level method when your work is scoped to one context. See the BrowserContext.pages() API reference and BrowserContext reference.

Call Scope Return type
await browser.pages() Pages across all browser contexts Promise<Page[]>
await context.pages() Pages in that browser context Promise<Page[]>

Understand what the result includes

A Puppeteer Page represents a single tab or extension background page, and one browser can have multiple Page instances. The ordinary browser.pages() and context.pages() listings omit non-visible pages; the API references give background_page as an example. The references point to Target.page() for finding such pages.

Rank #2
Sale
HTML and CSS: Design and Build Websites
  • HTML CSS Design and Build Web Sites
  • Comes with secure packaging
  • It can be a gift option

Both methods document an optional includeAll?: boolean argument and mark it experimental. Passing true includes all kinds of pages according to the API references. Because this option is experimental, check the API reference and the Puppeteer version installed in your project before relying on it.

const pagesIncludingAllKinds = await browser.pages(true);

See Target.page() and the Page API reference. The references do not establish a stable ordering contract for the returned pages, so do not use array position as a documented way to identify a particular visible tab.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Common issues and fixes

  • The result is treated like an array but iteration fails: pages() returns a promise. Write const pages = await browser.pages() inside an async function (or use top-level await where supported) before iterating.
  • A background page is missing: the ordinary listing omits non-visible pages such as background_page. Consult Target.page() or check the experimental includeAll option in the documentation for your installed version.
  • Pages from another context appear: that is expected from browser.pages(), which spans all contexts. Call context.pages() on the context you need.
  • The method or option does not match your installed package: Puppeteer’s online API pages can show different version labels. Check the API docs corresponding to your installed package rather than assuming every version has identical behavior; the reviewed Browser API reference displayed 25.9.0, while the BrowserContext reference displayed 25.12.0.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

If the task is to capture a website rather than inspect Puppeteer’s open tabs, ScreenshotNeo can return a screenshot or PDF with one GET request. Its API accepts and removes cookie/consent banners, newsletter popups and chat widgets before capture; bot checks, blank pages and failed loads are not billed. It also provides an MCP server so AI agents can take screenshots.

For example, save a screenshot of Stripe as WebP:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for parameters and response details. Its Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Sign up for 1,000 free screenshots a month, with no card required.

Rank #4
Sale
Web Design with HTML, CSS, JavaScript and jQuery Set
  • Brand: Wiley
  • Set of 2 Volumes
  • A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.