はじめに
Python+Seleniumでプログラムを動かしたら、NoSuchDriverException: Chrome のドライバーを取得できません と表示される。よくある落とし穴だ。
原因は大きく三つに分かれる。Seleniumのバージョン不整合、Chrome本体の検出失敗、ネットワーク(プロキシ)でSelenium Managerがドライバー取得に失敗、の三点だ。
この記事では、最短で動かすための手順と、根本原因ごとの切り分けをステップで解説する。VS Code・Windows環境を前提にしつつ、他OSでも応用できる。
手順
1. まずは最小コード+最新版で確認
Selenium 4.6以降は Selenium Manager が自動でChromeDriverを取得する仕組みになった。まずは最新版へ上げる。
python -m pip install -U selenium
python -c "import selenium,sys; print('selenium=', selenium.__version__); sys.exit(0)"
次の最小コードで挙動を確認する。
# minimal.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
opts = Options()
# ヘッドレスで試すと起動可否が早く分かる
opts.add_argument("--headless=new")
driver = webdriver.Chrome(options=opts)
driver.get("https://example.com")
print(driver.title)
driver.quit()
これで動けば完了だ。動かない場合は次へ進む。
2. Chrome本体のインストールとパスを確認
Selenium Managerは ブラウザ本体の場所 を探す。Chromeが未インストール、または特殊な場所にあると失敗しやすい。
- Windows既定の場所
C:\Program Files\Google\Chrome\Application\chrome.exe
or
C:\Program Files (x86)\Google\Chrome\Application\chrome.exe -
Portable版や社内配布版など、標準外パスにある場合は binary_location を明示する。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("--headless=new")
opts.binary_location = r"C:\Tools\Chrome\chrome.exe" # 実環境のパスに変更
driver = webdriver.Chrome(options=opts)
driver.get("https://example.com")
print(driver.title)
driver.quit()
Chromeがない場合は普通にChromeを入れるか、Chrome for Testing を導入して明示指定する方法もある。
(例)%LOCALAPPDATA%\Google\Chrome for Testing\Application\chrome.exe
3. ネットワーク環境(プロキシ)での取得失敗を解消
会社ネットワークでSelenium Managerがドライバーを取りに行けず失敗することがある。HTTPS_PROXY などの環境変数を設定する。
# 例: PowerShell
$env:HTTPS_PROXY="http://proxy.example.com:8080"
$env:HTTP_PROXY="http://proxy.example.com:8080"
python minimal.py
細かく制御したい場合は SELENIUM_MANAGER_PROXY を使う。証明書検証が絡む環境では、社内CA対応も確認する。
4. Serviceを明示してログを詳しく出す
原因が読みにくいときは Service を使い、Selenium Managerのログを表示して手掛かりを得る。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("--headless=new")
service = Service() # パス不要。Selenium Managerが解決を試みる
driver = webdriver.Chrome(service=service, options=opts)
driver.get("https://www.python.org")
print(driver.title)
driver.quit()
5. どうしても自動解決が失敗するときの代替策
5-1. ChromeDriverを手動配置してパス指定
手動でChromeDriverを取得し、フルパスでServiceへ渡す。Chrome本体のバージョンと 厳密に一致 させる。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("--headless=new")
service = Service(r"C:\drivers\chromedriver.exe") # 取得した実行ファイルのパス
driver = webdriver.Chrome(service=service, options=opts)
driver.get("https://example.com")
print(driver.title)
driver.quit()
5-2. webdriver-manager ライブラリを使う
プロキシ環境などで安定するケースがある。
python -m pip install -U webdriver-manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
opts = Options()
opts.add_argument("--headless=new")
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=opts)
driver.get("https://example.com")
print(driver.title)
driver.quit()
6. バージョン不整合を一気に潰すチェックリスト
seleniumは最新か
pip show seleniumを確認し、古ければアップグレード。- Chromeはインストール済みか、起動できるか
コマンドラインからchrome.exe --versionを実行。権限問題がないかも見る。 - パスが標準外なら
options.binary_locationを明示
スペースや全角文字を含むパスでもOKだが、Raw文字列 を推奨。 - ネットワークは外へ出られるか
HTTPS_PROXYなどを設定。プロキシ認証が必要なら資格情報付きURLを使う。 - セキュリティソフトのブロック
ダウンロード・実行が止められていないかログを確認。 - VS CodeのPython拡張で異なる仮想環境を参照していないか
右下のInterpreterが想定のPythonかを確認。
7. エラーメッセージから原因を特定するコツ
あなたのログに近い形で出やすいパターンを抜粋する。
NoSuchDriverException: Chrome のドライバーを取得できません
→ Selenium ManagerがChromeDriverを用意できなかった。Chrome未検出/ネットワーク遮断/権限不足の可能性が高い。Unable to discover open pagesなど起動直後で止まる
→ Chromeは起動したが自動制御に失敗。バージョン不一致やサンドボックス制約を疑う。--no-sandboxは社内端末では避けたい。This version of ChromeDriver only supports Chrome version XX
→ ドライバーとChromeのバージョン不一致。手動配置なら一致版に差し替え。
8. 動けば仕上げ:実務テンプレ
ページスクレイピングの定番テンプレートを載せる。タイムアウトや待機を加え、安定度を上げる。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
opts = Options()
opts.add_argument("--headless=new")
# 必要に応じて明示
# opts.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
with webdriver.Chrome(options=opts) as driver:
driver.set_page_load_timeout(30)
driver.get("https://example.com")
WebDriverWait(driver, 15).until(
EC.presence_of_element_located((By.TAG_NAME, "h1"))
)
print(driver.title)
まとめ
NoSuchDriverException は、Seleniumの自動解決がブラウザ検出やネットワークでつまずいた合図だ。
最新版のSeleniumで最小コードを試す → Chromeの場所を明示 → プロキシを設定 → それでもダメなら手動配置やwebdriver-manager、の順で進めればほぼ解決する。
まずは記事の 手順1〜3 を実行してみてほしい。動いたらテンプレで作業に戻れるはずだ。

コメント