cokit-cli 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +103 -0
- package/README.FLOW.md +237 -0
- package/README.md +153 -94
- package/agents/brainstormer.agent.md +71 -0
- package/agents/code-reviewer.agent.md +128 -0
- package/agents/database-admin.agent.md +91 -0
- package/agents/debugger.agent.md +128 -0
- package/agents/docs-manager.agent.md +121 -0
- package/agents/fullstack-developer.agent.md +96 -0
- package/agents/git-manager.agent.md +392 -0
- package/agents/mcp-manager.agent.md +93 -0
- package/agents/planner.agent.md +94 -0
- package/agents/project-manager.agent.md +124 -0
- package/agents/researcher.agent.md +32 -0
- package/agents/scout-external.agent.md +141 -0
- package/agents/scout.agent.md +107 -0
- package/agents/tester.agent.md +106 -0
- package/agents/ui-ux-designer.agent.md +225 -0
- package/collections/ck-core.collection.yml +30 -0
- package/collections/ck-development-rules.collection.yml +18 -0
- package/collections/ck-documentation.collection.yml +18 -0
- package/collections/ck-git-workflow.collection.yml +18 -0
- package/collections/ck-orchestration.collection.yml +22 -0
- package/collections/ck-ui-design.collection.yml +18 -0
- package/docs/README.md +85 -0
- package/docs/copilot-processing-flow.md +128 -0
- package/instructions/ck-backend.instructions.md +48 -0
- package/instructions/ck-development.instructions.md +40 -0
- package/instructions/ck-frontend-design-pro.instructions.md +58 -0
- package/instructions/ck-frontend.instructions.md +44 -0
- package/instructions/ck-google-adk-python.instructions.md +242 -0
- package/instructions/ck-research.instructions.md +167 -0
- package/instructions/ck-testing.instructions.md +36 -0
- package/package.json +9 -2
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-01-restructure-folders.md +183 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-02-convert-agents.md +206 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-03-convert-commands-to-prompts.md +284 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-04-convert-skills-to-instructions.md +349 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-05-create-collections.md +320 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-06-update-cli-build-scripts.md +450 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-07-update-documentation.md +407 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/plan.md +136 -0
- package/prompts/ck-ask.prompt.md +57 -0
- package/prompts/ck-bootstrap-auto-fast.prompt.md +108 -0
- package/prompts/ck-bootstrap-auto-parallel.prompt.md +66 -0
- package/prompts/ck-bootstrap-auto.prompt.md +114 -0
- package/prompts/ck-bootstrap.prompt.md +136 -0
- package/prompts/ck-brainstorm.prompt.md +68 -0
- package/prompts/ck-ck-help.prompt.md +114 -0
- package/prompts/ck-code-auto.prompt.md +171 -0
- package/prompts/ck-code-no-test.prompt.md +159 -0
- package/prompts/ck-code-parallel.prompt.md +56 -0
- package/prompts/ck-code.prompt.md +177 -0
- package/prompts/ck-coding-level.prompt.md +54 -0
- package/prompts/ck-cook-auto-fast.prompt.md +26 -0
- package/prompts/ck-cook-auto-parallel.prompt.md +49 -0
- package/prompts/ck-cook-auto.prompt.md +15 -0
- package/prompts/ck-cook.prompt.md +96 -0
- package/prompts/ck-debug.prompt.md +14 -0
- package/prompts/ck-design-3d.prompt.md +84 -0
- package/prompts/ck-design-describe.prompt.md +24 -0
- package/prompts/ck-design-fast.prompt.md +32 -0
- package/prompts/ck-design-good.prompt.md +36 -0
- package/prompts/ck-design-screenshot.prompt.md +35 -0
- package/prompts/ck-design-video.prompt.md +35 -0
- package/prompts/ck-docs-init.prompt.md +27 -0
- package/prompts/ck-docs-summarize.prompt.md +23 -0
- package/prompts/ck-docs-update.prompt.md +36 -0
- package/prompts/ck-fix-ci.prompt.md +18 -0
- package/prompts/ck-fix-fast.prompt.md +18 -0
- package/prompts/ck-fix-hard.prompt.md +36 -0
- package/prompts/ck-fix-logs.prompt.md +27 -0
- package/prompts/ck-fix-parallel.prompt.md +54 -0
- package/prompts/ck-fix-test.prompt.md +19 -0
- package/prompts/ck-fix-types.prompt.md +11 -0
- package/prompts/ck-fix-ui.prompt.md +49 -0
- package/prompts/ck-fix.prompt.md +44 -0
- package/prompts/ck-git-cm.prompt.md +8 -0
- package/prompts/ck-git-cp.prompt.md +7 -0
- package/prompts/ck-git-merge.prompt.md +41 -0
- package/prompts/ck-git-pr.prompt.md +49 -0
- package/prompts/ck-kanban.prompt.md +77 -0
- package/prompts/ck-plan-archive.prompt.md +58 -0
- package/prompts/ck-plan-ci.prompt.md +34 -0
- package/prompts/ck-plan-cro.prompt.md +66 -0
- package/prompts/ck-plan-fast.prompt.md +67 -0
- package/prompts/ck-plan-hard.prompt.md +89 -0
- package/prompts/ck-plan-parallel.prompt.md +126 -0
- package/prompts/ck-plan-two.prompt.md +43 -0
- package/prompts/ck-plan-validate.prompt.md +118 -0
- package/prompts/ck-plan.prompt.md +29 -1
- package/prompts/ck-preview.prompt.md +65 -0
- package/prompts/ck-review-codebase.prompt.md +44 -0
- package/prompts/ck-scout-ext.prompt.md +35 -0
- package/prompts/ck-scout.prompt.md +25 -0
- package/prompts/ck-skill-add.prompt.md +36 -0
- package/prompts/ck-skill-create.prompt.md +29 -0
- package/prompts/ck-skill-fix-logs.prompt.md +22 -0
- package/prompts/ck-skill-optimize-auto.prompt.md +25 -0
- package/prompts/ck-skill-optimize.prompt.md +34 -0
- package/prompts/ck-skill-plan.prompt.md +46 -0
- package/prompts/ck-test-ui.prompt.md +92 -0
- package/prompts/ck-test.prompt.md +10 -0
- package/prompts/ck-use-mcp.prompt.md +27 -0
- package/prompts/ck-watzup.prompt.md +11 -0
- package/prompts/ck-worktree.prompt.md +127 -0
- package/rules/README.agents.md +55 -0
- package/rules/README.collections.md +78 -0
- package/rules/README.copilot-instructions.md +66 -0
- package/rules/README.instructions.md +73 -0
- package/rules/README.md +39 -0
- package/rules/README.prompts.md +76 -0
- package/rules/README.skills.md +71 -0
- package/skills/ck-ai-artist/SKILL.md +73 -0
- package/skills/ck-ai-artist/references/advanced-techniques.md +184 -0
- package/skills/ck-ai-artist/references/domain-code.md +66 -0
- package/skills/ck-ai-artist/references/domain-data.md +72 -0
- package/skills/ck-ai-artist/references/domain-marketing.md +66 -0
- package/skills/ck-ai-artist/references/domain-patterns.md +33 -0
- package/skills/ck-ai-artist/references/domain-writing.md +68 -0
- package/skills/ck-ai-artist/references/image-prompting.md +141 -0
- package/skills/ck-ai-artist/references/llm-prompting.md +165 -0
- package/skills/ck-ai-artist/references/nano-banana.md +59 -0
- package/skills/ck-ai-artist/references/reasoning-techniques.md +201 -0
- package/skills/ck-backend-development/SKILL.md +93 -0
- package/skills/ck-backend-development/references/backend-api-design.md +495 -0
- package/skills/ck-backend-development/references/backend-architecture.md +454 -0
- package/skills/ck-backend-development/references/backend-authentication.md +338 -0
- package/skills/ck-backend-development/references/backend-code-quality.md +659 -0
- package/skills/ck-backend-development/references/backend-debugging.md +904 -0
- package/skills/ck-backend-development/references/backend-devops.md +494 -0
- package/skills/ck-backend-development/references/backend-mindset.md +387 -0
- package/skills/ck-backend-development/references/backend-performance.md +397 -0
- package/skills/ck-backend-development/references/backend-security.md +290 -0
- package/skills/ck-backend-development/references/backend-technologies.md +256 -0
- package/skills/ck-backend-development/references/backend-testing.md +429 -0
- package/skills/ck-better-auth/SKILL.md +202 -0
- package/skills/ck-better-auth/references/advanced-features.md +553 -0
- package/skills/ck-better-auth/references/database-integration.md +577 -0
- package/skills/ck-better-auth/references/email-password-auth.md +416 -0
- package/skills/ck-better-auth/references/oauth-providers.md +430 -0
- package/skills/ck-better-auth/scripts/.coverage +0 -0
- package/skills/ck-better-auth/scripts/better_auth_init.py +521 -0
- package/skills/ck-better-auth/scripts/requirements.txt +15 -0
- package/skills/ck-better-auth/scripts/tests/.coverage +0 -0
- package/skills/ck-better-auth/scripts/tests/test_better_auth_init.py +421 -0
- package/skills/ck-chrome-devtools/SKILL.md +470 -0
- package/skills/ck-chrome-devtools/references/cdp-domains.md +694 -0
- package/skills/ck-chrome-devtools/references/performance-guide.md +940 -0
- package/skills/ck-chrome-devtools/references/puppeteer-reference.md +953 -0
- package/skills/ck-chrome-devtools/scripts/README.md +272 -0
- package/skills/ck-chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/skills/ck-chrome-devtools/scripts/aria-snapshot.js +362 -0
- package/skills/ck-chrome-devtools/scripts/click.js +83 -0
- package/skills/ck-chrome-devtools/scripts/console.js +79 -0
- package/skills/ck-chrome-devtools/scripts/evaluate.js +53 -0
- package/skills/ck-chrome-devtools/scripts/fill.js +76 -0
- package/skills/ck-chrome-devtools/scripts/inject-auth.js +229 -0
- package/skills/ck-chrome-devtools/scripts/install-deps.sh +181 -0
- package/skills/ck-chrome-devtools/scripts/install.sh +83 -0
- package/skills/ck-chrome-devtools/scripts/lib/browser.js +318 -0
- package/skills/ck-chrome-devtools/scripts/lib/selector.js +178 -0
- package/skills/ck-chrome-devtools/scripts/navigate.js +54 -0
- package/skills/ck-chrome-devtools/scripts/network.js +106 -0
- package/skills/ck-chrome-devtools/scripts/package-lock.json +1589 -0
- package/skills/ck-chrome-devtools/scripts/package.json +16 -0
- package/skills/ck-chrome-devtools/scripts/performance.js +149 -0
- package/skills/ck-chrome-devtools/scripts/screenshot.js +198 -0
- package/skills/ck-chrome-devtools/scripts/select-ref.js +131 -0
- package/skills/ck-chrome-devtools/scripts/snapshot.js +135 -0
- package/skills/ck-code-review/SKILL.md +110 -53
- package/skills/ck-code-review/references/code-review-reception.md +182 -49
- package/skills/ck-code-review/references/requesting-code-review.md +105 -0
- package/skills/ck-code-review/references/verification-before-completion.md +111 -58
- package/skills/ck-databases/SKILL.md +231 -0
- package/skills/ck-databases/references/mongodb-aggregation.md +447 -0
- package/skills/ck-databases/references/mongodb-atlas.md +465 -0
- package/skills/ck-databases/references/mongodb-crud.md +408 -0
- package/skills/ck-databases/references/mongodb-indexing.md +442 -0
- package/skills/ck-databases/references/postgresql-administration.md +594 -0
- package/skills/ck-databases/references/postgresql-performance.md +527 -0
- package/skills/ck-databases/references/postgresql-psql-cli.md +467 -0
- package/skills/ck-databases/references/postgresql-queries.md +475 -0
- package/skills/ck-databases/scripts/.coverage +0 -0
- package/skills/ck-databases/scripts/db_backup.py +502 -0
- package/skills/ck-databases/scripts/db_migrate.py +425 -0
- package/skills/ck-databases/scripts/db_performance_check.py +456 -0
- package/skills/ck-databases/scripts/requirements.txt +20 -0
- package/skills/ck-databases/scripts/tests/coverage-db.json +1 -0
- package/skills/ck-databases/scripts/tests/requirements.txt +4 -0
- package/skills/ck-databases/scripts/tests/test_db_backup.py +340 -0
- package/skills/ck-databases/scripts/tests/test_db_migrate.py +277 -0
- package/skills/ck-databases/scripts/tests/test_db_performance_check.py +370 -0
- package/skills/ck-debugging/SKILL.md +55 -43
- package/skills/ck-debugging/references/defense-in-depth.md +124 -0
- package/skills/ck-debugging/references/root-cause-tracing.md +100 -43
- package/skills/ck-debugging/references/systematic-debugging.md +80 -52
- package/skills/ck-debugging/references/verification.md +101 -52
- package/skills/ck-debugging/scripts/find-polluter.sh +63 -0
- package/skills/ck-debugging/scripts/find-polluter.test.md +102 -0
- package/skills/ck-devops/.env.example +76 -0
- package/skills/ck-devops/SKILL.md +283 -0
- package/skills/ck-devops/references/browser-rendering.md +305 -0
- package/skills/ck-devops/references/cloudflare-d1-kv.md +123 -0
- package/skills/ck-devops/references/cloudflare-platform.md +271 -0
- package/skills/ck-devops/references/cloudflare-r2-storage.md +280 -0
- package/skills/ck-devops/references/cloudflare-workers-advanced.md +312 -0
- package/skills/ck-devops/references/cloudflare-workers-apis.md +309 -0
- package/skills/ck-devops/references/cloudflare-workers-basics.md +418 -0
- package/skills/ck-devops/references/docker-basics.md +297 -0
- package/skills/ck-devops/references/docker-compose.md +292 -0
- package/skills/ck-devops/references/gcloud-platform.md +297 -0
- package/skills/ck-devops/references/gcloud-services.md +304 -0
- package/skills/ck-devops/scripts/cloudflare_deploy.py +269 -0
- package/skills/ck-devops/scripts/docker_optimize.py +331 -0
- package/skills/ck-devops/scripts/requirements.txt +20 -0
- package/skills/ck-devops/scripts/tests/requirements.txt +3 -0
- package/skills/ck-devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/skills/ck-devops/scripts/tests/test_docker_optimize.py +436 -0
- package/skills/ck-docs-seeker/.env.example +15 -0
- package/skills/ck-docs-seeker/SKILL.md +70 -65
- package/skills/ck-docs-seeker/package.json +25 -0
- package/skills/ck-docs-seeker/references/advanced.md +79 -0
- package/skills/ck-docs-seeker/references/context7-patterns.md +68 -0
- package/skills/ck-docs-seeker/references/errors.md +68 -0
- package/skills/ck-docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/skills/ck-docs-seeker/scripts/detect-topic.js +172 -0
- package/skills/ck-docs-seeker/scripts/fetch-docs.js +213 -0
- package/skills/ck-docs-seeker/scripts/tests/run-tests.js +72 -0
- package/skills/ck-docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/skills/ck-docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/skills/ck-docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/skills/ck-docs-seeker/scripts/utils/env-loader.js +94 -0
- package/skills/ck-docs-seeker/workflows/library-search.md +87 -0
- package/skills/ck-docs-seeker/workflows/repo-analysis.md +91 -0
- package/skills/ck-docs-seeker/workflows/topic-search.md +77 -0
- package/skills/ck-frontend-design/SKILL.md +79 -0
- package/skills/ck-frontend-design/references/analysis-best-practices.md +80 -0
- package/skills/ck-frontend-design/references/analysis-prompts.md +141 -0
- package/skills/ck-frontend-design/references/analysis-techniques.md +118 -0
- package/skills/ck-frontend-design/references/animejs.md +396 -0
- package/skills/ck-frontend-design/references/design-extraction-overview.md +71 -0
- package/skills/ck-frontend-design/references/extraction-best-practices.md +141 -0
- package/skills/ck-frontend-design/references/extraction-output-templates.md +162 -0
- package/skills/ck-frontend-design/references/extraction-prompts.md +127 -0
- package/skills/ck-frontend-design/references/technical-accessibility.md +119 -0
- package/skills/ck-frontend-design/references/technical-best-practices.md +97 -0
- package/skills/ck-frontend-design/references/technical-optimization.md +44 -0
- package/skills/ck-frontend-design/references/technical-overview.md +90 -0
- package/skills/ck-frontend-design/references/technical-workflows.md +150 -0
- package/skills/ck-frontend-design/references/visual-analysis-overview.md +95 -0
- package/skills/ck-frontend-development/SKILL.md +399 -0
- package/skills/ck-frontend-development/resources/common-patterns.md +331 -0
- package/skills/ck-frontend-development/resources/complete-examples.md +872 -0
- package/skills/ck-frontend-development/resources/component-patterns.md +502 -0
- package/skills/ck-frontend-development/resources/data-fetching.md +767 -0
- package/skills/ck-frontend-development/resources/file-organization.md +502 -0
- package/skills/ck-frontend-development/resources/loading-and-error-states.md +501 -0
- package/skills/ck-frontend-development/resources/performance.md +406 -0
- package/skills/ck-frontend-development/resources/routing-guide.md +364 -0
- package/skills/ck-frontend-development/resources/styling-guide.md +428 -0
- package/skills/ck-frontend-development/resources/typescript-standards.md +418 -0
- package/skills/ck-markdown-novel-viewer/SKILL.md +190 -0
- package/skills/ck-markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/skills/ck-markdown-novel-viewer/assets/favicon.png +0 -0
- package/skills/ck-markdown-novel-viewer/assets/novel-theme.css +818 -0
- package/skills/ck-markdown-novel-viewer/assets/reader.js +262 -0
- package/skills/ck-markdown-novel-viewer/assets/template.html +80 -0
- package/skills/ck-markdown-novel-viewer/package.json +15 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +272 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/skills/ck-markdown-novel-viewer/scripts/server.cjs +411 -0
- package/skills/ck-markdown-novel-viewer/scripts/tests/server.test.cjs +283 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-assets.test.cjs +340 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-renderer.test.cjs +404 -0
- package/skills/ck-markdown-novel-viewer/tests/http-server.test.cjs +271 -0
- package/skills/ck-markdown-novel-viewer/tests/run-tests.cjs +51 -0
- package/skills/ck-markdown-novel-viewer/tests/test-framework.cjs +154 -0
- package/skills/ck-markdown-novel-viewer/tests/verify-xss.cjs +90 -0
- package/skills/ck-mcp-builder/LICENSE.txt +202 -0
- package/skills/ck-mcp-builder/SKILL.md +327 -0
- package/skills/ck-mcp-builder/reference/evaluation.md +602 -0
- package/skills/ck-mcp-builder/reference/mcp_best_practices.md +915 -0
- package/skills/ck-mcp-builder/reference/node_mcp_server.md +916 -0
- package/skills/ck-mcp-builder/reference/python_mcp_server.md +752 -0
- package/skills/ck-mcp-builder/scripts/connections.py +151 -0
- package/skills/ck-mcp-builder/scripts/evaluation.py +373 -0
- package/skills/ck-mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/ck-mcp-builder/scripts/requirements.txt +2 -0
- package/skills/ck-mcp-management/README.md +219 -0
- package/skills/ck-mcp-management/SKILL.md +209 -0
- package/skills/ck-mcp-management/assets/tools.json +3146 -0
- package/skills/ck-mcp-management/references/configuration.md +114 -0
- package/skills/ck-mcp-management/references/gemini-cli-integration.md +215 -0
- package/skills/ck-mcp-management/references/mcp-protocol.md +116 -0
- package/skills/ck-mcp-management/scripts/.env.example +10 -0
- package/skills/ck-mcp-management/scripts/cli.ts +195 -0
- package/skills/ck-mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/skills/ck-mcp-management/scripts/dist/cli.js +160 -0
- package/skills/ck-mcp-management/scripts/dist/mcp-client.js +183 -0
- package/skills/ck-mcp-management/scripts/mcp-client.ts +230 -0
- package/skills/ck-mcp-management/scripts/package.json +20 -0
- package/skills/ck-mcp-management/scripts/tsconfig.json +15 -0
- package/skills/ck-media-processing/SKILL.md +90 -0
- package/skills/ck-media-processing/references/common-workflows.md +132 -0
- package/skills/ck-media-processing/references/ffmpeg-encoding.md +358 -0
- package/skills/ck-media-processing/references/ffmpeg-filters.md +503 -0
- package/skills/ck-media-processing/references/ffmpeg-streaming.md +403 -0
- package/skills/ck-media-processing/references/format-compatibility.md +375 -0
- package/skills/ck-media-processing/references/imagemagick-batch.md +612 -0
- package/skills/ck-media-processing/references/imagemagick-editing.md +623 -0
- package/skills/ck-media-processing/references/rmbg-background-removal.md +66 -0
- package/skills/ck-media-processing/references/troubleshooting.md +109 -0
- package/skills/ck-media-processing/scripts/README.md +111 -0
- package/skills/ck-media-processing/scripts/batch-remove-background.sh +124 -0
- package/skills/ck-media-processing/scripts/batch_resize.py +342 -0
- package/skills/ck-media-processing/scripts/media_convert.py +311 -0
- package/skills/ck-media-processing/scripts/remove-background.sh +96 -0
- package/skills/ck-media-processing/scripts/remove-bg-node.js +158 -0
- package/skills/ck-media-processing/scripts/requirements.txt +24 -0
- package/skills/ck-media-processing/scripts/tests/.coverage +0 -0
- package/skills/ck-media-processing/scripts/tests/requirements.txt +2 -0
- package/skills/ck-media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/skills/ck-media-processing/scripts/tests/test_media_convert.py +259 -0
- package/skills/ck-media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/skills/ck-media-processing/scripts/video_optimize.py +414 -0
- package/skills/ck-mobile-development/SKILL.md +210 -0
- package/skills/ck-mobile-development/references/mobile-android.md +604 -0
- package/skills/ck-mobile-development/references/mobile-best-practices.md +545 -0
- package/skills/ck-mobile-development/references/mobile-debugging.md +1089 -0
- package/skills/ck-mobile-development/references/mobile-frameworks.md +465 -0
- package/skills/ck-mobile-development/references/mobile-ios.md +496 -0
- package/skills/ck-mobile-development/references/mobile-mindset.md +544 -0
- package/skills/ck-payment-integration/README.md +185 -0
- package/skills/ck-payment-integration/SKILL.md +116 -0
- package/skills/ck-payment-integration/references/polar/benefits.md +396 -0
- package/skills/ck-payment-integration/references/polar/best-practices.md +482 -0
- package/skills/ck-payment-integration/references/polar/checkouts.md +266 -0
- package/skills/ck-payment-integration/references/polar/overview.md +184 -0
- package/skills/ck-payment-integration/references/polar/products.md +244 -0
- package/skills/ck-payment-integration/references/polar/sdk.md +436 -0
- package/skills/ck-payment-integration/references/polar/subscriptions.md +340 -0
- package/skills/ck-payment-integration/references/polar/webhooks.md +405 -0
- package/skills/ck-payment-integration/references/sepay/api.md +140 -0
- package/skills/ck-payment-integration/references/sepay/best-practices.md +337 -0
- package/skills/ck-payment-integration/references/sepay/overview.md +138 -0
- package/skills/ck-payment-integration/references/sepay/qr-codes.md +228 -0
- package/skills/ck-payment-integration/references/sepay/sdk.md +213 -0
- package/skills/ck-payment-integration/references/sepay/webhooks.md +208 -0
- package/skills/ck-payment-integration/scripts/.env.example +20 -0
- package/skills/ck-payment-integration/scripts/checkout-helper.js +244 -0
- package/skills/ck-payment-integration/scripts/package.json +17 -0
- package/skills/ck-payment-integration/scripts/polar-webhook-verify.js +202 -0
- package/skills/ck-payment-integration/scripts/sepay-webhook-verify.js +193 -0
- package/skills/ck-payment-integration/scripts/test-scripts.js +237 -0
- package/skills/ck-planning/SKILL.md +79 -49
- package/skills/ck-planning/references/codebase-understanding.md +62 -0
- package/skills/ck-planning/references/output-standards.md +127 -0
- package/skills/ck-planning/references/plan-organization.md +122 -60
- package/skills/ck-planning/references/research-phase.md +49 -56
- package/skills/ck-planning/references/solution-design.md +61 -63
- package/skills/ck-problem-solving/SKILL.md +95 -0
- package/skills/ck-problem-solving/references/attribution.md +69 -0
- package/skills/ck-problem-solving/references/collision-zone-thinking.md +79 -0
- package/skills/ck-problem-solving/references/inversion-exercise.md +91 -0
- package/skills/ck-problem-solving/references/meta-pattern-recognition.md +87 -0
- package/skills/ck-problem-solving/references/scale-game.md +95 -0
- package/skills/ck-problem-solving/references/simplification-cascades.md +80 -0
- package/skills/ck-problem-solving/references/when-stuck.md +72 -0
- package/skills/ck-repomix/SKILL.md +247 -0
- package/skills/ck-repomix/references/configuration.md +211 -0
- package/skills/ck-repomix/references/usage-patterns.md +232 -0
- package/skills/ck-repomix/scripts/.coverage +0 -0
- package/skills/ck-repomix/scripts/README.md +179 -0
- package/skills/ck-repomix/scripts/repomix_batch.py +455 -0
- package/skills/ck-repomix/scripts/repos.example.json +15 -0
- package/skills/ck-repomix/scripts/requirements.txt +15 -0
- package/skills/ck-repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/ck-sequential-thinking/.env.example +8 -0
- package/skills/ck-sequential-thinking/README.md +183 -0
- package/skills/ck-sequential-thinking/SKILL.md +14 -2
- package/skills/ck-sequential-thinking/package.json +31 -0
- package/skills/ck-sequential-thinking/references/advanced-strategies.md +79 -0
- package/skills/ck-sequential-thinking/references/advanced-techniques.md +2 -14
- package/skills/ck-sequential-thinking/references/core-patterns.md +8 -0
- package/skills/ck-sequential-thinking/references/examples-api.md +88 -0
- package/skills/ck-sequential-thinking/references/examples-architecture.md +94 -0
- package/skills/ck-sequential-thinking/references/examples-debug.md +90 -0
- package/skills/ck-sequential-thinking/scripts/format-thought.js +159 -0
- package/skills/ck-sequential-thinking/scripts/process-thought.js +236 -0
- package/skills/ck-sequential-thinking/tests/format-thought.test.js +133 -0
- package/skills/ck-sequential-thinking/tests/process-thought.test.js +215 -0
- package/skills/ck-shopify/README.md +66 -0
- package/skills/ck-shopify/SKILL.md +319 -0
- package/skills/ck-shopify/references/app-development.md +470 -0
- package/skills/ck-shopify/references/extensions.md +493 -0
- package/skills/ck-shopify/references/themes.md +498 -0
- package/skills/ck-shopify/scripts/.coverage +0 -0
- package/skills/ck-shopify/scripts/requirements.txt +19 -0
- package/skills/ck-shopify/scripts/shopify_init.py +423 -0
- package/skills/ck-shopify/scripts/tests/.coverage +0 -0
- package/skills/ck-shopify/scripts/tests/test_shopify_init.py +385 -0
- package/skills/ck-skill-creator/LICENSE.txt +202 -0
- package/skills/ck-skill-creator/SKILL.md +265 -0
- package/skills/ck-skill-creator/scripts/init_skill.py +303 -0
- package/skills/ck-skill-creator/scripts/package_skill.py +110 -0
- package/skills/ck-skill-creator/scripts/quick_validate.py +65 -0
- package/skills/ck-threejs/SKILL.md +87 -0
- package/skills/ck-threejs/references/01-getting-started.md +177 -0
- package/skills/ck-threejs/references/02-loaders.md +169 -0
- package/skills/ck-threejs/references/03-textures.md +170 -0
- package/skills/ck-threejs/references/04-cameras.md +195 -0
- package/skills/ck-threejs/references/05-lights.md +183 -0
- package/skills/ck-threejs/references/06-animations.md +214 -0
- package/skills/ck-threejs/references/07-math.md +260 -0
- package/skills/ck-threejs/references/08-interaction.md +267 -0
- package/skills/ck-threejs/references/09-postprocessing.md +240 -0
- package/skills/ck-threejs/references/10-controls.md +259 -0
- package/skills/ck-threejs/references/11-materials-advanced.md +270 -0
- package/skills/ck-threejs/references/12-performance.md +269 -0
- package/skills/ck-threejs/references/13-node-materials.md +298 -0
- package/skills/ck-threejs/references/14-physics-vr.md +304 -0
- package/skills/ck-threejs/references/15-specialized-loaders.md +333 -0
- package/skills/ck-threejs/references/16-webgpu.md +302 -0
- package/skills/ck-ui-styling/LICENSE.txt +202 -0
- package/skills/ck-ui-styling/SKILL.md +319 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/references/canvas-design-system.md +320 -0
- package/skills/ck-ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/ck-ui-styling/references/shadcn-components.md +424 -0
- package/skills/ck-ui-styling/references/shadcn-theming.md +373 -0
- package/skills/ck-ui-styling/references/tailwind-customization.md +483 -0
- package/skills/ck-ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/ck-ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/ck-ui-styling/scripts/.coverage +0 -0
- package/skills/ck-ui-styling/scripts/requirements.txt +17 -0
- package/skills/ck-ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/ck-ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/ck-ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/skills/ck-ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/ck-ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/ck-ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/ck-ui-ux-pro-max/SKILL.md +227 -0
- package/skills/ck-ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ck-ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ck-ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/prompts.csv +24 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/html-tailwind.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ck-ui-ux-pro-max/data/styles.csv +59 -0
- package/skills/ck-ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ck-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ck-ui-ux-pro-max/scripts/core.py +236 -0
- package/skills/ck-ui-ux-pro-max/scripts/search.py +76 -0
- package/skills/ck-web-frameworks/SKILL.md +322 -0
- package/skills/ck-web-frameworks/references/nextjs-app-router.md +465 -0
- package/skills/ck-web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/skills/ck-web-frameworks/references/nextjs-optimization.md +511 -0
- package/skills/ck-web-frameworks/references/nextjs-server-components.md +495 -0
- package/skills/ck-web-frameworks/references/remix-icon-integration.md +603 -0
- package/skills/ck-web-frameworks/references/turborepo-caching.md +551 -0
- package/skills/ck-web-frameworks/references/turborepo-pipelines.md +517 -0
- package/skills/ck-web-frameworks/references/turborepo-setup.md +542 -0
- package/skills/ck-web-frameworks/scripts/.coverage +0 -0
- package/skills/ck-web-frameworks/scripts/__init__.py +0 -0
- package/skills/ck-web-frameworks/scripts/nextjs_init.py +547 -0
- package/skills/ck-web-frameworks/scripts/requirements.txt +16 -0
- package/skills/ck-web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/skills/ck-web-frameworks/scripts/tests/requirements.txt +3 -0
- package/skills/ck-web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/skills/ck-web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/skills/ck-web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/src/commands/init.js +61 -30
- package/src/utils/paths.js +35 -4
|
@@ -0,0 +1,953 @@
|
|
|
1
|
+
# Puppeteer Quick Reference
|
|
2
|
+
|
|
3
|
+
Complete guide to browser automation with Puppeteer - a high-level API over Chrome DevTools Protocol.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Setup](#setup)
|
|
8
|
+
- [Browser & Page Management](#browser--page-management)
|
|
9
|
+
- [Navigation](#navigation)
|
|
10
|
+
- [Element Interaction](#element-interaction)
|
|
11
|
+
- [JavaScript Execution](#javascript-execution)
|
|
12
|
+
- [Screenshots & PDFs](#screenshots--pdfs)
|
|
13
|
+
- [Network Interception](#network-interception)
|
|
14
|
+
- [Device Emulation](#device-emulation)
|
|
15
|
+
- [Performance](#performance)
|
|
16
|
+
- [Common Patterns](#common-patterns)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Setup
|
|
21
|
+
|
|
22
|
+
### Installation
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Install Puppeteer
|
|
26
|
+
npm install puppeteer
|
|
27
|
+
|
|
28
|
+
# Install core only (bring your own Chrome)
|
|
29
|
+
npm install puppeteer-core
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Basic Usage
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
import puppeteer from 'puppeteer';
|
|
36
|
+
|
|
37
|
+
// Launch browser
|
|
38
|
+
const browser = await puppeteer.launch({
|
|
39
|
+
headless: true,
|
|
40
|
+
args: ['--no-sandbox']
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Open page
|
|
44
|
+
const page = await browser.newPage();
|
|
45
|
+
|
|
46
|
+
// Navigate
|
|
47
|
+
await page.goto('https://example.com');
|
|
48
|
+
|
|
49
|
+
// Do work...
|
|
50
|
+
|
|
51
|
+
// Cleanup
|
|
52
|
+
await browser.close();
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Browser & Page Management
|
|
58
|
+
|
|
59
|
+
### Launch Browser
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
const browser = await puppeteer.launch({
|
|
63
|
+
// Visibility
|
|
64
|
+
headless: false, // Show browser UI
|
|
65
|
+
headless: 'new', // New headless mode (Chrome 112+)
|
|
66
|
+
|
|
67
|
+
// Chrome location
|
|
68
|
+
executablePath: '/path/to/chrome',
|
|
69
|
+
channel: 'chrome', // or 'chrome-canary', 'chrome-beta'
|
|
70
|
+
|
|
71
|
+
// Browser context
|
|
72
|
+
userDataDir: './user-data', // Persistent profile
|
|
73
|
+
|
|
74
|
+
// Window size
|
|
75
|
+
defaultViewport: {
|
|
76
|
+
width: 1920,
|
|
77
|
+
height: 1080,
|
|
78
|
+
deviceScaleFactor: 1,
|
|
79
|
+
isMobile: false
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
// Advanced options
|
|
83
|
+
args: [
|
|
84
|
+
'--no-sandbox',
|
|
85
|
+
'--disable-setuid-sandbox',
|
|
86
|
+
'--disable-dev-shm-usage',
|
|
87
|
+
'--disable-web-security',
|
|
88
|
+
'--disable-features=IsolateOrigins',
|
|
89
|
+
'--disable-site-isolation-trials',
|
|
90
|
+
'--start-maximized'
|
|
91
|
+
],
|
|
92
|
+
|
|
93
|
+
// Debugging
|
|
94
|
+
devtools: true, // Open DevTools automatically
|
|
95
|
+
slowMo: 250, // Slow down by 250ms per action
|
|
96
|
+
|
|
97
|
+
// Network
|
|
98
|
+
proxy: {
|
|
99
|
+
server: 'http://proxy.com:8080'
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Connect to Running Browser
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// Launch Chrome with debugging
|
|
108
|
+
// google-chrome --remote-debugging-port=9222
|
|
109
|
+
|
|
110
|
+
const browser = await puppeteer.connect({
|
|
111
|
+
browserURL: 'http://localhost:9222',
|
|
112
|
+
// or browserWSEndpoint: 'ws://localhost:9222/devtools/browser/...'
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Page Management
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
// Create new page
|
|
120
|
+
const page = await browser.newPage();
|
|
121
|
+
|
|
122
|
+
// Get all pages
|
|
123
|
+
const pages = await browser.pages();
|
|
124
|
+
|
|
125
|
+
// Close page
|
|
126
|
+
await page.close();
|
|
127
|
+
|
|
128
|
+
// Multiple pages
|
|
129
|
+
const page1 = await browser.newPage();
|
|
130
|
+
const page2 = await browser.newPage();
|
|
131
|
+
|
|
132
|
+
// Switch between pages
|
|
133
|
+
await page1.bringToFront();
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Browser Context (Incognito)
|
|
137
|
+
|
|
138
|
+
```javascript
|
|
139
|
+
// Create isolated context
|
|
140
|
+
const context = await browser.createBrowserContext();
|
|
141
|
+
const page = await context.newPage();
|
|
142
|
+
|
|
143
|
+
// Cleanup context
|
|
144
|
+
await context.close();
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Navigation
|
|
150
|
+
|
|
151
|
+
### Basic Navigation
|
|
152
|
+
|
|
153
|
+
```javascript
|
|
154
|
+
// Navigate to URL
|
|
155
|
+
await page.goto('https://example.com');
|
|
156
|
+
|
|
157
|
+
// Navigate with options
|
|
158
|
+
await page.goto('https://example.com', {
|
|
159
|
+
waitUntil: 'networkidle2', // or 'load', 'domcontentloaded', 'networkidle0'
|
|
160
|
+
timeout: 30000 // Max wait time (ms)
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// Reload page
|
|
164
|
+
await page.reload({ waitUntil: 'networkidle2' });
|
|
165
|
+
|
|
166
|
+
// Navigation history
|
|
167
|
+
await page.goBack();
|
|
168
|
+
await page.goForward();
|
|
169
|
+
|
|
170
|
+
// Wait for navigation
|
|
171
|
+
await page.waitForNavigation({
|
|
172
|
+
waitUntil: 'networkidle2'
|
|
173
|
+
});
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Wait Until Options
|
|
177
|
+
|
|
178
|
+
- `load` - Wait for load event
|
|
179
|
+
- `domcontentloaded` - Wait for DOMContentLoaded event
|
|
180
|
+
- `networkidle0` - Wait until no network connections for 500ms
|
|
181
|
+
- `networkidle2` - Wait until max 2 network connections for 500ms
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Element Interaction
|
|
186
|
+
|
|
187
|
+
### Selectors
|
|
188
|
+
|
|
189
|
+
```javascript
|
|
190
|
+
// CSS selectors
|
|
191
|
+
await page.$('#id');
|
|
192
|
+
await page.$('.class');
|
|
193
|
+
await page.$('div > p');
|
|
194
|
+
|
|
195
|
+
// XPath
|
|
196
|
+
await page.$x('//button[text()="Submit"]');
|
|
197
|
+
|
|
198
|
+
// Get all matching elements
|
|
199
|
+
await page.$$('.item');
|
|
200
|
+
await page.$$x('//div[@class="item"]');
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Click Elements
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
// Click by selector
|
|
207
|
+
await page.click('.button');
|
|
208
|
+
|
|
209
|
+
// Click with options
|
|
210
|
+
await page.click('.button', {
|
|
211
|
+
button: 'left', // or 'right', 'middle'
|
|
212
|
+
clickCount: 1, // 2 for double-click
|
|
213
|
+
delay: 100 // Delay between mousedown and mouseup
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
// ElementHandle click
|
|
217
|
+
const button = await page.$('.button');
|
|
218
|
+
await button.click();
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Type Text
|
|
222
|
+
|
|
223
|
+
```javascript
|
|
224
|
+
// Type into input
|
|
225
|
+
await page.type('#search', 'query text');
|
|
226
|
+
|
|
227
|
+
// Type with delay
|
|
228
|
+
await page.type('#search', 'slow typing', { delay: 100 });
|
|
229
|
+
|
|
230
|
+
// Clear and type
|
|
231
|
+
await page.$eval('#search', el => el.value = '');
|
|
232
|
+
await page.type('#search', 'new text');
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Form Interaction
|
|
236
|
+
|
|
237
|
+
```javascript
|
|
238
|
+
// Fill input
|
|
239
|
+
await page.type('#username', 'john@example.com');
|
|
240
|
+
await page.type('#password', 'secret123');
|
|
241
|
+
|
|
242
|
+
// Select dropdown option
|
|
243
|
+
await page.select('#country', 'US'); // By value
|
|
244
|
+
await page.select('#country', 'USA', 'UK'); // Multiple
|
|
245
|
+
|
|
246
|
+
// Check/uncheck checkbox
|
|
247
|
+
await page.click('input[type="checkbox"]');
|
|
248
|
+
|
|
249
|
+
// Choose radio button
|
|
250
|
+
await page.click('input[value="option2"]');
|
|
251
|
+
|
|
252
|
+
// Upload file
|
|
253
|
+
const input = await page.$('input[type="file"]');
|
|
254
|
+
await input.uploadFile('/path/to/file.pdf');
|
|
255
|
+
|
|
256
|
+
// Submit form
|
|
257
|
+
await page.click('button[type="submit"]');
|
|
258
|
+
await page.waitForNavigation();
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Hover & Focus
|
|
262
|
+
|
|
263
|
+
```javascript
|
|
264
|
+
// Hover over element
|
|
265
|
+
await page.hover('.menu-item');
|
|
266
|
+
|
|
267
|
+
// Focus element
|
|
268
|
+
await page.focus('#input');
|
|
269
|
+
|
|
270
|
+
// Blur
|
|
271
|
+
await page.$eval('#input', el => el.blur());
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Drag & Drop
|
|
275
|
+
|
|
276
|
+
```javascript
|
|
277
|
+
const source = await page.$('.draggable');
|
|
278
|
+
const target = await page.$('.drop-zone');
|
|
279
|
+
|
|
280
|
+
await source.drag(target);
|
|
281
|
+
await source.drop(target);
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## JavaScript Execution
|
|
287
|
+
|
|
288
|
+
### Evaluate in Page Context
|
|
289
|
+
|
|
290
|
+
```javascript
|
|
291
|
+
// Execute JavaScript
|
|
292
|
+
const title = await page.evaluate(() => document.title);
|
|
293
|
+
|
|
294
|
+
// With arguments
|
|
295
|
+
const text = await page.evaluate(
|
|
296
|
+
(selector) => document.querySelector(selector).textContent,
|
|
297
|
+
'.heading'
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
// Return complex data
|
|
301
|
+
const data = await page.evaluate(() => ({
|
|
302
|
+
title: document.title,
|
|
303
|
+
url: location.href,
|
|
304
|
+
cookies: document.cookie
|
|
305
|
+
}));
|
|
306
|
+
|
|
307
|
+
// With ElementHandle
|
|
308
|
+
const element = await page.$('.button');
|
|
309
|
+
const text = await page.evaluate(el => el.textContent, element);
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Query & Modify DOM
|
|
313
|
+
|
|
314
|
+
```javascript
|
|
315
|
+
// Get element property
|
|
316
|
+
const value = await page.$eval('#input', el => el.value);
|
|
317
|
+
|
|
318
|
+
// Get multiple elements
|
|
319
|
+
const items = await page.$$eval('.item', elements =>
|
|
320
|
+
elements.map(el => el.textContent)
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
// Modify element
|
|
324
|
+
await page.$eval('#input', (el, value) => {
|
|
325
|
+
el.value = value;
|
|
326
|
+
}, 'new value');
|
|
327
|
+
|
|
328
|
+
// Add class
|
|
329
|
+
await page.$eval('.element', el => el.classList.add('active'));
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Expose Functions
|
|
333
|
+
|
|
334
|
+
```javascript
|
|
335
|
+
// Expose Node.js function to page
|
|
336
|
+
await page.exposeFunction('md5', (text) =>
|
|
337
|
+
crypto.createHash('md5').update(text).digest('hex')
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
// Call from page context
|
|
341
|
+
const hash = await page.evaluate(async () => {
|
|
342
|
+
return await window.md5('hello world');
|
|
343
|
+
});
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## Screenshots & PDFs
|
|
349
|
+
|
|
350
|
+
### Screenshots
|
|
351
|
+
|
|
352
|
+
```javascript
|
|
353
|
+
// Full page screenshot
|
|
354
|
+
await page.screenshot({
|
|
355
|
+
path: 'screenshot.png',
|
|
356
|
+
fullPage: true
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
// Viewport screenshot
|
|
360
|
+
await page.screenshot({
|
|
361
|
+
path: 'viewport.png',
|
|
362
|
+
fullPage: false
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
// Element screenshot
|
|
366
|
+
const element = await page.$('.chart');
|
|
367
|
+
await element.screenshot({
|
|
368
|
+
path: 'chart.png'
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
// Screenshot options
|
|
372
|
+
await page.screenshot({
|
|
373
|
+
path: 'page.png',
|
|
374
|
+
type: 'png', // or 'jpeg', 'webp'
|
|
375
|
+
quality: 80, // JPEG quality (0-100)
|
|
376
|
+
clip: { // Crop region
|
|
377
|
+
x: 0,
|
|
378
|
+
y: 0,
|
|
379
|
+
width: 500,
|
|
380
|
+
height: 500
|
|
381
|
+
},
|
|
382
|
+
omitBackground: true // Transparent background
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
// Screenshot to buffer
|
|
386
|
+
const buffer = await page.screenshot();
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### PDF Generation
|
|
390
|
+
|
|
391
|
+
```javascript
|
|
392
|
+
// Generate PDF
|
|
393
|
+
await page.pdf({
|
|
394
|
+
path: 'page.pdf',
|
|
395
|
+
format: 'A4', // or 'Letter', 'Legal', etc.
|
|
396
|
+
printBackground: true,
|
|
397
|
+
margin: {
|
|
398
|
+
top: '1cm',
|
|
399
|
+
right: '1cm',
|
|
400
|
+
bottom: '1cm',
|
|
401
|
+
left: '1cm'
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
// Custom page size
|
|
406
|
+
await page.pdf({
|
|
407
|
+
path: 'custom.pdf',
|
|
408
|
+
width: '8.5in',
|
|
409
|
+
height: '11in',
|
|
410
|
+
landscape: true
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
// Header and footer
|
|
414
|
+
await page.pdf({
|
|
415
|
+
path: 'report.pdf',
|
|
416
|
+
displayHeaderFooter: true,
|
|
417
|
+
headerTemplate: '<div style="font-size:10px;">Header</div>',
|
|
418
|
+
footerTemplate: '<div style="font-size:10px;">Page <span class="pageNumber"></span></div>'
|
|
419
|
+
});
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## Network Interception
|
|
425
|
+
|
|
426
|
+
### Request Interception
|
|
427
|
+
|
|
428
|
+
```javascript
|
|
429
|
+
// Enable request interception
|
|
430
|
+
await page.setRequestInterception(true);
|
|
431
|
+
|
|
432
|
+
// Intercept requests
|
|
433
|
+
page.on('request', (request) => {
|
|
434
|
+
// Block specific resource types
|
|
435
|
+
if (request.resourceType() === 'image') {
|
|
436
|
+
request.abort();
|
|
437
|
+
}
|
|
438
|
+
// Block URLs
|
|
439
|
+
else if (request.url().includes('ads')) {
|
|
440
|
+
request.abort();
|
|
441
|
+
}
|
|
442
|
+
// Modify request
|
|
443
|
+
else if (request.url().includes('api')) {
|
|
444
|
+
request.continue({
|
|
445
|
+
headers: {
|
|
446
|
+
...request.headers(),
|
|
447
|
+
'Authorization': 'Bearer token'
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
// Continue normally
|
|
452
|
+
else {
|
|
453
|
+
request.continue();
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### Mock Responses
|
|
459
|
+
|
|
460
|
+
```javascript
|
|
461
|
+
await page.setRequestInterception(true);
|
|
462
|
+
|
|
463
|
+
page.on('request', (request) => {
|
|
464
|
+
if (request.url().includes('/api/user')) {
|
|
465
|
+
request.respond({
|
|
466
|
+
status: 200,
|
|
467
|
+
contentType: 'application/json',
|
|
468
|
+
body: JSON.stringify({
|
|
469
|
+
id: 1,
|
|
470
|
+
name: 'Mock User'
|
|
471
|
+
})
|
|
472
|
+
});
|
|
473
|
+
} else {
|
|
474
|
+
request.continue();
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Monitor Network
|
|
480
|
+
|
|
481
|
+
```javascript
|
|
482
|
+
// Track requests
|
|
483
|
+
page.on('request', (request) => {
|
|
484
|
+
console.log('Request:', request.method(), request.url());
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
// Track responses
|
|
488
|
+
page.on('response', (response) => {
|
|
489
|
+
console.log('Response:', response.status(), response.url());
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
// Track failed requests
|
|
493
|
+
page.on('requestfailed', (request) => {
|
|
494
|
+
console.log('Failed:', request.failure().errorText, request.url());
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
// Get response body
|
|
498
|
+
page.on('response', async (response) => {
|
|
499
|
+
if (response.url().includes('/api/data')) {
|
|
500
|
+
const json = await response.json();
|
|
501
|
+
console.log('API Data:', json);
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## Device Emulation
|
|
509
|
+
|
|
510
|
+
### Predefined Devices
|
|
511
|
+
|
|
512
|
+
```javascript
|
|
513
|
+
import { devices } from 'puppeteer';
|
|
514
|
+
|
|
515
|
+
// Emulate iPhone
|
|
516
|
+
const iPhone = devices['iPhone 13 Pro'];
|
|
517
|
+
await page.emulate(iPhone);
|
|
518
|
+
|
|
519
|
+
// Common devices
|
|
520
|
+
const iPad = devices['iPad Pro'];
|
|
521
|
+
const pixel = devices['Pixel 5'];
|
|
522
|
+
const galaxy = devices['Galaxy S9+'];
|
|
523
|
+
|
|
524
|
+
// Navigate after emulation
|
|
525
|
+
await page.goto('https://example.com');
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
### Custom Device
|
|
529
|
+
|
|
530
|
+
```javascript
|
|
531
|
+
await page.emulate({
|
|
532
|
+
viewport: {
|
|
533
|
+
width: 375,
|
|
534
|
+
height: 812,
|
|
535
|
+
deviceScaleFactor: 3,
|
|
536
|
+
isMobile: true,
|
|
537
|
+
hasTouch: true,
|
|
538
|
+
isLandscape: false
|
|
539
|
+
},
|
|
540
|
+
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)...'
|
|
541
|
+
});
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
### Viewport Only
|
|
545
|
+
|
|
546
|
+
```javascript
|
|
547
|
+
await page.setViewport({
|
|
548
|
+
width: 1920,
|
|
549
|
+
height: 1080,
|
|
550
|
+
deviceScaleFactor: 1
|
|
551
|
+
});
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### Geolocation
|
|
555
|
+
|
|
556
|
+
```javascript
|
|
557
|
+
// Set geolocation
|
|
558
|
+
await page.setGeolocation({
|
|
559
|
+
latitude: 37.7749,
|
|
560
|
+
longitude: -122.4194,
|
|
561
|
+
accuracy: 100
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
// Grant permissions
|
|
565
|
+
const context = browser.defaultBrowserContext();
|
|
566
|
+
await context.overridePermissions('https://example.com', ['geolocation']);
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
### Timezone & Locale
|
|
570
|
+
|
|
571
|
+
```javascript
|
|
572
|
+
// Set timezone
|
|
573
|
+
await page.emulateTimezone('America/New_York');
|
|
574
|
+
|
|
575
|
+
// Set locale
|
|
576
|
+
await page.emulateMediaType('screen');
|
|
577
|
+
await page.evaluateOnNewDocument(() => {
|
|
578
|
+
Object.defineProperty(navigator, 'language', {
|
|
579
|
+
get: () => 'en-US'
|
|
580
|
+
});
|
|
581
|
+
});
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
---
|
|
585
|
+
|
|
586
|
+
## Performance
|
|
587
|
+
|
|
588
|
+
### CPU & Network Throttling
|
|
589
|
+
|
|
590
|
+
```javascript
|
|
591
|
+
// CPU throttling
|
|
592
|
+
const client = await page.createCDPSession();
|
|
593
|
+
await client.send('Emulation.setCPUThrottlingRate', { rate: 4 });
|
|
594
|
+
|
|
595
|
+
// Network throttling
|
|
596
|
+
await page.emulateNetworkConditions({
|
|
597
|
+
offline: false,
|
|
598
|
+
downloadThroughput: 1.5 * 1024 * 1024 / 8, // 1.5 Mbps
|
|
599
|
+
uploadThroughput: 750 * 1024 / 8, // 750 Kbps
|
|
600
|
+
latency: 40 // 40ms RTT
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
// Predefined profiles
|
|
604
|
+
await page.emulateNetworkConditions(
|
|
605
|
+
puppeteer.networkConditions['Fast 3G']
|
|
606
|
+
);
|
|
607
|
+
|
|
608
|
+
// Disable throttling
|
|
609
|
+
await page.emulateNetworkConditions({
|
|
610
|
+
offline: false,
|
|
611
|
+
downloadThroughput: -1,
|
|
612
|
+
uploadThroughput: -1,
|
|
613
|
+
latency: 0
|
|
614
|
+
});
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
### Performance Metrics
|
|
618
|
+
|
|
619
|
+
```javascript
|
|
620
|
+
// Get metrics
|
|
621
|
+
const metrics = await page.metrics();
|
|
622
|
+
console.log(metrics);
|
|
623
|
+
// {
|
|
624
|
+
// Timestamp, Documents, Frames, JSEventListeners,
|
|
625
|
+
// Nodes, LayoutCount, RecalcStyleCount,
|
|
626
|
+
// LayoutDuration, RecalcStyleDuration,
|
|
627
|
+
// ScriptDuration, TaskDuration,
|
|
628
|
+
// JSHeapUsedSize, JSHeapTotalSize
|
|
629
|
+
// }
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
### Performance Tracing
|
|
633
|
+
|
|
634
|
+
```javascript
|
|
635
|
+
// Start tracing
|
|
636
|
+
await page.tracing.start({
|
|
637
|
+
path: 'trace.json',
|
|
638
|
+
categories: [
|
|
639
|
+
'devtools.timeline',
|
|
640
|
+
'disabled-by-default-devtools.timeline'
|
|
641
|
+
]
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
// Navigate
|
|
645
|
+
await page.goto('https://example.com');
|
|
646
|
+
|
|
647
|
+
// Stop tracing
|
|
648
|
+
await page.tracing.stop();
|
|
649
|
+
|
|
650
|
+
// Analyze trace in chrome://tracing
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
### Coverage (Code Usage)
|
|
654
|
+
|
|
655
|
+
```javascript
|
|
656
|
+
// Start JS coverage
|
|
657
|
+
await page.coverage.startJSCoverage();
|
|
658
|
+
|
|
659
|
+
// Start CSS coverage
|
|
660
|
+
await page.coverage.startCSSCoverage();
|
|
661
|
+
|
|
662
|
+
// Navigate
|
|
663
|
+
await page.goto('https://example.com');
|
|
664
|
+
|
|
665
|
+
// Stop and get coverage
|
|
666
|
+
const jsCoverage = await page.coverage.stopJSCoverage();
|
|
667
|
+
const cssCoverage = await page.coverage.stopCSSCoverage();
|
|
668
|
+
|
|
669
|
+
// Calculate unused bytes
|
|
670
|
+
let totalBytes = 0;
|
|
671
|
+
let usedBytes = 0;
|
|
672
|
+
for (const entry of [...jsCoverage, ...cssCoverage]) {
|
|
673
|
+
totalBytes += entry.text.length;
|
|
674
|
+
for (const range of entry.ranges) {
|
|
675
|
+
usedBytes += range.end - range.start - 1;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
console.log(`Used: ${usedBytes / totalBytes * 100}%`);
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
---
|
|
683
|
+
|
|
684
|
+
## Common Patterns
|
|
685
|
+
|
|
686
|
+
### Wait for Elements
|
|
687
|
+
|
|
688
|
+
```javascript
|
|
689
|
+
// Wait for selector
|
|
690
|
+
await page.waitForSelector('.element', {
|
|
691
|
+
visible: true,
|
|
692
|
+
timeout: 5000
|
|
693
|
+
});
|
|
694
|
+
|
|
695
|
+
// Wait for XPath
|
|
696
|
+
await page.waitForXPath('//button[text()="Submit"]');
|
|
697
|
+
|
|
698
|
+
// Wait for function
|
|
699
|
+
await page.waitForFunction(
|
|
700
|
+
() => document.querySelector('.loading') === null,
|
|
701
|
+
{ timeout: 10000 }
|
|
702
|
+
);
|
|
703
|
+
|
|
704
|
+
// Wait for timeout
|
|
705
|
+
await page.waitForTimeout(2000);
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
### Handle Dialogs
|
|
709
|
+
|
|
710
|
+
```javascript
|
|
711
|
+
// Alert, confirm, prompt
|
|
712
|
+
page.on('dialog', async (dialog) => {
|
|
713
|
+
console.log(dialog.type(), dialog.message());
|
|
714
|
+
|
|
715
|
+
// Accept
|
|
716
|
+
await dialog.accept();
|
|
717
|
+
// or reject
|
|
718
|
+
// await dialog.dismiss();
|
|
719
|
+
// or provide input for prompt
|
|
720
|
+
// await dialog.accept('input text');
|
|
721
|
+
});
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
### Handle Downloads
|
|
725
|
+
|
|
726
|
+
```javascript
|
|
727
|
+
// Set download path
|
|
728
|
+
const client = await page.createCDPSession();
|
|
729
|
+
await client.send('Page.setDownloadBehavior', {
|
|
730
|
+
behavior: 'allow',
|
|
731
|
+
downloadPath: '/path/to/downloads'
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
// Trigger download
|
|
735
|
+
await page.click('a[download]');
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
### Multiple Pages (Tabs)
|
|
739
|
+
|
|
740
|
+
```javascript
|
|
741
|
+
// Listen for new pages
|
|
742
|
+
browser.on('targetcreated', async (target) => {
|
|
743
|
+
if (target.type() === 'page') {
|
|
744
|
+
const newPage = await target.page();
|
|
745
|
+
console.log('New page opened:', newPage.url());
|
|
746
|
+
}
|
|
747
|
+
});
|
|
748
|
+
|
|
749
|
+
// Click link that opens new tab
|
|
750
|
+
const [newPage] = await Promise.all([
|
|
751
|
+
new Promise(resolve => browser.once('targetcreated', target => resolve(target.page()))),
|
|
752
|
+
page.click('a[target="_blank"]')
|
|
753
|
+
]);
|
|
754
|
+
|
|
755
|
+
console.log('New page URL:', newPage.url());
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
### Frames (iframes)
|
|
759
|
+
|
|
760
|
+
```javascript
|
|
761
|
+
// Get all frames
|
|
762
|
+
const frames = page.frames();
|
|
763
|
+
|
|
764
|
+
// Find frame by name
|
|
765
|
+
const frame = page.frames().find(f => f.name() === 'myframe');
|
|
766
|
+
|
|
767
|
+
// Find frame by URL
|
|
768
|
+
const frame = page.frames().find(f => f.url().includes('example.com'));
|
|
769
|
+
|
|
770
|
+
// Main frame
|
|
771
|
+
const mainFrame = page.mainFrame();
|
|
772
|
+
|
|
773
|
+
// Interact with frame
|
|
774
|
+
await frame.click('.button');
|
|
775
|
+
await frame.type('#input', 'text');
|
|
776
|
+
```
|
|
777
|
+
|
|
778
|
+
### Infinite Scroll
|
|
779
|
+
|
|
780
|
+
```javascript
|
|
781
|
+
async function autoScroll(page) {
|
|
782
|
+
await page.evaluate(async () => {
|
|
783
|
+
await new Promise((resolve) => {
|
|
784
|
+
let totalHeight = 0;
|
|
785
|
+
const distance = 100;
|
|
786
|
+
const timer = setInterval(() => {
|
|
787
|
+
const scrollHeight = document.body.scrollHeight;
|
|
788
|
+
window.scrollBy(0, distance);
|
|
789
|
+
totalHeight += distance;
|
|
790
|
+
|
|
791
|
+
if (totalHeight >= scrollHeight) {
|
|
792
|
+
clearInterval(timer);
|
|
793
|
+
resolve();
|
|
794
|
+
}
|
|
795
|
+
}, 100);
|
|
796
|
+
});
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
await autoScroll(page);
|
|
801
|
+
```
|
|
802
|
+
|
|
803
|
+
### Cookies
|
|
804
|
+
|
|
805
|
+
```javascript
|
|
806
|
+
// Get cookies
|
|
807
|
+
const cookies = await page.cookies();
|
|
808
|
+
|
|
809
|
+
// Set cookies
|
|
810
|
+
await page.setCookie({
|
|
811
|
+
name: 'session',
|
|
812
|
+
value: 'abc123',
|
|
813
|
+
domain: 'example.com',
|
|
814
|
+
path: '/',
|
|
815
|
+
httpOnly: true,
|
|
816
|
+
secure: true,
|
|
817
|
+
sameSite: 'Strict'
|
|
818
|
+
});
|
|
819
|
+
|
|
820
|
+
// Delete cookies
|
|
821
|
+
await page.deleteCookie({ name: 'session' });
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
### Local Storage
|
|
825
|
+
|
|
826
|
+
```javascript
|
|
827
|
+
// Set localStorage
|
|
828
|
+
await page.evaluate(() => {
|
|
829
|
+
localStorage.setItem('key', 'value');
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
// Get localStorage
|
|
833
|
+
const value = await page.evaluate(() => {
|
|
834
|
+
return localStorage.getItem('key');
|
|
835
|
+
});
|
|
836
|
+
|
|
837
|
+
// Clear localStorage
|
|
838
|
+
await page.evaluate(() => localStorage.clear());
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
### Error Handling
|
|
842
|
+
|
|
843
|
+
```javascript
|
|
844
|
+
try {
|
|
845
|
+
await page.goto('https://example.com', {
|
|
846
|
+
waitUntil: 'networkidle2',
|
|
847
|
+
timeout: 30000
|
|
848
|
+
});
|
|
849
|
+
} catch (error) {
|
|
850
|
+
if (error.name === 'TimeoutError') {
|
|
851
|
+
console.error('Page load timeout');
|
|
852
|
+
} else {
|
|
853
|
+
console.error('Navigation failed:', error);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// Take screenshot on error
|
|
857
|
+
await page.screenshot({ path: 'error.png' });
|
|
858
|
+
}
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
### Stealth Mode (Avoid Detection)
|
|
862
|
+
|
|
863
|
+
```javascript
|
|
864
|
+
// Hide automation indicators
|
|
865
|
+
await page.evaluateOnNewDocument(() => {
|
|
866
|
+
// Override navigator.webdriver
|
|
867
|
+
Object.defineProperty(navigator, 'webdriver', {
|
|
868
|
+
get: () => false
|
|
869
|
+
});
|
|
870
|
+
|
|
871
|
+
// Mock chrome object
|
|
872
|
+
window.chrome = {
|
|
873
|
+
runtime: {}
|
|
874
|
+
};
|
|
875
|
+
|
|
876
|
+
// Mock permissions
|
|
877
|
+
const originalQuery = window.navigator.permissions.query;
|
|
878
|
+
window.navigator.permissions.query = (parameters) => (
|
|
879
|
+
parameters.name === 'notifications' ?
|
|
880
|
+
Promise.resolve({ state: 'granted' }) :
|
|
881
|
+
originalQuery(parameters)
|
|
882
|
+
);
|
|
883
|
+
});
|
|
884
|
+
|
|
885
|
+
// Set realistic user agent
|
|
886
|
+
await page.setUserAgent(
|
|
887
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
|
888
|
+
);
|
|
889
|
+
```
|
|
890
|
+
|
|
891
|
+
---
|
|
892
|
+
|
|
893
|
+
## Debugging Tips
|
|
894
|
+
|
|
895
|
+
### Take Screenshots on Error
|
|
896
|
+
|
|
897
|
+
```javascript
|
|
898
|
+
page.on('pageerror', async (error) => {
|
|
899
|
+
console.error('Page error:', error);
|
|
900
|
+
await page.screenshot({ path: `error-${Date.now()}.png` });
|
|
901
|
+
});
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
### Console Logging
|
|
905
|
+
|
|
906
|
+
```javascript
|
|
907
|
+
// Forward console to Node
|
|
908
|
+
page.on('console', (msg) => {
|
|
909
|
+
console.log('PAGE LOG:', msg.text());
|
|
910
|
+
});
|
|
911
|
+
```
|
|
912
|
+
|
|
913
|
+
### Slow Down Execution
|
|
914
|
+
|
|
915
|
+
```javascript
|
|
916
|
+
const browser = await puppeteer.launch({
|
|
917
|
+
slowMo: 250 // 250ms delay between actions
|
|
918
|
+
});
|
|
919
|
+
```
|
|
920
|
+
|
|
921
|
+
### Keep Browser Open
|
|
922
|
+
|
|
923
|
+
```javascript
|
|
924
|
+
const browser = await puppeteer.launch({
|
|
925
|
+
headless: false,
|
|
926
|
+
devtools: true
|
|
927
|
+
});
|
|
928
|
+
|
|
929
|
+
// Prevent auto-close
|
|
930
|
+
await page.evaluate(() => debugger);
|
|
931
|
+
```
|
|
932
|
+
|
|
933
|
+
---
|
|
934
|
+
|
|
935
|
+
## Best Practices
|
|
936
|
+
|
|
937
|
+
1. **Always close browser:** Use try/finally or process cleanup
|
|
938
|
+
2. **Wait appropriately:** Use waitForSelector, not setTimeout
|
|
939
|
+
3. **Handle errors:** Wrap navigation in try/catch
|
|
940
|
+
4. **Optimize selectors:** Use specific selectors for reliability
|
|
941
|
+
5. **Avoid race conditions:** Wait for navigation after clicks
|
|
942
|
+
6. **Reuse pages:** Don't create new pages unnecessarily
|
|
943
|
+
7. **Set timeouts:** Always specify reasonable timeouts
|
|
944
|
+
8. **Clean up:** Close unused pages and contexts
|
|
945
|
+
|
|
946
|
+
---
|
|
947
|
+
|
|
948
|
+
## Resources
|
|
949
|
+
|
|
950
|
+
- [Puppeteer Documentation](https://pptr.dev/)
|
|
951
|
+
- [Puppeteer API](https://pptr.dev/api)
|
|
952
|
+
- [Puppeteer Examples](https://github.com/puppeteer/puppeteer/tree/main/examples)
|
|
953
|
+
- [Awesome Puppeteer](https://github.com/transitive-bullshit/awesome-puppeteer)
|