mcpField
S
screenshot-local

screenshot-local

github.com/antjanus開発277 回インストール1 週間前に更新
リポジトリ

screenshot-local について

screenshot-localは、shot-scraperでローカル開発サーバーや静的HTMLを撮影するスキルです。YAMLによる再現可能な一括撮影を重視し、待機条件やセレクター、画像の確認も扱います。

主な機能

  1. 01ページや指定要素の撮影
  2. 02YAMLによる一括撮影
  3. 03ページのPDF出力
  4. 04ログインセッションの保存と再利用
  5. 05アクセシビリティツリーの確認

活用シーン

  1. 01ローカルアプリ画面の記録
  2. 02再現可能なスクリーンショットの生成
  3. 03認証が必要なページの撮影
  4. 04CIでのページ表示確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/antjanus/skillbox --skill screenshot-local

インストール後、Claude Code で/screenshot-localを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

reference/
CI-INTEGRATION.md
COMMAND-REFERENCE.md
EVAL.md
TEMPLATES.md

詳細

スクリーンショットのローカル撮影 — shot-scraper

概要

shot-scraperを使って、ローカルの開発サーバーや静的HTMLファイルのスクリーンショットを撮影します。shot-scraperはpipxでインストールするPlaywrightラッパーです。複数の画像を扱う場合は、単発のコマンドよりも、コミット済みのshots.ymlを優先してください。リポジトリから再生成できるキャプチャは最新の状態を保てますが、手動で撮影したものはUIが変更された時点で古くなります。

インストール

pipx install shot-scraper     # brew install pipx / apt install pipx first
shot-scraper install          # downloads Chromium
shot-scraper --version

インストール後にcommand not foundと表示される場合、pipxがPATHに含まれていません。pipx ensurepathを実行してから、シェルを再度開いてください。

コマンド一覧

サブコマンド用途
shot-scraper URLスクリーンショットを1枚撮影
shot-scraper multi shots.ymlYAMLから一括撮影
shot-scraper pdf URLPDFとしてエクスポート
shot-scraper auth URL auth.json再利用するログインセッションを保存
shot-scraper accessibility URLアクセシビリティツリーをJSONとして出力
フラグ用途
-o出力ファイル名(標準出力には-)
-w / -hビューポートの幅/高さ。ページ全体を撮影する場合は-hを省略
-s / --selector-all一致する最初の要素/すべての要素を撮影
-pセレクターの周囲の余白(px)
--retinaデバイスのピクセル比を2倍に設定
--quality N品質NでJPEGとして保存
--wait N / --wait-for "expr"Nミリ秒間待機/JavaScript式が真になるまで待機
-j "js"撮影前にJSを実行。モーダルを閉じる、状態を設定するなど
-a auth.json保存済みの認証コンテキストを再利用
-i / --devtools撮影を対話的にデバッグするため、ブラウザーを開く

すべてのフラグとYAMLキーについては、**reference/COMMAND-REFERENCE.md**を参照してください。上流のドキュメント:https://shot-scraper.datasette.io/.

ユーザーから指定がない場合に使う寸法:

用途幅高さ
READMEのヒーロー画像1280800
ドキュメントのスクリーンショット1200省略(ページ全体)
ソーシャル/OG画像1200630
モバイル/タブレット375 / 768812 / 1024

実行例

単発の撮影:

shot-scraper http://localhost:3000 -o homepage.png
shot-scraper index.html -o preview.png
shot-scraper http://localhost:3000 -w 1200 -h 630 -o og.png
shot-scraper http://localhost:3000 -s ".hero" -p 20 --retina -o [email protected]
shot-scraper http://localhost:3000 --wait-for "document.querySelector('.loaded')" -o app.png

プロジェクトのスクリーンショットを設定するには、ルーター設定、ページファイル、またはナビゲーションを確認して実際のルートと開発サーバーのポートを特定し、記録する価値のある状態(空の状態より、内容が表示された状態が望ましい)を選びます。shots.ymlを作成してから、shot-scraper multi shots.ymlを実行してください。初回の実行では、タイミングやセレクターの調整が必要になることがあります。生成された画像を開き、意図したUIが表示されていることを確認してから、作業完了を報告してください。

✅ 寸法を明示し、SPAの待機処理を指定し、出力先をディレクトリにして、一時的なブラウザーUIを除去:

- url: http://localhost:3000
  output: screenshots/homepage.png
  width: 1280
  height: 800

- url: http://localhost:3000/dashboard
  output: screenshots/dashboard.png
  width: 1280
  height: 900
  wait: 2000
  javascript: |
    document.querySelector('.toast-notification')?.remove()

❌ ローディングスピナーを撮影し、マシンによって異なる自動生成ファイル名でリポジトリのルートに出力:

- url: http://localhost:3000/dashboard

