概要(ChromeDriverは「SeleniumがChromeを動かすための運転手」)
ChromeDriverは、SeleniumがChromeブラウザをプログラムから操作するための仲介役です。要点は「Chrome本体とのバージョン整合」「起動オプション(ヘッドレス・ダウンロード設定など)」「パス管理(どこにあるか)」「安定化(待機・例外)」の4つ。初心者は「webdriver-managerで自動管理」→「最短起動」→「ヘッドレス実行」→「明示的待機を組み合わせる」の型で進めると、つまずきません。
はじめ方(インストールと最短の起動)
依存関係の整理と最短スクリプト
# インストール(Pythonパッケージ)
# pip install selenium webdriver-manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# ChromeDriverを自動ダウンロード&起動
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.google.com")
print(driver.title)
driver.quit() # 必ず後始末
Pythonwebdriver-managerを使うと、Chrome本体のバージョンに合うChromeDriverを自動取得します。手動ダウンロードやPATH設定の手間が減り、起動エラーの定番を回避できます。
手動でパスを指定したい場合
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 例:ローカルに配置した chromedriver のパス
service = Service("/path/to/chromedriver")
driver = webdriver.Chrome(service=service)
driver.get("https://example.com")
driver.quit()
Python社内環境でインターネット制限があるときは、管理者が配布したChromeDriverのパスを明示指定します。Chrome本体のバージョン整合は自分で合わせます。
起動オプション(ヘッドレス・言語・ダウンロード先)
ヘッドレス(画面非表示)とウィンドウサイズ
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
opts = Options()
opts.add_argument("--headless=new") # 新ヘッドレスモード
opts.add_argument("--window-size=1280,800") # 要素検出の安定化に有効
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)
driver.get("https://example.com")
print(driver.title)
driver.quit()
PythonヘッドレスはCIやサーバで便利ですが、画面サイズが小さいと要素が「見えていない」扱いになり操作に失敗します。ウィンドウサイズ指定で安定させましょう。
表示言語やユーザエージェントの設定
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("--lang=ja-JP")
opts.add_argument("--user-agent=MyCrawler/1.0")
Pythonサイトの表示言語や挙動を制御したいなら、言語コードやUAを明示します。
ダウンロード先と自動保存(Chromeの設定)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
opts = Options()
prefs = {
"download.default_directory": r"C:\temp\downloads",
"download.prompt_for_download": False, # ダイアログを出さない
"download.directory_upgrade": True
}
opts.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)
driver.get("https://example.com/report.csv") # 直接リンクを開けば自動保存
driver.quit()
Pythonレポートの自動ダウンロードでは保存先を固定し、ダイアログ無しで落とせるようにすると無人実行が安定します。
要素操作の基本(ロケータと明示的待機)
ロケータの使い分け(ID/NAME/CSS/XPath)
from selenium.webdriver.common.by import By
driver.get("https://www.google.com")
q = driver.find_element(By.NAME, "q") # 最優先はID/NAME
q.send_keys("Selenium ChromeDriver")
q.submit()
results = driver.find_elements(By.CSS_SELECTOR, "h3") # 構造指定はCSS
print([r.text for r in results[:5]])
PythonID/NAMEがあるなら最短・堅牢。CSSは短く書けて高速。XPathは表現力が高い反面、長くなりがちでDOM変更に弱いので最後の手段。
明示的待機(ページが“準備完了”してから操作)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type=submit]")))
btn.click()
Python固定のsleepではなく、表示やクリック可能性を条件に待つ「明示的待機」が安定化の核心です。
トラブルシューティング(絶対にハマりがちな箇所)
バージョン不一致で起動しない
- 症状: “Session not created” や “Chrome version must be…” などのエラー。
- 対策: webdriver-managerで自動管理する、またはChrome本体とChromeDriverのバージョンを合わせる。手動管理なら更新のたびに入れ替え必須。
要素がクリックできない・見つからない
- 症状: ElementClickInterceptedException、NoSuchElementException、TimeoutException。
- 対策: 明示的待機(visibility/clickable)、ヘッドレス時はwindow-size指定、スクロールで要素を視野へ入れる、iframeはスイッチしてから操作。
from selenium.webdriver.common.action_chains import ActionChains
target = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".buy")))
ActionChains(driver).move_to_element(target).perform()
target.click()
Pythoniframe内の要素に触れない
- 症状: 何度探しても要素が見つからない。
- 対策: iframeへスイッチしてから操作し、終わったら戻る。
frame = WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe#payment")))
# ... 操作 ...
driver.switch_to.default_content()
Pythonダウンロードが止まる・ダイアログ待ち
- 対策: Chromeのdownload prefsを設定してダイアログ無効化。サーバ側が認証やPOST前提なら、その手順を自動化してからダウンロードリンクへ遷移。
実務の型(ログイン→検索→抽出→保存を“落ちない”ように書く)
一連の流れを「オプション+待機+例外+後始末」で守る
import csv
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
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.add_argument("--window-size=1280,800")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)
wait = WebDriverWait(driver, 12)
try:
driver.get("https://example.com/login")
wait.until(EC.visibility_of_element_located((By.ID, "username"))).send_keys("taro")
wait.until(EC.visibility_of_element_located((By.ID, "password"))).send_keys("secret")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type=submit]"))).click()
wait.until(EC.url_contains("/dashboard"))
driver.get("https://example.com/search?q=python")
rows = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.item")))
data = []
for r in rows[:20]:
title = r.find_element(By.CSS_SELECTOR, "h3").text
link = r.find_element(By.CSS_SELECTOR, "a").get_attribute("href")
data.append([title, link])
with open("results.csv", "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(data)
finally:
driver.quit()
Python「ヘッドレス+サイズ」「明示的待機」「例外に備えたfinallyでquit」が堅牢化の三本柱です。こう書くと、動的ページでも落ちにくくなります。
まとめ
ChromeDriverは、SeleniumがChromeを動かすための“運転手”。最初の壁はバージョン不一致なので、webdriver-managerで自動管理するのが近道。ヘッドレス運用時はwindow-sizeを必ず指定し、要素操作はID/NAME/CSSを優先、クリックは明示的待機で「準備が整ってから」。ダウンロードはChromeのprefsで無人化し、iframeはスイッチを忘れない。これらの型を身につければ、初心者でも短いコードで「落ちない・速い・実務で使える」自動ブラウザ操作が安定して書けます。
