{"id":13393482,"url":"https://github.com/puppeteer/puppeteer","last_synced_at":"2026-10-18T20:42:24.027Z","repository":{"id":37271438,"uuid":"90796663","full_name":"puppeteer/puppeteer","owner":"puppeteer","description":"JavaScript API for Chrome and Firefox","archived":false,"fork":false,"pushed_at":"2026-10-14T06:17:41.000Z","size":1571523,"stargazers_count":95691,"open_issues_count":271,"forks_count":9589,"subscribers_count":1204,"default_branch":"main","last_synced_at":"2026-10-14T07:59:38.514Z","etag":null,"topics":["automation","chrome","chromium","developer-tools","firefox","headless-chrome","node-module","testing","web"],"latest_commit_sha":null,"homepage":"https://pptr.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/puppeteer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","accessibility":null,"support":"docs/supported-browsers.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2017-05-09T22:16:13.000Z","updated_at":"2026-10-14T06:54:22.000Z","dependencies_parsed_at":"2026-10-14T07:59:39.757Z","dependency_job_id":null,"html_url":"https://github.com/puppeteer/puppeteer","commit_stats":{"total_commits":5323,"total_committers":519,"mean_commits":10.25626204238921,"dds":0.8209656208904753,"last_synced_commit":"a9dee02dfb7c41e19c62de1d0f62b718b5e02f35"},"previous_names":["googlechrome/puppeteer"],"tags_count":715,"template":false,"template_full_name":null,"purl":"pkg:github/puppeteer/puppeteer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppeteer%2Fpuppeteer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppeteer%2Fpuppeteer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppeteer%2Fpuppeteer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppeteer%2Fpuppeteer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/puppeteer","download_url":"https://codeload.github.com/puppeteer/puppeteer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppeteer%2Fpuppeteer/sbom","scorecard":{"id":57447,"data":{"date":"2025-08-14T12:21:53Z","repo":{"name":"github.com/puppeteer/puppeteer","commit":"340e77eecd90577b8fd74447ddd75af37f58f29a"},"scorecard":{"version":"v5.2.1","commit":"ab2f6e92482462fe66246d9e32f642855a691dc1"},"score":7.4,"checks":[{"name":"Code-Review","score":9,"reason":"Found 19/21 approved changesets -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#code-review"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dependency-update-tool"}},{"name":"Security-Policy","score":9,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#security-policy"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 17 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/pre-release.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish.yml:17","Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish.yml:55","Info: jobLevel 'actions' permission set to 'read': .github/workflows/scorecards-analysis.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/scorecards-analysis.yml:22","Info: topLevel permissions set to 'read-all': .github/workflows/changed-packages.yml:3","Info: topLevel permissions set to 'read-all': .github/workflows/ci.yml:4","Info: topLevel permissions set to 'read-all': .github/workflows/daily.yml:4","Info: topLevel permissions set to 'read-all': .github/workflows/deflake.yml:4","Info: topLevel permissions set to 'read-all': .github/workflows/devtools.yml:4","Info: topLevel permissions set to 'read-all': .github/workflows/pre-release.yml:3","Info: topLevel permissions set to 'read-all': .github/workflows/publish.yml:3","Warn: topLevel 'contents' permission set to 'write': .github/workflows/release-please.yml:7","Info: topLevel permissions set to 'read-all': .github/workflows/scorecards-analysis.yml:12","Info: topLevel permissions set to 'read-all': .github/workflows/stale.yml:9","Info: topLevel permissions set to 'read-all': .github/workflows/update-browser-pins.yml:5"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":9,"reason":"dependency not pinned by hash detected -- score normalized to 9","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-please.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/puppeteer/puppeteer/release-please.yml/main?enable=pin","Warn: npmCommand not pinned by hash: docker/Dockerfile:28-29","Warn: npmCommand not pinned by hash: .github/workflows/devtools.yml:71","Warn: npmCommand not pinned by hash: .github/workflows/pre-release.yml:61","Info:  61 out of  61 GitHub-owned GitHubAction dependencies pinned","Info:  21 out of  22 third-party GitHubAction dependencies pinned","Info:   1 out of   1 containerImage dependencies pinned","Info:  24 out of  27 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#cii-best-practices"}},{"name":"SAST","score":7,"reason":"SAST tool is not run on all commits -- score normalized to 7","details":["Warn: 23 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#sast"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":5,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Warn: 'stale review dismissal' is disabled on branch 'main'","Warn: required approving review count is 1 on branch 'main'","Warn: codeowners review is required - but no codeowners file found in repo","Warn: 'last push approval' is disabled on branch 'main'","Info: 'up-to-date branches' is required to merge on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish.yml:50"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#packaging"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#license"}},{"name":"CI-Tests","score":10,"reason":"30 out of 30 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#ci-tests"}},{"name":"Contributors","score":10,"reason":"project has 60 contributing companies or organizations","details":["Info: found contributions from: 60devs, AreaFiftyLAN, ChromeDevTools, DeveloperToolsWG, GoogleChrome, GoogleChromeLabs, GoogleCloudPlatform, Heisenbergjs, Modernizr, RemoteDebug, aimotive, appium, bestiejs, bower, catapult-project, chromium, components, ctfs, degulabs, diveintomark, firefox-devtools, google, google chrome ♥z, googlers, h5bp, hardkoded, html5rocks, iRail, ionic-team, jquery, jshint, langchain-ai, logius, microsoft, mozilla, oftn-oswg, openjs-foundation, ot-crew, puppeteer, robinhood, robohornet, router-async, rustdresden, sass, sfnode, so-fancy, source-map, stencil-community, stenciljs, tc39, tibiamaps, unicode-org, v8, w3c, webdriver, webdriverio, whatwg, wix, yarnpkg, yeoman"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#contributors"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-xffm-g5w8-qvg7","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-15T01:03:43.437Z","repository_id":37271438,"created_at":"2025-08-15T01:03:43.437Z","updated_at":"2025-08-15T01:03:43.437Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":344794859,"owners_count":38307299,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-14T02:00:06.392Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","chrome","chromium","developer-tools","firefox","headless-chrome","node-module","testing","web"],"created_at":"2024-07-30T17:00:53.966Z","updated_at":"2026-10-18T20:42:24.020Z","avatar_url":"https://github.com/puppeteer.png","language":"TypeScript","funding_links":[],"categories":["Browser Testing","TypeScript","Packages","HarmonyOS","UI \u0026 Browser Automation","GUI Automation","Browser Automation \u0026 Scraping","Repository","Web","Performance Testing","Programming","🌐 Browser Automation","RPA(Robotic Process Automation)","GIT 仓库","Typescript / Javascript","TypeScript (19)","Tools, Applications, Libraries, Frameworks","[User Interface Testing](TestingDomains.md/#user-interface-testing)","JavaScript","🛠️ Developer Tools","测试","Uncategorized","语言资源库","automation","Repos","Infrastructure Tooling","Tools","Back-End Development","Application Recommendation","web","chromium","Chrome DevTools Protocol","包","📚 فهرست","Eight e2e testing tools for Node.js, JavaScript and TypeScript","Libraries","Open Source Libraries","\u003ca name=\"TypeScript\"\u003e\u003c/a\u003eTypeScript","🧪 Testing","Preview"],"sub_categories":["Testing","Windows Manager",".NET","Snippets Manager","Automation \u0026 RPA","Scraping and Crawling","Browser \u0026 Frontend Performance","JavaScript","自动化","Uncategorized","typescript","Browser Automation","🤖 Automation Tools","The big two automation libraries","测试","وب اسکرپینگ","E2E Testing","`npm run build`","☸️ Kubernetes"],"readme":"# Puppeteer\n\n[![build](https://github.com/puppeteer/puppeteer/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/puppeteer/puppeteer/actions/workflows/ci.yml)\n[![npm puppeteer package](https://img.shields.io/npm/v/puppeteer.svg)](https://npmjs.org/package/puppeteer)\n\n\u003cimg src=\"https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png\" height=\"200\" align=\"right\"/\u003e\n\n\u003e Puppeteer is a JavaScript library which provides a high-level API to control\n\u003e Chrome or Firefox over the\n\u003e [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/) or [WebDriver BiDi](https://pptr.dev/webdriver-bidi).\n\u003e Puppeteer runs in the headless (no visible UI) by default\n\n## [Get started](https://pptr.dev/docs) | [API](https://pptr.dev/api) | [FAQ](https://pptr.dev/faq) | [Contributing](https://pptr.dev/contributing) | [Troubleshooting](https://pptr.dev/troubleshooting)\n\n## Installation\n\n```bash npm2yarn\nnpm i puppeteer # Downloads compatible Chrome during installation.\nnpm i puppeteer-core # Alternatively, install as a library, without downloading Chrome.\n```\n\n:::note\n\nModern package managers (including npm (see the [RFC](https://github.com/npm/rfcs/pull/868)), pnpm, Yarn, Bun, and Deno) block dependency install scripts by default. If the install script is blocked, Puppeteer will not download the browser during installation, leading to runtime errors.\n\nYou can manually download the required browsers after installation by running:\n\n```bash npm2yarn\nnpx puppeteer browsers install\n```\n\nAlternatively, you can configure your package manager to allow the install script to run (for example, with npm, by adding `\"puppeteer\"` to `\"allowScripts\"` in your `package.json`).\n\n:::\n\n## MCP\n\nInstall [`chrome-devtools-mcp`](https://github.com/ChromeDevTools/chrome-devtools-mcp),\na Puppeteer-based MCP server for browser automation and debugging.\n\nPuppeteer also supports the experimental [WebMCP](https://pptr.dev/guides/webmcp) API.\n\n## Example\n\n```ts\nimport puppeteer from 'puppeteer';\n// Or import puppeteer from 'puppeteer-core';\n\n// Launch the browser and open a new blank page.\nconst browser = await puppeteer.launch();\nconst page = await browser.newPage();\n\n// Navigate the page to a URL.\nawait page.goto('https://developer.chrome.com/');\n\n// Set the screen size.\nawait page.setViewport({width: 1080, height: 1024});\n\n// Open the search menu using the keyboard.\nawait page.keyboard.press('/');\n\n// Type into search box using accessible input name.\nawait page.locator('::-p-aria(Search)').fill('automate beyond recorder');\n\n// Wait and click on first result.\nawait page.locator('.devsite-result-item-link').click();\n\n// Locate the full title with a unique string.\nconst textSelector = await page\n  .locator('::-p-text(Customize and automate)')\n  .waitHandle();\nconst fullTitle = await textSelector?.evaluate(el =\u003e el.textContent);\n\n// Print the full title.\nconsole.log('The title of this blog post is \"%s\".', fullTitle);\n\nawait browser.close();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpuppeteer%2Fpuppeteer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpuppeteer%2Fpuppeteer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpuppeteer%2Fpuppeteer/lists"}