- 技術 💻
Chrome DevToolsの使い方|デバッグ手順と便利機能一覧
Chrome DevTools(デベロッパーツール)とは、Chromeに標準で入っている、Webページの HTML・CSS・JavaScript・通信・保存データをその場で調べて書き換えられる開発用ツールです。 F12 キー(Mac は Command + Option + I)で開けます。
この記事では、まず「どのパネルで何ができるか」「よく使うショートカット」「Console で使える便利関数」を早見表でまとめます。そのうえで、コピペで動くバグ入りサンプルを用意し、ブレークポイント → 条件付きブレークポイント → ログポイント → Watch → Call Stack → fetch ブレークポイント → DOM 変更ブレークポイントの順に、原因を特定するまでの手順を番号付きで説明します。各手順で DevTools に表示される値は、Playwright から Chrome DevTools Protocol(CDP:DevTools が内部で使っている通信の仕組み)を呼び出して実際に取得した値を載せています。
Chrome DevToolsの早見表
パネル一覧と用途
| パネル | 主な用途 | こんなときに開く |
|---|---|---|
| Elements | DOM ツリーと CSS の確認・その場で編集 | レイアウト崩れ、効いていない CSS を調べる |
| Console | ログの確認、JavaScript をその場で実行 | エラーの確認、値の確認、ちょっとした検証 |
| Sources | JS のブレークポイント、ステップ実行、ファイル編集 | 処理の流れと変数の値を追う |
| Network | 通信の一覧・中身・時間、スロットリング、ブロック | API の失敗、遅い読み込み、キャッシュの確認 |
| Application | Local/Session Storage、IndexedDB、Cookie、Service Worker、Cache | ログイン状態や保存データ、PWA の確認 |
| Performance | 読み込み・操作の処理時間をタイムラインで記録 | 画面がもたつく原因を探す |
| Memory | ヒープスナップショット、メモリ割り当ての記録 | メモリが増え続ける原因を探す |
| Lighthouse | 性能・アクセシビリティ・SEO などの自動診断 | 改善点を一覧で知りたい |
| Recorder | 操作を記録して再生、Puppeteer スクリプトとして書き出し | 再現手順を共有したい |
| Security / Privacy and security | 証明書、混在コンテンツの確認 | HTTPS まわりの確認 |
| デバイスモード(Ctrl + Shift + M) | 画面サイズ・タッチ・端末のエミュレーション | スマホ表示の確認 |
ショートカット一覧(Windows / Mac)
| 操作 | Windows / Linux | Mac |
|---|---|---|
| DevTools を開く・閉じる | F12 または Ctrl + Shift + I | Command + Option + I |
| Console を開く | Ctrl + Shift + J | Command + Option + J |
| 要素を選択(検証モード) | Ctrl + Shift + C | Command + Shift + C |
| コマンドメニュー | Ctrl + Shift + P | Command + Shift + P |
| ファイルを開く(Sources) | Ctrl + P | Command + P |
| 全ファイルを検索 | Ctrl + Shift + F | Command + Option + F |
| 行へ移動 | Ctrl + G | Control + G |
| デバイスモード切替 | Ctrl + Shift + M | Command + Shift + M |
| ブレークポイント設定・解除 | Ctrl + B(または行番号クリック) | Command + B |
| 一時停止 / 再開 | F8 または Ctrl + \ | F8 または Command + \ |
| ステップオーバー(次の行) | F10 または Ctrl + ' | F10 または Command + ' |
| ステップイン(関数の中へ) | F11 または Ctrl + ; | F11 または Command + ; |
| ステップアウト(関数の外へ) | Shift + F11 | Shift + F11 または Command + Shift + ; |
| すべてのブレークポイントを無効化 | Ctrl + F8 | Command + F8 |
| Console をクリア | Ctrl + L | Command + K |
| キャッシュを無視して再読み込み | Ctrl + Shift + R | Command + Shift + R |
Consoleユーティリティ一覧(Console でだけ使える便利関数)
| 書き方 | 何をするか | 使い方の例 |
|---|---|---|
$0 〜 $4 |
Elements で直近に選択した要素($0 が最新) | $0.textContent |
$_ |
直前に評価した式の値 | $_ * 2 |
$(セレクタ) |
document.querySelector の短縮形 |
$('#total') |
$$(セレクタ) |
querySelectorAll の結果を配列で返す |
$$('li').length |
$x(XPath) |
XPath で要素を配列取得 | $x('//button') |
copy(値) |
値をクリップボードにコピー(オブジェクトは JSON 文字列) | copy(cart) |
table(配列) |
表形式で表示(console.table と同じ) |
table(cart) |
monitorEvents(要素, 種類) |
イベント発生をログ出力 | monitorEvents($0, 'click') |
unmonitorEvents(要素) |
上記の停止 | unmonitorEvents($0) |
getEventListeners(要素) |
登録済みイベントリスナーを一覧 | getEventListeners($('#calc')) |
debug(関数) |
関数が呼ばれたら自動で一時停止 | debug(calcTotal) |
undebug(関数) |
上記の解除 | undebug(calcTotal) |
monitor(関数) |
関数の呼び出しと引数をログ出力 | monitor(render) |
inspect(要素) |
Elements でその要素を表示 | inspect($('#list')) |
keys(obj) / values(obj) |
キー / 値の配列 | keys(cart[0]) |
queryObjects(コンストラクタ) |
そのクラスのインスタンスを列挙 | queryObjects(Promise) |
clear() |
Console をクリア | clear() |
これらは Console(と DevTools の評価)専用の機能で、ページの JavaScript ファイルの中では使えません。 コードに書くと ReferenceError になります。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Chrome DevToolsの使い方|デバッグ手順と便利機能一覧」
DevToolsを開く方法と最初の設定
開き方は3通りあります。 キーボード(F12 / Command + Option + I)、ページを右クリックして「検証」、Chrome メニュー →「その他のツール」→「デベロッパー ツール」です。
最初に整えておくと便利な設定です(右上の歯車アイコン → Preferences)。
| 設定 | 場所 | 効果 |
|---|---|---|
| 表示言語 | Preferences → Appearance → Language | 日本語 / English を切り替え(検索で情報を探すなら英語表示も便利) |
| 配置 | 右上の︙ → Dock side | 右・下・左・別ウィンドウ |
| テーマ | Preferences → Appearance → Theme | ライト / ダーク |
| キャッシュ無効 | Network パネル上部の Disable cache | DevTools を開いている間だけキャッシュを使わない |
| ログ保持 | Console 設定の Preserve log | ページ遷移してもログを残す |
迷ったらコマンドメニュー(Ctrl + Shift + P)で機能名を入力するのが最短です。 「screenshot」「disable javascript」「coverage」などと打てば、メニューを探さずに呼び出せます。
コピペで動くバグ入りサンプルを用意する
ここからは、わざとバグを入れた「カート合計」ページでデバッグの流れを体験します。3ファイルを同じフォルダに保存し、ローカルサーバーで開いてください(fetch は file:// で開くと動かないため)。
index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>カート合計デモ</title>
<style>
body { font-family: sans-serif; margin: 2rem; }
.item { display: flex; gap: 1rem; }
.sale { color: #c00; } /* 使われないルール(Coverage確認用) */
#total { font-weight: bold; }
</style>
</head>
<body>
<h1>カート合計デモ</h1>
<ul id="list"></ul>
<label>送料 <input id="fee" type="number" value="500"></label>
<button id="calc">合計を計算</button>
<p>合計: <span id="total">-</span> 円</p>
<script src="app.js"></script>
</body>
</html>
app.js(行番号は下の手順で使います。1行目がコメントです)
// カート合計デモ(わざとバグ入り)
let cart = [];
async function loadItems() {
const res = await fetch('items.json');
const items = await res.json();
console.log('items loaded:', items.length);
return items;
}
function render(items) {
const list = document.getElementById('list');
list.innerHTML = '';
for (const item of items) {
const li = document.createElement('li');
li.className = 'item';
li.textContent = `${item.name} ${item.price}円 × ${item.qty}`;
list.appendChild(li);
}
}
function calcTotal(items) {
let total = 0;
for (const item of items) {
const line = item.price * item.qty;
total += line;
}
const fee = document.getElementById('fee').value; // ← 文字列のまま
return total + fee; // ← バグ: 文字列連結になる
}
function onCalcClick() {
const total = calcTotal(cart);
document.getElementById('total').textContent = total;
console.log('total =', total, typeof total);
}
function unusedHelper() { // 使われない関数(Coverage確認用)
return cart.map((i) => i.name).join(',');
}
document.getElementById('calc').addEventListener('click', onCalcClick);
loadItems().then((items) => { cart = items; render(items); });
items.json
[
{ "name": "ノート", "price": 300, "qty": 2 },
{ "name": "ボールペン", "price": 150, "qty": 4 },
{ "name": "付箋", "price": 200, "qty": 1 }
]
起動コマンド(Python 3 が入っていれば追加インストール不要です)
python3 -m http.server 7840
# ブラウザで http://localhost:7840/index.html を開く
「合計を計算」を押すと、期待値は 600 + 600 + 200 + 送料500 = 1900 円です。ところが実際の表示はこうなります(Chromium 141 で確認)。
#total = 1400500
[log] items loaded: 3
[log] total = 1400500 string
合計が「1400500」という文字列になっています。 ここから DevTools で原因を追っていきます。
ブレークポイントでバグの原因を特定する手順
手順1:通常のブレークポイントで止めて値を見る
- DevTools を開き、Sources パネルを選びます。
- Ctrl + P(Mac は Command + P)で
app.jsと入力して開きます。 - 29行目
return total + fee;の行番号をクリックします。青いマーカーが付けばブレークポイントの設定完了です。 - ページの「合計を計算」を押します。29行目で処理が一時停止します。
- 右側の Scope(変数の一覧)で
totalとfeeを確認します。行内の変数にマウスを乗せても値が表示されます。
CDP で同じ位置に止めて値を評価した結果は次のとおりです。
paused: calcTotal line 29
total => 1400
fee => "500"
typeof fee => "string"
total + fee => "1400500"
total + Number(fee) => 1900
fee が "500"(文字列)なので、+ が足し算ではなく文字列の連結になっていた、と特定できます。<input> の value は type="number" でも常に文字列です。止まっている間は Console で total + Number(fee) のように直した式を試せるので、修正方針もその場で確かめられます。
ステップ実行の使い分けも押さえておきましょう。
| ボタン | キー | 動き | 使う場面 |
|---|---|---|---|
| Resume | F8 | 次のブレークポイントまで進む | 確認が終わった |
| Step over | F10 | 次の行へ(関数の中には入らない) | 1行ずつ値の変化を見る |
| Step into | F11 | 呼び出している関数の中へ入る | 呼び先が怪しい |
| Step out | Shift + F11 | 今の関数を抜けて呼び出し元へ | 関数の中の確認が済んだ |
| Step | F9 | 非同期処理も含めて次の文へ | await をまたいで追う |
手順2:条件付きブレークポイントで「特定のときだけ」止める
ループの中にブレークポイントを置くと、全件で止まって確認が大変です。条件付きブレークポイントなら、条件が true のときだけ止まります。
- 25行目
const line = item.price * item.qty;の行番号を右クリックします。 - 「Add conditional breakpoint(条件付きブレークポイントを追加)」を選びます。
- 条件に
item.qty > 1と入力して Enter を押します(マーカーがオレンジ色になります)。 - 「合計を計算」を押します。
実際に止まったのは次の2件だけでした。
conditional bp (item.qty > 1) hits: ["ノート qty=2","ボールペン qty=4"]
数量1の「付箋」では止まらないので、確認したいデータに絞り込めます。
手順3:ログポイントで「止めずに」値を出す
コードに console.log を書き足さずに、ログだけ出したいときはログポイントを使います。
- 26行目
total += line;の行番号を右クリックし、「Add logpoint(ログポイントを追加)」を選びます。 'line', item.name, lineと入力して Enter を押します(マーカーがピンク色になります)。- 「合計を計算」を押すと、処理は止まらずに Console に出力されます。
[log] line ノート 600
[log] line ボールペン 600
[log] line 付箋 200
[log] total = 1400500 string
1件ずつの小計(600・600・200)は正しく、合計 1400 までは数値で計算できていることがわかります。原因が最後の送料の加算に絞り込めました。ログポイントはソースファイルを変更しないので、確認後に消し忘れる心配もありません。
手順4:Watchで式を見張る
- Sources パネル右側の Watch を開き、「+」を押します。
typeof feeとtotal + Number(fee)を追加します。- 手順1と同じ29行目で止めると、Watch 欄に
"string"と1900が並びます。
Watch は「止まるたびに毎回確かめたい式」を登録しておく場所です。 Console の目のアイコン(Create live expression)を使うと、止めなくても常に評価し続ける「ライブ式」も作れます。
手順5:Call Stackで呼び出し元をたどる
29行目で止まっているとき、右側の Call Stack には次のように表示されます。
call stack: calcTotal <- onCalcClick
一番上が今いる関数、下に行くほど呼び出し元です。 onCalcClick をクリックすると、呼び出し元の行と、その時点の変数に切り替わります。「この関数に変な引数を渡しているのは誰か」を調べるときに使います。
手順6:fetchブレークポイントで通信の直前に止める
「どこから API を呼んでいるのかわからない」ときは、URL で止めます。
- Sources パネル右側の XHR/fetch Breakpoints を開き、「+」を押します。
items.jsonと入力します(URL にこの文字列を含む通信で止まります)。- ページを再読み込みします。
XHR {"breakpointURL":"items.json","url":"http://localhost:7840/items.json"} @ loadItems:5 <- (anonymous):43
loadItems の5行目(fetch('items.json'))で止まり、43行目から呼ばれていることがわかります。
手順7:DOM変更ブレークポイントで「誰が書き換えたか」を探す
画面の要素が知らないうちに変わるときは、要素側にブレークポイントを置きます。
- Elements パネルで
<ul id="list">を右クリックします。 - 「Break on」→「subtree modifications(サブツリーの変更)」を選びます。
- ページを再読み込みします。
DOM {"insertion":true,"type":"subtree-modified"} @ render:18 <- (anonymous):43
render 関数の18行目(list.appendChild(li))で止まります。 DOM ブレークポイントは3種類あります。
| 種類 | 止まるタイミング |
|---|---|
| subtree modifications | 子孫要素の追加・削除・変更 |
| attribute modifications | その要素の属性(class、style など)の変更 |
| node removal | その要素自体が削除されたとき |
修正する(直す前と後)
// 直す前
const fee = document.getElementById('fee').value;
return total + fee; // 1400 + "500" → "1400500"
// 直した後
const fee = document.getElementById('fee').valueAsNumber || 0;
return total + fee; // 1400 + 500 → 1900
valueAsNumber は数値型の <input> の値を数値で返します(空欄だと NaN になるため || 0 を付けています)。Number(...) で変換してもかまいません。
ほかの止め方の一覧
| 止め方 | 設定場所 | 向いている場面 |
|---|---|---|
debugger; 文 |
ソースコードに直接書く | DevTools で行を探しにくいとき(確認後に削除) |
debug(関数名) |
Console | 関数名はわかるがファイルを探すのが手間 |
| Event Listener Breakpoints | Sources 右側 | 「クリック時に動く処理」を丸ごと止めたい |
| Pause on exceptions | Sources 右側の Breakpoints 欄 | 例外が投げられた瞬間に止めたい(caught も選べる) |
| 一時停止ボタン(F8) | Sources 上部 | 無限ループなどで固まったとき |
ライブラリの中に入ってしまうときは、ファイルを右クリックして「Add script to ignore list」を選ぶと、ステップ実行でそのファイルを飛ばせます。
Consoleユーティリティの使い方と実行結果
サンプルページを開いた状態で、Console に入力した結果です(CDP の Runtime.evaluate に includeCommandLineAPI: true を付けて取得)。
$$('li').length = 3
$('#total').textContent = 1400500
Object.keys(getEventListeners($('#calc'))) = ["click"]
getEventListeners($('#calc')).click[0].listener.name = onCalcClick
getEventListeners で「このボタンを押すと onCalcClick が動く」とすぐわかります。 Elements パネルの「Event Listeners」タブでも同じ情報を見られます。
よく使う組み合わせです。
// 選択中の要素のクリックを監視(Elementsで要素を選んでから)
monitorEvents($0, 'click');
// 配列を表で見る → JSONでコピーしてエディタに貼る
table(cart);
copy(cart);
// calcTotal が呼ばれたら自動で停止
debug(calcTotal);
copy() は API の結果をテストデータとして保存したいときに便利です。 オブジェクトは整形された JSON 文字列としてコピーされます。
Networkパネルの便利機能
通信一覧の見方
サンプルを開いたときの通信は3件でした。
GET index.html (document)
GET app.js (script)
GET items.json (fetch)
Fetch/XHR フィルタで API 通信だけに絞り、行をクリックして Headers・Payload・Preview・Response・Timing タブを確認するのが基本の流れです。
よく使う機能の一覧
| 機能 | 操作 | 用途 |
|---|---|---|
| スロットリング | 上部の「No throttling」→ Fast 4G / Slow 4G / 3G / Offline / Custom | 回線が遅い環境の再現 |
| Preserve log | 上部のチェック | 画面遷移・リダイレクトをまたいで通信を残す |
| Disable cache | 上部のチェック | 毎回サーバーから取得(DevTools を開いている間だけ有効) |
| リクエストのブロック | 行を右クリック →「Block request URL」 | その通信が失敗したときの動きを確認 |
| Copy as cURL | 行を右クリック → Copy → Copy as cURL (bash / cmd) | ターミナルで同じ通信を再現 |
| Copy as fetch | 行を右クリック → Copy → Copy as fetch | Console に貼って同じ通信を再実行 |
| Copy response | 行を右クリック → Copy → Copy response | レスポンスをテストデータに使う |
| Override content | 行を右クリック →「Override content」 | レスポンスをローカルで書き換えて表示確認 |
| 検索 | Ctrl + F(Network 内) | ヘッダーやレスポンスに含まれる文字列を探す |
| フィルタ | status-code:404、domain:、- で除外など |
大量の通信から目的のものを探す |
スロットリングとブロックの効果(実測)
CDP の Network.emulateNetworkConditions で、キャッシュ無効にして一覧が表示されるまでの時間を測りました。
no throttling ms: 76
Slow 3G-like (400ms RTT, 50KB/s) ms: 1987
同じ3ファイルでも、遅延 400ms の回線では約2秒かかります。 通信を直列に待っている処理(HTML → JS → fetch)ほど遅延の影響が大きくなることが体感できます。
items.json をブロックした場合は次のとおりでした。
[pageerror] Failed to fetch
li count: 0
ブロックすると fetch が失敗し、エラーを受け止める処理がないので一覧が空のままになります。 「通信失敗時にメッセージを出す」などの改善点が、サーバー側を止めなくても確認できます。
Copy as cURL / Copy as fetch の使い分け
| 形式 | 貼る場所 | 向いている場面 |
|---|---|---|
| Copy as cURL (bash) | Mac / Linux / WSL のターミナル | API 担当者への再現手順の共有 |
| Copy as cURL (cmd) | Windows のコマンドプロンプト | Windows で再現 |
| Copy as fetch | DevTools の Console | ブラウザのログイン状態のまま再実行 |
| Copy as fetch (Node.js) | Node.js のスクリプト | 自動テストの下書き |
cURL には Cookie や認証ヘッダーが含まれることがあるので、共有する前に中身を確認しましょう。
Applicationパネルで保存データを確認する
| 項目 | 確認・操作できること |
|---|---|
| Local storage / Session storage | キーと値の一覧、ダブルクリックで編集、削除 |
| IndexedDB | データベース・オブジェクトストアの中身 |
| Cookies | 名前・値・Domain・Path・Expires・HttpOnly・Secure・SameSite の確認と編集 |
| Cache storage | Service Worker がキャッシュしたレスポンス |
| Service workers | 登録状況、Update on reload、Bypass for network、Offline、Unregister |
| Manifest | PWA のマニフェストとアイコン |
| Storage(Clear site data) | 使用量の確認と、保存データの一括削除 |
「ログイン状態がおかしい」「古い画面が出る」ときは、Application → Storage → Clear site data で一度まっさらにするのが近道です。 Service Worker を使うサイトで修正が反映されないときは、Service workers の「Update on reload」をオンにして再読み込みすると、新しいワーカーがすぐ有効になります。
Cookie の確認ポイントです。
| 列 | 意味 | 確認すること |
|---|---|---|
| HttpOnly | JavaScript から読めない | document.cookie に出なくても正常 |
| Secure | HTTPS のみ送信 | http の開発環境では送られない |
| SameSite | 別サイトからの送信制御 | Lax / Strict / None(None は Secure 必須) |
| Partition Key | 分割された Cookie の区分 | 埋め込み先ごとに別扱いになる |
Coverageで使われていないコードを見つける
コマンドメニュー(Ctrl + Shift + P)で「coverage」と入力し、「Show Coverage」を開いて記録ボタンを押すと、読み込んだ JS・CSS のうち実行・適用されなかった部分が赤く表示されます。
サンプルで「合計を計算」まで操作したときの結果です(Playwright の Coverage API で取得)。
JS app.js: total 1176 bytes, unused(approx) 97 bytes
JS 未実行の関数: unusedHelper
CSS inline: total 193 bytes, used 111 bytes
未使用の関数 unusedHelper と、未使用の .sale ルールが検出されています。 ただし「その操作で使われなかった」だけなので、別の画面で使うコードを消さないよう、操作を変えて何度か確認しましょう。
PlaywrightでDevToolsの値を自動で取得する
DevTools の画面で見ている値の多くは、Chrome DevTools Protocol(CDP)を通じてプログラムからも取得できます。 本記事の数値は、次のスクリプトで取得しました(Node.js 22、playwright 1.56、同梱 Chromium 141 で確認)。
npm install playwright@1.56
npx playwright install chromium # ブラウザ未導入の場合のみ
// probe.mjs(サンプルを http://localhost:7840 で配信した状態で node probe.mjs)
import { chromium } from 'playwright';
const browser = await chromium.launch();
const page = await browser.newPage();
const logs = [];
page.on('console', (m) => logs.push(`[${m.type()}] ${m.text()}`));
let requestCount = 0;
page.on('request', () => requestCount++);
await page.coverage.startJSCoverage();
await page.goto('http://localhost:7840/index.html');
await page.waitForSelector('#list li');
await page.click('#calc');
const js = await page.coverage.stopJSCoverage();
console.log('#total =', await page.textContent('#total'));
console.log('requests =', requestCount);
logs.forEach((l) => console.log(l));
const app = js.find((e) => e.url.endsWith('app.js'));
console.log('未実行の関数:', app.functions
.filter((f) => f.ranges[0].count === 0).map((f) => f.functionName).join(', '));
// Consoleユーティリティを CDP 経由で評価
const cdp = await page.context().newCDPSession(page);
const r = await cdp.send('Runtime.evaluate', {
expression: "getEventListeners($('#calc')).click[0].listener.name",
includeCommandLineAPI: true, returnByValue: true,
});
console.log('click listener =', r.result.value);
// 29行目にブレークポイントを置き、止まった時点の fee を評価
await cdp.send('Debugger.enable');
await cdp.send('Debugger.setBreakpointByUrl', { urlRegex: '.*app\\.js$', lineNumber: 28 });
const paused = new Promise((res) => cdp.once('Debugger.paused', res));
page.click('#calc');
const p = await paused;
const v = await cdp.send('Debugger.evaluateOnCallFrame', {
callFrameId: p.callFrames[0].callFrameId, expression: 'typeof fee', returnByValue: true,
});
console.log('typeof fee =', v.result.value);
await cdp.send('Debugger.resume');
await browser.close();
実行結果です。
#total = 1400500
requests = 3
[log] items loaded: 3
[log] total = 1400500 string
未実行の関数: unusedHelper
click listener = onCalcClick
typeof fee = string
CDP の lineNumber は0始まりなので、29行目は 28 を指定します。 同じ仕組みで Network.setBlockedURLs(ブロック)、Network.emulateNetworkConditions(スロットリング)、Performance.getMetrics(DOM ノード数など)も呼び出せます。E2E テスト全般の書き方は Playwright 入門の記事で詳しく扱っています。
最新のChrome DevToolsの新機能
公式ブログ「What's new in DevTools」で確認できた範囲をまとめます(2026年10月1日時点)。
| 公開 | 対象 | 主な新機能 |
|---|---|---|
| 2026年8月25日 | Chrome 152 | Network で fetch / XHR リクエストの再送、バイナリのペイロードを Base64・Hex・UTF-8 で表示、Console の表を Markdown / CSV で書き出し、擬似要素を $0 で参照 |
| 2026年9月22日 | Chrome 153・154(New in DevTools - October 2026) | Network の「Edit and resend as fetch」(Console に fetch 式を自動入力)、Elements で適用されなくなった CSS ルールの表示、デバイスモードのプリセットをフォームファクタ別に整理、Application パネルの Ads セクション、Performance のソフトナビゲーション計測 |
コーディングエージェント向けの「Chrome DevTools MCP サーバー」も継続的に機能が追加されています。 新機能は DevTools を開いたときの「What's new」タブにも表示されます。
よくある質問
Q. DevToolsでページを書き換えたら、元のファイルも変わりますか? A. 変わりません。再読み込みすると元に戻ります。変更を残したいときは、Sources →「Overrides」でローカルフォルダを指定するか、「Workspace」で作業フォルダを紐付けると、編集内容をファイルに保存できます。
Q. ブレークポイントを置いたのに止まりません。 A. ①その行が実際に実行されているか(ログポイントで確認)、②「Deactivate breakpoints」(Ctrl + F8)が有効になっていないか、③ビルド後のファイルとソースマップの対応がずれていないか、を順に確認しましょう。行番号のマーカーが灰色の場合は、そのブレークポイントが無効化されています。
Q. ページ遷移するとConsoleやNetworkの記録が消えます。 A. Console の設定と Network パネル上部にある Preserve log をオンにすると、遷移後も記録が残ります。フォーム送信後のリダイレクトを調べるときに必須の設定です。
Q. 本番サイトの圧縮されたJSを読みやすくできますか?
A. Sources でファイルを開き、左下の {}(Pretty print)を押すと整形表示されます。ソースマップが公開されていれば、元のファイル名と行番号でブレークポイントを置けます。
まとめ
- Chrome DevToolsは F12(Mac は Command + Option + I)で開く、Chrome 標準の開発ツールです。
- パネルは目的で選ぶ:見た目は Elements、値の確認は Console、処理の流れは Sources、通信は Network、保存データは Application。
- デバッグは「ブレークポイント → 条件付き → ログポイント → Watch → Call Stack」の順に絞り込むと、原因に早くたどり着けます。
- fetch ブレークポイントと DOM 変更ブレークポイントで「誰が呼んだか・誰が書き換えたか」を逆にたどれます。
- Console ユーティリティ(
$$・copy()・getEventListeners・debug()など)で調査の手数が減ります。 - Network のスロットリング・ブロック・Copy as cURL / fetch で、失敗時や遅い回線の動きを再現できます。
- CDP を使えば、DevTools で見ている値を Playwright から自動で取得できます。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Chrome DevToolsの使い方|デバッグ手順と便利機能一覧」
株式会社RJCでは、Chrome DevToolsを使ったデバッグの勘所を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。