- 技術 💻
WebDriverとは|仕組み・ChromeDriverとバージョンエラーの直し方
結論
WebDriverとは、プログラムからブラウザを外から操作するためのW3Cの規格です。ブラウザごとの「ドライバー」が命令を受けて動かします。
この記事でわかること
- curlでHTTP APIを14回呼んで操作した実物
- ブラウザ4種のドライバーと入手先の一覧
- バージョン不一致などエラー原文7種と直し方
テストコードは、ブラウザに直接さわりません。ドライバーという小さなサーバーに HTTP で命令を送り、ドライバーがブラウザを動かして結果を返します。
flowchart TD
A[テストコード<br>Python・Java・JS など] --> B[Selenium などの<br>ライブラリ]
B -->|HTTP の JSON<br>または WebSocket| C[ドライバー<br>ChromeDriver など]
C -->|ブラウザ内部の<br>接続| D[ブラウザ<br>Chrome・Firefox など]
D -->|結果| C
C -->|JSON で返す| B
急いでいる人向けに、よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| WebDriver とは | ブラウザを外から動かす W3C の規格 | WebDriverとは |
| Selenium との関係 | Selenium は WebDriver を使うライブラリ | 仕組み |
| Chrome のドライバー | ChromeDriver(Chrome for Testing で配布) | ドライバー一覧 |
| Edge のドライバー | Microsoft Edge WebDriver(msedgedriver) | ドライバー一覧 |
| Firefox のドライバー | geckodriver(Mozilla) | ドライバー一覧 |
| ドライバーの入手 | Selenium 4.6 以降は Selenium Manager が自動で | Selenium Manager |
| session not created | ブラウザとドライバーの版をそろえる | バージョンが合わないエラー |
| navigator.webdriver | 自動操作中なら true | navigator.webdriver |
| Playwright との違い | WebDriver を使わず独自の接続で動かす | 違い表 |
確認環境:Ubuntu 24.04、ChromeDriver 147.0.7727.24 と Chromium 141.0.7390.37 を、手元の HTTP サーバー(Python 3.11.15 の http.server)に置いた練習ページで動かしました。curl で WebDriver の HTTP API を直接呼び、WebDriver BiDi は Node.js v22.22.2 の WebSocket で呼び、Selenium 4.51.0(Python、Selenium Manager 0.4.51)と playwright-core 1.56.1 からも同じ操作をしました。Chrome for Testing からの ChromeDriver 141 の取得は接続できなかったので、版の違うドライバーで実際に出たエラーと、ChromeDriver の --disable-build-check で版の確認を外して動かした結果を載せています。規格は W3C の WebDriver・WebDriver BiDi、各ドライバーは Chrome for Developers・Microsoft Learn・Microsoft Edge Developer・Mozilla(GitHub)・Apple Developer、Selenium は selenium.dev、navigator.webdriver は MDN、Puppeteer・Playwright はそれぞれの公式ドキュメントで確かめました(確認日 2026年10月23日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「WebDriverとは|仕組み・ChromeDriverとバージョンエラーの直し方」
WebDriverとは(意味と身近なたとえ)
この節では、WebDriver という言葉が何を指すのかと、似た言葉との見分け方が分かります。
WebDriver は、ブラウザの外で動くプログラムから、ブラウザを調べたり操作したりするための仕組み(リモートコントロールの規格)です。 W3C の仕様は、WebDriver を「ユーザーエージェント(ブラウザ)を調べて操作するためのリモートコントロールのインターフェース」と説明し、言語や OS に左右されない「ワイヤープロトコル(通信の決まり)」を定めています。主な目的は、Web 開発者がブラウザの操作を自動にしたテストを書けるようにすることです。
たとえると、テストコードは「指示書を書く人」、ドライバーは「ブラウザ専属の運転手」です。指示書(HTTP の JSON)は決まった書式なので、Python で書いても Java で書いても、Chrome の運転手でも Firefox の運転手でも通じます。
1規格としての WebDriver
W3C が決めた通信の決まり。「POST /session でセッションを作る」「POST /session/{id}/url でページを開く」など、命令と URL の形が決まっている。
2ドライバー
規格を受け持つ実行ファイル。Chrome は ChromeDriver、Firefox は geckodriver、Edge は msedgedriver、Safari は safaridriver。
3Selenium WebDriver
WebDriver を各言語から呼ぶためのライブラリ。driver.get() などの1行が、HTTP の命令1つに変わる。
4WebDriver BiDi
WebSocket でつなぎ、ブラウザ側からの知らせ(コンソールのログなど)も受け取れる新しい規格。
「WebDriver」の意味の見分け表
検索すると、同じ言葉で別のものが出てきます。
| 場面 | 指しているもの | この記事 |
|---|---|---|
| W3C・MDN | ブラウザを外から動かす規格(WebDriver classic・BiDi) | 扱う |
| Selenium | 規格を各言語から使うライブラリ(Selenium WebDriver) | 扱う |
| ドライバー | ChromeDriver・geckodriver・msedgedriver・safaridriver | 扱う |
| Windows | Microsoft Edge WebDriver、以前の Edge 用の「Microsoft WebDriver」機能 | 扱う |
| navigator.webdriver | 自動操作中かをページに知らせる JavaScript のプロパティ | 扱う |
WebDriver で何ができるか
- ブラウザの自動テスト(E2E テスト):画面を開く・入力する・ボタンを押す・表示を確かめる、を人の代わりに行う。WebDriver の仕様が主な目的として挙げている使い方です。
- ブラウザごとの動きの確認:同じテストを Chrome・Firefox・Edge・Safari で動かす。MDN は、クロスブラウザのテストの道具になることを WebDriver の役割に挙げています。
- 画面の操作の自動化・スクリーンショット:決まった手順の画面操作、画面の画像の保存。
サイトの自動操作には、相手のサイトの利用規約やアクセスの決まりが関わります。自分が管理するサイトや、許可のある範囲で使います。
WebDriverの仕組み(テストコード→ドライバー→ブラウザ)
この節では、1行のテストコードが、どこを通ってブラウザを動かすのかが分かります。
WebDriver では、テストコードとブラウザの間に、ドライバーという HTTP サーバーが入ります。 Apple の safaridriver のドキュメントは、1つの命令が次の順に処理されると説明しています。
ライブラリが命令を HTTP に変える
driver.get(URL) は POST /session/{セッションID}/url と JSON の本文になる。
ドライバーが HTTP で受ける
ドライバーは手元で動く小さな Web サーバー。中身の正しさを確かめる。
ドライバーがブラウザに伝える
伝え方はブラウザごとの内部の仕組み。ChromeDriver は Chrome の開発者向けの接続(DevTools Protocol)を使う。
結果を JSON で返す
成功なら {"value": …}、失敗なら {"value": {"error": …}} と HTTP のステータスコード。
ChromeDriver が Chrome をどう起動しているか
Selenium から ChromeDriver 経由で Chromium を起動し、そのときのブラウザのプロセスの引数を見ました。
--enable-automation --headless=new --remote-debugging-port=0
--remote-debugging-port は、Chrome の開発者向けの接続(Chrome DevTools Protocol、略して CDP)を開く引数です。WebDriver の規格はテストコードとドライバーの間の決まりで、ドライバーとブラウザの間は各ブラウザの内部の仕組みに任されています。 --enable-automation は、自動操作中であることを示す引数です(navigator.webdriver の節で使います)。
Selenium と WebDriver の関係
| 名前 | 何か | 作っている所 |
|---|---|---|
| WebDriver(規格) | 命令と URL・JSON の形の決まり | W3C(Browser Testing and Tools Working Group) |
| ドライバー | 規格の命令を受けてブラウザを動かす実行ファイル | 主にブラウザを作る会社・団体 |
| Selenium WebDriver | 各言語から規格を使うライブラリ | Selenium プロジェクト |
| Selenium Grid | 多数のブラウザにテストを振り分ける仕組み | Selenium プロジェクト |
Selenium の公式ドキュメント(日本語の「入門」)は、ブラウザごとの WebDriver の実装を「ドライバー」と呼び、Selenium で書き始める前に「言語のライブラリ」と「使うブラウザのドライバー」の2つを用意する、と説明しています。
W3C WebDriverの規格とWebDriver BiDi
この節では、WebDriver の規格の種類と、新しい WebDriver BiDi で何が変わるのかが分かります。
WebDriver には、HTTP で1つずつ命令する「WebDriver classic」と、WebSocket で双方向にやりとりする「WebDriver BiDi」の2つがあります。 MDN の WebDriver のページも、この2つに分けて説明しています。
WebDriver classic
通信は HTTP。命令を送ると応答が1つ返る
W3C 勧告(2018年6月5日、Level 1)
ブラウザ側で起きたことを知らせてもらう仕組みは無い
WebDriver BiDi
通信は WebSocket。命令に加えてイベントが届く
W3C 作業草案(2026年10月8日版)
コンソールのログ・通信・ページの読み込みなどを購読できる
| 規格 | 状態(2026年10月23日時点) | 内容 |
|---|---|---|
| WebDriver(Level 1) | W3C 勧告 2018年6月5日 | HTTP の命令と JSON の形 |
| WebDriver(次の版) | W3C 作業草案 2026年7月2日 | 命令の追加など |
| WebDriver BiDi | W3C 作業草案 2026年10月8日 | WebSocket の双方向の通信 |
BiDi のセッションは、セッションを作るときの能力(capabilities)に "webSocketUrl": true を入れると始まります。ドライバーは WebSocket の URL を返し、その URL にセッション ID が含まれます(WebDriver BiDi 仕様)。モジュールは session・browser・browsingContext・emulation・network・script・storage・log・input・webExtension などです。
ブラウザごとのドライバー一覧(ChromeDriver・geckodriver・msedgedriver・safaridriver)
この節では、ブラウザごとのドライバーの名前・作っている所・入手先と、版の合わせ方が分かります。
| ブラウザ | ドライバー | 入手先 | 版の合わせ方 |
|---|---|---|---|
| Chrome | ChromeDriver | Chrome for Testing のダッシュボード・JSON | Chrome と同じ版(115 以降) |
| Edge | Microsoft Edge WebDriver(msedgedriver) | Microsoft Edge Developer の WebDriver のページ | 4つの数字の先頭3つを合わせる |
| Firefox | geckodriver | Mozilla の GitHub リリース | 対応表で Firefox の版を確認 |
| Safari | safaridriver | macOS に入っている(/usr/bin/safaridriver) | Safari と一体 |
ChromeDriver(Chrome)
Chrome for Developers の説明では、ChromeDriver は「Selenium WebDriver が Chrome を動かすために使う別の実行ファイル」で、Chromium のチームが WebDriver の貢献者の助けを借りて保守しています。
- Chrome 115 以降:Chrome for Testing(CfT)のダッシュボードで、チャネル(Stable・Beta・Dev・Canary)ごとの Chrome と ChromeDriver の版を確かめ、同じ版の ChromeDriver を取ります。CfT の ChromeDriver は 115.0.5763.0 から用意されています。
- 自動で取る:CfT の JSON(
known-good-versions-with-downloads.json・last-known-good-versions-with-downloads.jsonなど)にダウンロード先の URL が並びます。CfT の配布先は linux64・linux-arm64・mac-arm64・mac-x64・win32・win64 です。 - Chrome 114 以前:ChromeDriver はメジャー・マイナー・ビルドの3つの数字が同じ Chrome に対応していました(版の選び方のページ)。
Chrome for Testing は、自動で更新されない、版を固定できるテスト用の Chrome です。ふつうの Chrome は自動で更新されるため、ドライバーの版がずれやすく、それを避けるために用意されました(Chrome for Developers ブログ)。
Microsoft Edge WebDriver(msedgedriver)
Microsoft Learn は、Microsoft Edge WebDriver を「Microsoft Edge 専用の WebDriver プロトコルの実装」と説明しています。
- 1Edge の版を見るedge://settings/help か、「…」>「ヘルプとフィードバック」>「Microsoft Edge について」
- 2同じ版のドライバーを取る4つの数字の先頭3つが同じなら組み合わせられる(例:128.0.2739.79 と 128.0.2739.84)
- 3msedgedriver を置いて PATH に入れる展開した実行ファイルのフォルダーを PATH 環境変数に足す
- 4IE モードのテストは別のドライバーMicrosoft は Internet Explorer Driver を勧めている
Microsoft Edge Developer の WebDriver のページでは、2026年10月23日時点で Stable が 156.0.4314.42、Beta が 157.0.4341.10、Dev が 158.0.4344.0、Canary が 158.0.4356.0 です。配布は x64・x86・ARM64・Mac・Mac M1・Linux です。
geckodriver(Firefox)
geckodriver は Mozilla の Firefox 用のドライバーで、GitHub のリリースで配られています。2026年10月23日時点の最新は 0.37.1(2026年7月20日)です。Linux の 32 ビット版は終了し、Linux と Windows には aarch64 の版があります。機能によって必要な Firefox の版が決まっている(例:Get Element Shadow Root は Firefox 96 以降)ので、リリースノートで確かめます。
safaridriver(Safari)
Apple のドキュメントでは、Safari のドライバーは /usr/bin/safaridriver にあり、Safari Technology Preview は自分のアプリの中に別の safaridriver を持っています。WebDriver の機能は最初はオフで、macOS High Sierra 以降は safaridriver --enable を1回実行してオンにします(以前の macOS から上げた場合は sudo が要ることがある)。
curlでWebDriverを直接動かす(HTTP APIの実物)
この節では、ライブラリを使わずに curl だけでセッションを作り、ページを開き、入力してボタンを押すまでを、実際の応答つきで見られます。
WebDriver の正体は、決まった URL に JSON を送る HTTP の API です。 ドライバーをポート 38400 で起動し、練習用のページ(名前を入れて「送信」を押すと「ようこそ、〇〇 さん」と出る)を開きました。
chromedriver --port=38400
Starting ChromeDriver 147.0.7727.24 (09d377d9438dc95267369f74a073acd81bdde38f-refs/branch-heads/7727@{#1413}) on port 38400
Only local connections are allowed.
ChromeDriver was started successfully on port 38400.
起動を確かめるには GET /status を呼びます。
curl -s http://127.0.0.1:38400/status
{"value":{"build":{"version":"147.0.7727.24 (09d377d9438dc95267369f74a073acd81bdde38f-refs/branch-heads/7727@{#1413})"},"message":"ChromeDriver ready for new sessions.","os":{"arch":"x86_64","name":"Linux","version":"6.18.44-fc-v153"},"ready":true}}
使った命令(W3C の仕様の URL)
| すること | メソッドと URL | 本文の例 |
|---|---|---|
| セッションを作る | POST /session | {"capabilities": …} |
| ページを開く | POST /session/{id}/url | {"url": "http://…"} |
| タイトルを取る | GET /session/{id}/title | なし |
| 要素を探す | POST /session/{id}/element | {"using": "css selector", "value": "#name"} |
| 文字を入力する | POST /session/{id}/element/{要素ID}/value | {"text": "山田"} |
| クリックする | POST /session/{id}/element/{要素ID}/click | {} |
| 要素の文字を取る | GET /session/{id}/element/{要素ID}/text | なし |
| JavaScript を実行する | POST /session/{id}/execute/sync | {"script": "…", "args": []} |
| 画面の画像を取る | GET /session/{id}/screenshot | なし |
| セッションを終える | DELETE /session/{id} | なし |
1. セッションを作る
curl -s -X POST http://127.0.0.1:38400/session \
-H 'Content-Type: application/json' \
-d '{"capabilities":{"alwaysMatch":{"browserName":"chrome",
"goog:chromeOptions":{"binary":"/path/to/chrome","args":["--headless=new"]}}}}'
応答の主な項目を抜き出しました(binary には Chromium の実行ファイルの場所を書きます)。
{
"sessionId": "cc93fd032ce6c3f3d4447e8bbb9a9c5d",
"browserName": "chrome",
"browserVersion": "141.0.7390.37",
"chromedriverVersion": "147.0.7727.24",
"pageLoadStrategy": "normal",
"timeouts": {"implicit": 0, "pageLoad": 300000, "script": 30000}
}
ブラウザが1つ起動し、以後はこの sessionId を URL に入れて命令します。 待ち時間の既定は、要素を探すときの暗黙の待ち 0 ミリ秒、ページの読み込み 300 秒、スクリプト 30 秒でした。
2〜8. ページを開いて、入力して、クリックする
S にセッション ID を入れて、順に送りました({"value":null} は成功で、返す値が無いという意味です)。
### POST /session/$S/url {"url":"http://127.0.0.1:38401/index.html"}
{"value":null}
### GET /session/$S/title
{"value":"WebDriver の練習"}
### POST /session/$S/element {"using":"css selector","value":"#name"}
{"value":{"element-6066-11e4-a52e-4f735466cecf":"f.C0AFE44244D1E7B385C29182C5030A8A.d.A571FCE81F19A901632572D0140D7E23.e.3"}}
### POST /session/$S/element/{要素ID}/value {"text":"山田"}
{"value":null}
### POST /session/$S/element {"using":"xpath","value":"//button[@id=\"btn\"]"}
{"value":{"element-6066-11e4-a52e-4f735466cecf":"f.C0AFE44244D1E7B385C29182C5030A8A.d.A571FCE81F19A901632572D0140D7E23.e.7"}}
### POST /session/$S/element/{要素ID}/click {}
{"value":null}
### GET /session/$S/element/{#msg の要素ID}/text
{"value":"ようこそ、山田 さん"}
### POST /session/$S/execute/sync {"script":"return navigator.webdriver","args":[]}
{"value":true}
要素を探すと、element-6066-11e4-a52e-4f735466cecf という決まった名前のキーで「要素 ID」が返ります。 以後はこの ID を URL に入れて、入力やクリックをします。探し方(using)は css selector・xpath・link text・partial link text・tag name です。
9〜12. エラー・画面の画像・終了
### 存在しない要素を探す(HTTP 404)
{"value":{"error":"no such element","message":"no such element: Unable to locate element: {\"method\":\"css selector\",\"selector\":\"#nothing\"}\n (Session info: chrome=141.0.7390.37)","stacktrace":"…"}}
### GET /session/$S/screenshot → value を base64 で戻す
9383 bytes b'\x89PNG\r\n\x1a\n'
### DELETE /session/$S
{"value":null}
### 終えたセッションに命令する(HTTP 404)
{"value":{"error":"invalid session id","message":"invalid session id","stacktrace":"…"}}
終わったら必ず DELETE /session/{id}(Selenium なら quit())を呼びます。 呼ばないと、ブラウザのプロセスが残り続けます。
WebDriver BiDiを動かす(WebSocketの実物)
この節では、BiDi でブラウザからの知らせ(コンソールのログ)を受け取る流れを、実際のメッセージで見られます。
セッションを作るときに "webSocketUrl": true を足すと、応答に WebSocket の URL が入りました。
webSocketUrl: ws://127.0.0.1:38400/session/ad107e292c7a442c0b522f209cbf811b
Node.js の WebSocket でつなぎ、ログの購読 → タブの一覧 → ページを開く、の順に送りました。
const ws = new WebSocket(process.argv[2]);
let id = 0;
const send = (method, params) => ws.send(JSON.stringify({ id: ++id, method, params }));
ws.onopen = () => {
send('session.subscribe', { events: ['log.entryAdded'] });
send('browsingContext.getTree', {});
};
ws.onmessage = (e) => {
const m = JSON.parse(e.data);
console.log('<<', JSON.stringify(m).slice(0, 200));
if (m.id === 2) {
send('browsingContext.navigate', {
context: m.result.contexts[0].context,
url: 'data:text/html,<script>console.log("hello from page")</script>',
wait: 'complete',
});
}
};
<< {"id":1,"result":{"subscription":"a3876faa-e7a1-4c98-a046-91068dacdf6f"},"type":"success"}
<< {"id":2,"result":{"contexts":[{"children":[],"clientWindow":"1755616755","context":"7ADA98C9CB212ECB57E3EA4022341CE0","originalOpener":null,"parent":null,"url":"about:blank","userContext":"default"}]},"type":"success"}
<< {"method":"log.entryAdded","params":{"args":[{"type":"string","value":"hello from page"}],"level":"info","method":"log", …}}
<< {"id":3,"result":{"navigation":"4fde55c1-…","url":"data:text/html,<script>console.log(\"hello from page\")</script>"},"type":"success"}
3つ目のメッセージは、こちらから頼んでいないのに届いた「イベント」です。 ページの console.log がブラウザから送られてきました。HTTP の WebDriver classic では、ログを取るには命令を送って聞きに行く形になります。BiDi では、購読しておけば起きたときに届きます。
Selenium(Python)から同じ操作をする
この節では、Selenium のコードと、その1行ずつが実際にどの HTTP の命令になったのかが分かります。
pip install selenium
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options) # ドライバーは Selenium Manager が用意する
try:
caps = driver.capabilities
print("browser:", caps["browserVersion"], "/ driver:", caps["chrome"]["chromedriverVersion"].split()[0])
driver.get("http://127.0.0.1:38401/index.html")
print("title:", driver.title)
driver.find_element(By.ID, "name").send_keys("山田")
driver.find_element(By.XPATH, '//button[@id="btn"]').click()
WebDriverWait(driver, 5).until(EC.text_to_be_present_in_element((By.ID, "msg"), "ようこそ"))
print("msg:", driver.find_element(By.ID, "msg").text)
print("navigator.webdriver:", driver.execute_script("return navigator.webdriver"))
finally:
driver.quit()
browser: 141.0.7390.37 / driver: 147.0.7727.24
title: WebDriver の練習
msg: ようこそ、山田 さん
navigator.webdriver: True
確かめでは、ドライバーの場所を Service(executable_path=…) で指定し、版の確認を外す引数(後の節)を付けて動かしました。
Selenium の1行は、HTTP の命令1つになる
Python の logging を DEBUG にすると、Selenium が送った HTTP が見えます。実際のログを短くしたものです。
| Selenium のコード | 送られた HTTP | 本文 |
|---|---|---|
| webdriver.Chrome() | POST /session | capabilities |
| driver.get(url) | POST /session/{id}/url | {'url': 'http://…'} |
| driver.title | GET /session/{id}/title | {} |
| find_element(By.ID, "name") | POST /session/{id}/element | {'using': 'css selector', 'value': '[id="name"]'} |
| send_keys("山田") | POST …/element/{要素ID}/value | {'text': '山田', 'value': ['山', '田']} |
| click() | POST …/element/{要素ID}/click | {} |
| execute_script(…) | POST /session/{id}/execute/sync | {'script': …, 'args': []} |
| driver.quit() | DELETE /session/{id} | {} |
By.ID は、規格に「ID で探す」が無いため、CSS セレクタの [id="name"] に変えて送られていました。 また Selenium は ChromeDriver を自分で起動し、空いているポート(このときは 56833)で話していました。要素の探し方と待ち方の全パターンは、関連記事「Selenium Pythonの使い方|要素取得の全パターンと待機処理」で扱っています。CSS セレクタの書き方は、関連記事「CSSセレクタ一覧|:has()・ネスト対応の早見表と詳細度」で扱っています。
Selenium Managerによるドライバーの自動取得
この節では、ドライバーを手で入れなくても Selenium が動く仕組みと、取得できないときに出る表示が分かります。
Selenium 4.6 以降は、ドライバーが指定されていないと、Selenium Manager がブラウザの版を調べて、合うドライバーを探し・取得し・保存します。 Selenium Manager は Rust で書かれたツールで、Selenium に同梱されています。4.11.0 からは、Chrome for Testing をもとにブラウザ本体の取得もできます(Firefox は 4.12.0、Edge は 4.14.0 から)。
| 項目 | 内容(selenium.dev、2026年10月23日時点) |
|---|---|
| 保存先 | ~/.cache/selenium(SE_CACHE_PATH で変更) |
| 利用状況の送信 | 既定でオン。SE_AVOID_STATS=true で止める |
| ネットワークを使わない | SE_OFFLINE=true |
| PATH のドライバーを使わない | SE_SKIP_DRIVER_IN_PATH・--skip-driver-in-path |
| 設定ファイル | ~/.cache/selenium/se-config.toml |
Selenium Manager を単体で動かした
Selenium Manager は、pip で入れた selenium の中に実行ファイルとして入っています(Linux は selenium/webdriver/common/linux-x86_64/selenium-manager)。
selenium-manager --browser chrome --browser-path /path/to/chrome --debug
PATH に ChromeDriver 147 がある状態で、Chromium 141 を指定したときの表示です(--offline を付けて、ネットワークを使わずに調べさせました)。
WARN The chromedriver version (147.0.7727.24) detected in PATH at /path/to/chromedriver might not be compatible with the detected chrome version (141.0.7390.37); currently, chromedriver is recommended for chrome 141.*, so it is advised to delete the driver in PATH and retry
INFO Driver path: /path/to/chromedriver
INFO Browser path: /path/to/chrome
ネットワークが使えるときは、Chrome for Testing の JSON から版を調べに行きます。プロキシで通信が止まる環境では、次の流れで止まりました。
DEBUG Detected browser: chrome 141.0.7390.37
DEBUG Discovering versions from https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json
WARN Exception managing chrome: error sending request for url (https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json)
このとき Python の webdriver.Chrome() は、次のエラーになりました。
selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain driver for chrome; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location
社内のプロキシなどでドライバーを取りに行けないときは、ドライバーを手で置いて PATH に入れるか、コードで場所を指定します。 Selenium の公式の「Unable to Locate Driver Error」のページも、この2つの方法を挙げています。
from selenium.webdriver.chrome.service import Service
service = Service(executable_path="/opt/drivers/chromedriver")
driver = webdriver.Chrome(options=options, service=service)
ログの表示の行は、時刻を省いて載せています。パスは置き換えています。
バージョンが合わないエラー(session not created)の原文と直し方
この節では、いちばんよく出る「ブラウザとドライバーの版が合わない」エラーの原文、起きる理由、直し方が分かります。
ChromeDriver 147 で Chromium 141 を動かそうとすると、セッションを作る時点で失敗しました。 curl で POST /session を送った応答(HTTP 500)です。
{"value":{"error":"session not created","message":"session not created: This version of ChromeDriver only supports Chrome version 147\nCurrent browser version is 141.0.7390.37 with binary path /path/to/chrome", …}}
Selenium(Python)から同じ組み合わせで動かすと、次の例外になりました。
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 147
Current browser version is 141.0.7390.37 with binary path /path/to/chrome; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#sessionnotcreatedexception
ChromeDriver と Chrome の版
多いのは、Chrome が自動で更新され、手で置いたドライバーが前の版のまま残るケース
直し方(状況別)
| 状況 | 直し方 |
|---|---|
| Selenium 4.6 以降を使っている | ドライバーの指定を外し、Selenium Manager に任せる |
| PATH に前の版のドライバーがある | PATH のドライバーを消すか差し替える(Selenium Manager も警告で勧める) |
| Chrome が自動で更新された | Chrome の版を見て、Chrome for Testing で同じ版の ChromeDriver を取る |
| 版を固定したい(CI など) | Chrome for Testing の Chrome と ChromeDriver を同じ版で置く |
| Edge で起きた | edge://settings/help の版の先頭3つの数字が同じ msedgedriver を取る |
| macOS でドライバーが開けない | システム設定の「プライバシーとセキュリティ」で許可する |
| 実行の権限が無い | chmod +x でドライバーを実行できるようにする |
Selenium のトラブルシューティングのページは、SessionNotCreatedException の原因として、ドライバーとブラウザの版の不一致、macOS のプライバシーの設定、ドライバーが無いか実行できないこと、を挙げています。
版の確認を外す --disable-build-check
ChromeDriver には、版の確認を外す --disable-build-check という引数があります(--help には出ませんでした)。付けて起動すると、ChromeDriver 147 と Chromium 141 でもセッションが作られ、この記事の操作はすべて動きました。
chromedriver --port=38400 --disable-build-check
ただし、版の違うドライバーでは、新しく足された命令や直った動きが合わないことがあります。確かめのための一時的な手段にとどめ、テストでは版をそろえます。
WebDriverのよくあるエラー一覧(原文と直し方)
この節では、版の不一致のほかに、Selenium・WebDriver でよく出るエラーを、実際に出した原文で探せます。
わざと失敗する操作を Selenium で行いました(ページには、非表示の入力欄と、1.5 秒後に表示されるボタンを置きました)。
1 存在しない要素 -> NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"[id="nothing"]"}
2 非表示の入力欄に入力 -> ElementNotInteractableException: element not interactable
3 まだ表示されていないボタンをすぐ押す -> ElementNotInteractableException: element not interactable
4 WebDriverWait で押せるまで待つ -> OK
5 再読み込み前の要素を使う -> StaleElementReferenceException: stale element reference: stale element not found
6 待ち時間切れ -> TimeoutException(メッセージは空)
| エラー(W3C のコード・HTTP) | よくある原因 | 直し方 |
|---|---|---|
| no such element(404) | 探すのが早すぎる・セレクタの誤り | WebDriverWait で待つ・セレクタを DevTools で確かめる |
| element not interactable(400) | 非表示・入力できない要素 | 表示を待つ・入力欄そのものを探す |
| stale element reference(404) | 再読み込み・DOM の作り直しで要素が変わった | 使う直前に探し直す |
| invalid session id(404) | quit()・close() の後に命令した | 終了の位置を見直す |
| session not created(500) | ブラウザとドライバーの版の不一致 | 版をそろえる |
| TimeoutException | 待つ条件が時間内に満たされない | 条件・セレクタ・待ち時間を見直す |
| element click intercepted | ほかの要素(固定ヘッダー・モーダル)が上にある | 押せるまで待つ・スクロールする |
HTTP のステータスは W3C の仕様のエラー表によるもので、no such element と invalid session id の 404 は curl で実際に返りました。待ちが原因で落ちたり通ったりするテストの直し方は、関連記事「フレーキーテストの原因と対策|不安定なテストの見つけ方と直し方」で扱っています。
navigator.webdriverとは(自動操作中かをページが知る仕組み)
この節では、ページの JavaScript から「いま自動操作されているか」が分かる navigator.webdriver の値と、いつ true になるのかが分かります。
navigator.webdriver は、ブラウザが自動操作されているときに true になる、読み取り専用のプロパティです。 MDN は、WebDriver に操作されていることを協力的な方法でページに伝え、自動操作のときに別の処理を走らせられるようにするもの、と説明しています。
練習ページで navigator.webdriver を表示させ、起動の仕方を変えて比べました。
| 起動の仕方 | Chrome に付いた主な引数 | navigator.webdriver |
|---|---|---|
| ChromeDriver(curl・Selenium) | --enable-automation --remote-debugging-port=0 | true |
| Playwright | --enable-automation --remote-debugging-pipe | true |
| Chromium を --headless=new だけで起動 | (自動操作の引数なし) | false |
MDN によると、Chrome では --enable-automation か --headless のとき、または --remote-debugging-port を 0 にしたときに true、Firefox では marionette.enabled の設定か --marionette のときに true です。今回の Chromium 141 では、--headless=new だけで起動したときは false でした。
Playwright・Puppeteerとの違い
この節では、WebDriver(Selenium)と、よく比べられる Playwright・Puppeteer の違いを、事実で比べられます。
| 比べる点 | WebDriver(Selenium など) | Playwright | Puppeteer |
|---|---|---|---|
| ブラウザとの話し方 | W3C の規格(HTTP・BiDi)でドライバー経由 | ブラウザに直接つなぐ(Chromium は今回 --remote-debugging-pipe) | Chrome は CDP が既定、Firefox は WebDriver BiDi が既定 |
| ドライバー | ブラウザごとに要る | 要らない | 要らない |
| 対応ブラウザ | Chrome・Edge・Firefox・Safari ほか | Chromium・Firefox・WebKit、Chrome・Edge のチャネル | Chrome・Firefox |
| ブラウザの版 | ドライバーと合わせる | Playwright の版ごとに決まった版を入れる | 対応する版を入れる |
| 言語 | Java・Python・C#・Ruby・JavaScript など | JavaScript/TypeScript・Python・Java・.NET | JavaScript/TypeScript |
Playwright の公式ドキュメントは「Playwright の各版は、動かすのに特定の版のブラウザが必要」と説明し、npx playwright install でブラウザを入れます。今回の playwright-core 1.56.1 が使う Chromium も 141.0.7390.37 で、ブラウザの起動引数は --remote-debugging-pipe(ドライバーを通さず、パイプで CDP につなぐ)でした。Puppeteer の公式ドキュメントは、Firefox を起動すると WebDriver BiDi が既定で有効、Chrome は CDP が既定で、protocol: 'webDriverBiDi' で BiDi に切り替えられる、としています。
同じ「名前を入れて送信」の操作を Playwright で書くと、次のようになり、結果は同じでした(msg: ようこそ、山田 さん・navigator.webdriver: true)。
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('http://127.0.0.1:38401/index.html');
await page.fill('#name', '山田');
await page.click('#btn');
console.log('msg:', await page.textContent('#msg'));
await browser.close();
})();
Playwright でテストを書く手順と CI での実行は、関連記事「Playwright入門|E2Eテストの書き方とCI実行まで実行結果つきで解説」で扱っています。
Windowsの「WebDriver」関連の用語(Microsoft Edge WebDriver)
この節では、Windows で見かける「WebDriver」という名前のものが何かが分かります。
| 見かける名前 | 何か | 出典 |
|---|---|---|
| Microsoft Edge WebDriver | 今の Edge(Chromium 版)用のドライバー。実行ファイルは msedgedriver | Microsoft Learn |
| Microsoft WebDriver(オプション機能) | 以前の Edge(EdgeHTML 版)用のドライバー。Windows の「機能の追加」で入れた | Microsoft Edge Blog(2018年) |
| Internet Explorer Driver | Edge の IE モードのテストに使うドライバー | Microsoft Learn |
| Microsoft.Edge.SeleniumTools | Selenium 3 の頃に使った Edge 用の補助のパッケージ | Microsoft Learn |
Microsoft Edge Blog(2018年6月14日)によると、以前の Edge 用の WebDriver は Windows の「オンデマンド機能」として配られ、開発者モードをオンにするか、「オプション機能の管理」>「機能の追加」で「WebDriver」を選ぶか、DISM のコマンドで入れました。以前の Edge は今の Edge に置き換わっていて、Microsoft Learn は今の Edge には Microsoft Edge WebDriver を勧めています。
Selenium 4 で Microsoft.Edge.SeleniumTools が残っていると、EdgeDriver を作るときに次のエラーになります(Microsoft Learn)。補助のパッケージを外し、Selenium 4 の EdgeOptions・EdgeDriver を使います。
System.MissingMethodException: 'Method not found: 'OpenQA.Selenium.Remote.DesiredCapabilities OpenQA.Selenium.DriverOptions.GenerateDesiredCapabilities(Boolean)'
よくある質問
Q. WebDriverとは簡単に言うと何ですか? A. プログラムからブラウザを外から操作するための W3C の規格です。テストコードの命令を、ブラウザごとのドライバー(ChromeDriver など)が受けてブラウザを動かします。
Q. Selenium と WebDriver の違いは何ですか? A. WebDriver は通信の決まり(規格)とドライバー、Selenium はそれを Python や Java から使うためのライブラリです。Selenium の1行は、WebDriver の HTTP の命令1つになります。
Q. ChromeDriver とは何ですか? A. Selenium などが Chrome を動かすために使う、Chrome 用のドライバー(実行ファイル)です。Chromium のチームが保守し、Chrome 115 以降は Chrome for Testing で配られています。
Q. 「This version of ChromeDriver only supports Chrome version」と出たら? A. ChromeDriver と Chrome の版が合っていません。Selenium 4.6 以降ならドライバーの指定を外して Selenium Manager に任せるか、Chrome と同じ版の ChromeDriver を Chrome for Testing から取ります。
Q. ChromeDriver のダウンロードは必要ですか? A. Selenium 4.6 以降は、Selenium Manager が自動で取得します。プロキシなどで取りに行けない環境では、手で置いて PATH に入れるか、Service で場所を指定します。
Q. Microsoft Edge WebDriver とは何ですか? A. Microsoft が作っている、Edge 用の WebDriver のドライバー(msedgedriver)です。Edge の版と、4つの数字の先頭3つが同じものを使います。
Q. Firefox のドライバーは何ですか? A. Mozilla の geckodriver です。GitHub のリリースで配られ、2026年10月23日時点の最新は 0.37.1 です。
Q. WebDriver BiDi とは何ですか? A. WebSocket で双方向にやりとりする WebDriver の新しい規格です。コンソールのログやページの読み込みなどのイベントを、起きたときに受け取れます。
Q. navigator.webdriver が true になるのはなぜですか?
A. ブラウザが自動操作されていることを、ページに伝えるためのプロパティだからです。ChromeDriver や Playwright で起動すると --enable-automation が付き、true になりました。
Q. WebDriver と Playwright はどちらを使えばいいですか? A. 使う言語・対応ブラウザ・既存のテストで決まります。Safari を含む多くのブラウザを W3C の規格で動かすなら WebDriver(Selenium)、ドライバー無しで Chromium・Firefox・WebKit を版ごと固定して動かすなら Playwright、という違いがあります。
まとめ
- WebDriver は、プログラムからブラウザを外から動かす W3C の規格。テストコード→(HTTP の JSON)→ドライバー→ブラウザ、の順に命令が伝わる。
- 規格は、HTTP の WebDriver classic(2018年に W3C 勧告)と、WebSocket の WebDriver BiDi(作業草案)の2つ。
- ドライバーは Chrome が ChromeDriver、Edge が msedgedriver、Firefox が geckodriver、Safari が safaridriver。
- curl だけでも、POST /session → /url → /element → /value → /click → DELETE で操作できた。Selenium の1行は、この HTTP の命令1つに変わる。
- Selenium 4.6 以降は Selenium Manager がドライバーを自動で用意する。取れない環境では手で置いて PATH か Service で指定する。
- 「session not created: This version of ChromeDriver only supports Chrome version …」は版の不一致。ブラウザとドライバーの版をそろえる。
- navigator.webdriver は自動操作中に true。Playwright・Puppeteer はドライバーを使わず、ブラウザに直接つなぐ。
curl での API の確かめ方は、関連記事「curlコマンドの使い方|よく使うオプションとAPIの確認方法」で扱っています。セレクタをブラウザで確かめる方法は、関連記事「Chrome DevToolsの使い方|デバッグ手順と便利機能一覧」で扱っています。
参考・出典
確認日はいずれも 2026年10月23日です。
- W3C「WebDriver」(W3C Recommendation 05 June 2018):https://www.w3.org/TR/webdriver1/
- W3C「WebDriver」(Working Draft):https://www.w3.org/TR/webdriver/
- W3C「WebDriver BiDi」:https://www.w3.org/TR/webdriver-bidi/
- MDN「WebDriver」:https://developer.mozilla.org/en-US/docs/Web/WebDriver
- MDN「Navigator: webdriver property」:https://developer.mozilla.org/en-US/docs/Web/API/Navigator/webdriver
- Selenium「入門」:https://selenium.dev/ja/documentation/webdriver/getting_started
- Selenium「Selenium Manager」:https://www.selenium.dev/documentation/selenium_manager/
- Selenium ドキュメント(Troubleshooting の Errors):https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/
- Selenium「Unable to Locate Driver Error」:https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location/
- Chrome for Developers「Get started with ChromeDriver」:https://developer.chrome.com/docs/chromedriver/get-started
- Chrome for Developers「Version selection」:https://developer.chrome.com/docs/chromedriver/downloads/version-selection
- Chrome for Developers ブログ(Chrome for Testing):https://developer.chrome.com/blog/chrome-for-testing
- GitHub「GoogleChromeLabs/chrome-for-testing」:https://github.com/GoogleChromeLabs/chrome-for-testing
- Microsoft Learn「Use WebDriver to automate Microsoft Edge」:https://learn.microsoft.com/en-us/microsoft-edge/webdriver-chromium/
- Microsoft Edge Developer「Microsoft Edge WebDriver」:https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/
- Microsoft Edge Blog(2018年6月14日):https://blogs.windows.com/msedgedev/2018/06/14/webdriver-w3c-recommendation-feature-on-demand
- GitHub「mozilla/geckodriver Releases」:https://github.com/mozilla/geckodriver/releases
- Apple Developer「Testing with WebDriver in Safari」:https://developer.apple.com/documentation/webkit/testing-with-webdriver-in-safari
- Puppeteer「WebDriver BiDi」:https://pptr.dev/webdriver-bidi
- Playwright「Browsers」:https://playwright.dev/docs/browsers
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「WebDriverとは|仕組み・ChromeDriverとバージョンエラーの直し方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。