Seleniumで「NoSuchDriverException: Chromeのドライバーを取得できません」が出た時の原因と解決方法

プログラミング

はじめに

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 を実行してみてほしい。動いたらテンプレで作業に戻れるはずだ。

コメント