✅ 寸法を固定したOG画像。-wと-hを両方指定し、--retinaは省略:

shot-scraper http://localhost:3000 -w 1200 -h 630 -o og.png

❌ 指定寸法に--retinaを使用すると、1200×630が必要な場所に2400×1260のファイルが出力されます。カードの表示が崩れるまで問題に気付けません:

shot-scraper http://localhost:3000 -w 1200 -h 630 --retina -o og.png

✅ ドキュメントのページ全体を撮影。コンテンツに合わせて高さが決まるよう、意図的に-hを省略:

shot-scraper http://localhost:3000/docs -w 1200 -o docs.png

❌ ドキュメントページで-hを固定すると、800pxより下がすべて切り取られ、欠けたセクションが最初から書かれていなかったように見えます:

shot-scraper http://localhost:3000/docs -w 1200 -h 800 -o docs.png

プロジェクトの種類別スターター設定(SPA、Storybook、レスポンシブ表示の一括撮影、静的サイト、認証)については、**reference/TEMPLATES.md**を参照してください。

失敗モード

  • 「Connection refused」 — そのポートで何も稼働していません。開発サーバーを起動し(npm run dev &)、curl -I http://localhost:3000で確認するか、ライフサイクルの管理をYAMLのserver:キーを通じてshot-scraperに任せてください。
  • ページが真っ白、または読み込み中のスピナーが表示される — 撮影時にSPAのハイドレーションが完了していませんでした。固定の--wait 3000よりも、--wait-for "document.querySelector('.content')"を使ってください。高速なノートPCで調整した固定待機時間では、低速なCIランナーで失敗するためです。
  • 画像が空、または別の要素が表示される — セレクターが何も見つけられなかったか、コンテンツが画面下部で遅延読み込みされています。別のセレクターを推測するのではなく、-iで再現して実際のページを確認してください。
  • 負荷の高いページでタイムアウトする — --timeout 30000に引き上げてください。デフォルトのタイムアウトは、Next.jsの開発サーバーが初回リクエストでルートをコンパイルする時間より短く設定されています。
  • ローカルでは成功するが、CIでは失敗する — ランナーでshot-scraper installが実行されておらず、ブラウザーエンジンがありません。CIの独立したステップとしてエンジンをインストールしてください。

注意点

  • shot-scraper installは、別途実行が必要な2つ目のステップです。 pipx install shot-scraperだけではブラウザーエンジンがインストールされないため、新しいマシンで最初のキャプチャが失敗します。
  • --qualityを指定すると、出力拡張子にかかわらず形式がJPEGになります。 --quality 80 -o hero.pngを実行すると、.pngという名前のファイルにJPEGデータが書き込まれます(1.9.1で確認済み)。正しいPNGが必要な場合は、--qualityを省略してください。
  • --retinaで2倍になるのは出力ピクセル数であり、レイアウトではありません。 -w 1200 --retinaを指定すると幅2400pxのファイルが生成され、1200×630のOG画像のような固定サイズの用途では問題になります。README用の画像には使えますが、仕様で寸法が決まっている画像には使わないでください。
  • shots.yml内のショットごとのauth:キーは無視されます。 ショット自体は成功しますが、ログアウト状態で実行されるため、認証情報の不足ではなくページの不具合のように見えます。代わりにバッチ全体に認証情報を渡してください:shot-scraper multi shots.yml -a auth.json。
  • -hを省略すると、高さがコンテンツに合わせて変わるため、同じルートを2回キャプチャしてもサイズが異なる場合があります。 変更前後を比較する場合は、明示的に-hを設定してください。
  • YAMLのserver:プロセスはmultiの実行全体にわたって稼働し、最後に停止します(--leave-serverを指定すると稼働を続けます)。 1つのserver:エントリーでバッチ全体をカバーします。ショットごとに繰り返しても、サーバーが追加で起動することはありません。
  • ページ全体のキャプチャでは、小さな問題を見落としやすくなります。 幅1200pxの画像を見て、12pxのラベル、コントラストの問題、セルのはみ出しを判断するのは推測にすぎません。-s <selector>(および-pのパディング)で領域をキャプチャするか、PNGを切り抜いてから確認してください。モデルは、拡大して確認できる領域で最も効果的に視覚的な作業を行います。
  • スクリーンショットはきれいに差分比較できません。 アンチエイリアスやフォントのレンダリングによってPNGの差分にノイズが生じるため、shot-scraperはドキュメント用の成果物に使い、リグレッションを検出する目的にはPercy、Chromatic、またはPlaywrightのtoHaveScreenshotを使ってください。

CI

GitHub Actionsのワークフローでソースの変更時にスクリーンショットを再生成し、変更をコミットして戻してください。ワークフロー全体、コスト管理、およびserver:キーのパターンについては、**reference/CI-INTEGRATION.md**を参照してください。

コメント