テスト

Seleniumとは?使い方をPythonで解説|4.51対応・ChromeDriverの手動設定が要らない書き方

Seleniumとは?使い方をPythonで解説|4.51対応・ChromeDriverの手動設定が要らない書き方

Seleniumは、ブラウザをプログラムから操作するためのオープンソースのツール群です。Webアプリの回帰テスト、ログインが必要な画面のデータ取得、社内システムの定型操作の自動化に使われます。ただ、解説記事を見ながら手を動かすと最初のコードで止まることがあります。webdriver.Chrome(executable_path="...") が TypeError になり、find_element_by_id() が AttributeError になる。書き方の誤りではなく、その書き方がSelenium本体から削除されているためです。

この記事は、2026年10月9日に公開されたSelenium 4.51.0(Java・Python・JavaScript・Ruby・.NETで同じ番号)の仕様に合わせ、Python版で書いています。動作はmacOS上のChrome 155とPython 3.15で実行して確かめ、所要時間などの数値はその実測値です。

まとめ

  • Seleniumの中核はWebDriver:コードがdriver(ChromeDriverなど)へ命令を送り、driverがブラウザを動かします。分散実行のGrid、操作を記録するIDEもSeleniumプロジェクトの一部です。
  • ChromeDriverの手動ダウンロードは不要:4.6以降に同梱のSelenium Managerが、ブラウザに合うdriverを自動で取得してキャッシュします。pip install selenium だけで webdriver.Chrome() が動きます。
  • Python 3.10以上が必要:4.37.0でPython 3.9の対応が終わりました。macOS標準のPython 3.9.6で pip install selenium を実行すると、エラーも出ずに古い4.36.0が入ります。
  • 古い記事のコードは実行できない:find_element_by_* 系は4.3.0、executable_path などのコンストラクタ引数は4.10.0で削除済みです。
  • 待機は WebDriverWait に統一する:time.sleep() は遅くて不安定です。暗黙的待機5秒と明示的待機12秒を混ぜると、実測で16.6秒待ちました。
  • Selenium以外を選ぶ場面もある:HTTPで取れるデータならrequests、フロントエンド開発者だけで短期に立ち上げるE2EならPlaywrightのほうが速く済みます。

Seleniumとは|WebDriverでブラウザを動かす仕組みと構成要素

Seleniumは、人がブラウザで行う操作をコードで再現します。ページを開く、要素を探す、クリックする、文字を入力する。実際のChrome・Firefox・Edge・Safariを動かすため、JavaScriptで後から描画される要素もログインが必要なページも扱えます。ライセンスはApache License 2.0で、商用でも無料です。

スクリプト・driver・ブラウザの3層構造

Seleniumを使うとき、動いているプログラムは1つではありません。Pythonスクリプトがライブラリ(言語バインディング)を呼び、ライブラリがHTTPで chromedriver や geckodriver といったdriverプロセスへ命令を送り、driverがブラウザを操作します。この通信形式を定めているのがW3CのWebDriver仕様です。driverはブラウザベンダー自身が作っているため(ChromeDriverはChromiumチーム、geckodriverはMozilla)、ブラウザの内部が変わってもテストコードは書き換えずに済みます。

代わりに、1操作ごとにHTTPの往復が挟まります。これを補うのが双方向通信のWebDriver BiDiで、コンソールログやネットワーク通信をイベントとして受け取れます。Chrome専用のChrome DevTools Protocol(CDP)連携も残っていますが、公式ドキュメントは「CDP support is temporary until WebDriver BiDi has been implemented」(CDP対応はBiDiが実装されるまでの暫定措置)と書いています。Python版のリリースノートを見ると、4.51.0が対応するCDPはv153〜v155の直近3世代だけで、版ごとに1世代ずつ入れ替わります。CDPの機能を使うコードは、Seleniumを上げ続けないとChromeの更新で動かなくなります。

WebDriver・Grid・IDEの役割分担

構成要素 役割 使う場面
WebDriver コードからブラウザを操作 テスト・自動化の本体
Selenium Manager driver・ブラウザを自動取得 意識せず既定で動く
Grid 複数マシンへ命令を振り分け 並列・多ブラウザ実行
IDE 操作を記録して再生 学習・単発の確認

日常的に触るのはWebDriverです。公式の言語バインディングはJava・Python・JavaScript(Node.js)・C#・Rubyの5つで、どの言語もAPIの考え方は同じです。テスト本数が増えて実行時間が問題になったら、Selenium Gridとは|Grid 4の構成・環境構築とSelenium Serverとの違いで扱う分散実行へ進みます。

Selenium IDEは扱いが変わりました。公式ドキュメントは2026年10月9日の更新で、IDEを「standalone application」(Windows・macOS・Linux向けのスタンドアロンアプリ)と説明するようになり、ダウンロードページによれば旧来のブラウザ拡張(バージョン3)は保守終了で、Chrome ウェブストアからも取り下げられました(FirefoxとEdgeには残っています)。「Chromeの拡張機能として入れる」という解説は古い情報です。記録した操作は画面構造への依存が強いセレクタになるため、長期のテスト資産にはせず、流れを掴んだらコードへ書き起こします。

Seleniumを使わないほうがよい場面

ログイン後の画面遷移もJavaScriptによる描画も無いページなら、ブラウザを起動する構成は過剰です。HTMLがそのまま返るなら、requestsとBeautifulSoupとは?pip installと使い方(find・select)を解説【bs4 4.15】の組み合わせのほうが速く、壊れにくくなります。目安は、ブラウザの開発者ツールのネットワークタブで、欲しいデータがHTMLかJSONとして1回のリクエストで返ってくるかどうか。返ってくるならSeleniumは要りません。

テストツールとして選ぶかどうかは、下の「Playwright・Cypressとの比較」の章で判断基準を示します。

Seleniumのインストール|pip install seleniumとPythonのバージョン

必要な作業はこれだけです。driverを探してPATHに置く手順はもうありません。

python3 -m pip install selenium
python3 -c "import selenium; print(selenium.__version__)"   # 4.51.0 と出ればよい
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.selenium.dev/ja/")
print(driver.title)
driver.quit()

Selenium ManagerがChromeDriverを自動で取得する流れ

Selenium ManagerはRustで書かれたコマンドラインツールで、Selenium 4.6以降のライブラリに同梱されています。公式ドキュメントには「Selenium bindings use this tool by default」(バインディングが既定でこのツールを使う)とあり、コードに何も書かなくても動きます。driverが見つからないとき、インストール済みブラウザのバージョンを調べ、合うdriverをダウンロードして ~/.cache/selenium に保存します。

空のキャッシュからヘッドレスで起動するまでを4セット計測すると(import を含む)、初回は6.2〜9.6秒、キャッシュが効く2回目は3.5〜6.4秒で、2回目のほうが毎回1.3〜4.7秒短くなりました。初回はChromeDriver 155.0.8059.84が chromedriver/mac-x64/155.0.8059.84/ に保存されます。Chromeが自動更新で上がっても、次の起動時に新しいdriverを取り直すため、「This version of ChromeDriver only supports Chrome version …」という噛み合わせのエラーは起きにくくなりました。Selenium 4.11.0からはブラウザ本体の取得にも対応し、Chromeが入っていない環境ではChrome for Testingを取得します。

Python 3.9で4.36.0に止まる理由

PyPI上の4.51.0の要件は「Python 3.10以上」です。Python 3.9の対応は4.37.0(2025年10月17日)で終わり、公式ブログで事前に告知されていました。困るのは、古いPythonでもインストールが失敗しない点です。macOSに最初から入っている /usr/bin/python3(3.9.6)で pip install selenium を実行すると、古い版になることを知らせるエラーも警告も出ずに(表示されるのはpip自身の更新案内だけ)、3.9に対応する最後の版である4.36.0が入りました。

この状態では、ここ1年の修正(4.50.0でのFirefoxプロファイルの拡張機能・証明書関連の非推奨メソッドの削除など)が反映されません。インストール後は必ず selenium.__version__ を表示して、4.51.0になっているか確かめてください。古い版が出たら、Python 3.10以上で仮想環境を作り直します。

手動でdriverを渡すケースとオフライン環境

Selenium Managerは「driverが見つからないときに働くもの」です。公式ドキュメントも、driver管理は「opt-in」で、PATHに置く従来の運用も続けられると書いています。PATHの先頭に、呼ばれたら記録を残すだけの偽の chromedriver を置いて起動すると、driver.service.path はその偽物を指し、偽物の呼び出し記録が残りました。Seleniumはキャッシュのdriverを探しに行かず、PATH上の偽物を起動したということです。PATHに古いdriverが残っていると、自動取得より優先されてしまうということです。

外部へ出られない環境で SE_OFFLINE=true を設定し、キャッシュが空のまま起動すると、NoSuchDriverException: Unable to obtain driver for chrome で止まります。閉域網のCIでは、キャッシュディレクトリ(SE_CACHE_PATH で変更可)を事前に配っておくか、driverのパスを Service で渡します。削除された executable_path 引数の代わりがこれです。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

service = Service(executable_path="/usr/local/bin/chromedriver")
driver = webdriver.Chrome(service=service)

動かなくなった旧コードの書き換え|削除済みAPIと現行の書き方

4.10.0(2023年6月)より前の記事に多い書き方は、4.51.0ではそのまま動きません。実行すると次のエラーになります。

TypeError: WebDriver.__init__() got an unexpected keyword argument 'executable_path'
AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'
旧い書き方 削除版 現行の書き方
find_element_by_id("x") 4.3.0 find_element(By.ID, "x")
find_elements_by_class_name("x") 4.3.0 find_elements(By.CLASS_NAME, "x")
find_element_by_xpath("...") 4.3.0 find_element(By.XPATH, "...")
Chrome(executable_path="...") 4.10.0 Chrome(service=Service("..."))
Chrome(desired_capabilities=caps) 4.10.0 Chrome(options=options)
Chrome(chrome_options=opts) 4.10.0 Chrome(options=opts)
Chrome(service_log_path="...") 4.10.0 Service(log_output="...")

find_element_by_* 系の削除は、リリースノートに「Deprecated find_element_by_* and find_elements_by_* are now removed (#10712)」とある4.3.0です。コンストラクタ引数は4.10.0の「Remove significant amounts of deprecated code (#12030)」で消えました。手元のコードの世代を判定するなら、find_element_by と executable_path の2語で検索してください。1件でもヒットすれば、そのコードは現行版で動きません。

ブラウザ操作の基本|要素取得・入力・ウインドウとフレームの切り替え

ここから先は driver が生成済みである前提のコードです。

Byによる要素取得とXPathの使い分け

要素の取得は find_element(最初の1件)と find_elements(リスト)の2つです。第1引数に By の定数を渡します。

from selenium.webdriver.common.by import By

driver.find_element(By.ID, "search-box").send_keys("selenium")
driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
rows = driver.find_elements(By.XPATH, "//table[@id='result']/tbody/tr")
print(len(rows))

指定方法には優先順位があります。By.ID が使えるなら最優先、無ければ By.CSS_SELECTOR。XPathは「テキストで選ぶ」「親要素をたどる」など、CSSセレクタで書けない条件だけに使います。開発者ツールが生成した長いXPathを貼ると、画面構造が少し変わっただけで壊れます。find_elements は要素が無いとき例外でなく空リストを返すので、有無の判定にはこちらが向きます。

入力・値のクリア・クリック・スクロール

field = driver.find_element(By.NAME, "username")
field.clear()                 # 入力済みの値を消す
field.send_keys("test_user")
driver.find_element(By.ID, "login").click()

# ページ末尾までスクロール(無限スクロールの読み込みにも使う)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# 特定の要素が見える位置までスクロール
target = driver.find_element(By.ID, "footer-link")
driver.execute_script("arguments[0].scrollIntoView(true);", target)

clear() の後に get_attribute("value") を読むと空文字が返り、値が消えたことを確認できます。要素が画面外にあってクリックできないときは、scrollIntoView で位置を合わせます。

ウインドウサイズ・位置・タブとiframeの切り替え

ウインドウとフレームの操作は driver 側のメソッドです。

driver.maximize_window()               # 最大化
driver.set_window_size(1280, 800)      # サイズ指定
print(driver.get_window_size())        # {'width': 1280, 'height': 800}
driver.set_window_position(100, 50)
print(driver.get_window_position())    # {'x': 100, 'y': 50}
print(driver.title, driver.current_url)

# iframe の中の要素は、切り替えないと見つからない
driver.switch_to.frame("f")            # id・name・WebElement で指定
print(driver.find_element(By.ID, "inner").text)
driver.switch_to.default_content()     # 元の文書へ戻る

# 新しいタブを開いて切り替える
original = driver.current_window_handle
driver.switch_to.new_window("tab")
print(len(driver.window_handles))      # 2
driver.switch_to.window(original)

iframeを含むページで確かめると、切り替える前は find_elements(By.ID, "inner") が0件で、switch_to.frame() の後で取得できました。「要素はあるのに見つからない」ときに最初に疑う箇所です。ヘッドレスではウインドウサイズが既定値(計測では幅756×高さ556)になるため、レスポンシブ表示で要素が隠れないよう --window-size を明示します。

Shadow DOMの中の要素も通常の検索では0件です。ホスト要素の shadow_root から探すと取得できます。CSSセレクタのほか By.ID・By.CLASS_NAME・By.NAME・By.LINK_TEXT は通りましたが、By.XPATH と By.TAG_NAME は InvalidArgumentException: invalid locator になりました。仕組みはShadow DOMとは?カプセル化の仕組みとopen/closedの違いを実装例で解説で扱っています。

root = driver.find_element(By.ID, "host").shadow_root
root.find_element(By.CSS_SELECTOR, "#b").click()

ActionChainsが必要になる操作

ホバーで開くメニュー、ドラッグ&ドロップ、修飾キーの同時押しは ActionChains で組みます。perform() を呼ぶまで何も実行されない点が詰まりどころです。

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

menu = driver.find_element(By.ID, "menu")
ActionChains(driver).move_to_element(menu).perform()
item = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "sub-item")))
item.click()

# Ctrl+A(Macは Keys.COMMAND)
ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()

サブメニューは遅れて描画されることが多いため、ホバーを先に実行し、項目は WebDriverWait で取得してからクリックします。

検索から一覧取得・CSV保存までの一連の実装

import csv

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)

try:
    driver.get("https://example.com/search")

    box = wait.until(EC.element_to_be_clickable((By.NAME, "q")))
    box.send_keys("selenium", Keys.RETURN)

    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".result")))
    rows = driver.find_elements(By.CSS_SELECTOR, ".result")

    with open("results.csv", "w", newline="", encoding="utf-8-sig") as f:
        writer = csv.writer(f)
        writer.writerow(["title", "url"])
        for row in rows:
            link = row.find_element(By.CSS_SELECTOR, "a")
            writer.writerow([link.text, link.get_attribute("href")])
finally:
    driver.quit()

リンクを row.find_element() と行から辿ると、行ごとの対応が崩れません。utf-8-sig はExcelで開いたときの文字化け対策、try/finally は例外時にブラウザのプロセスを残さないための囲みです。

待機処理の設計|time.sleepからWebDriverWaitへの置き換え

入門記事でよく見る誤りが time.sleep(2) です。ページが0.3秒で表示されても2秒待ち、回線が遅れて3秒かかった日には落ちる。Seleniumには、条件が満たされた時点で先へ進む明示的待機があります。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)

# クリックできる状態になるまで最大10秒待つ
wait.until(EC.element_to_be_clickable((By.ID, "submit"))).click()

# ローディング表示が消えるまで待つ
wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, "loading")))

presence_of_element_located はDOMに存在するかだけを見ます。他の要素に覆われていてもクリックは失敗するため、ボタンを押す前は element_to_be_clickable を使います。

暗黙的待機と明示的待機を混ぜたときの待ち時間

公式ドキュメントは「Do not mix implicit and explicit waits」と警告し、暗黙的待機10秒と明示的待機15秒で20秒後にタイムアウトしうる例を挙げています。存在しない要素を待たせて計測した結果が次の表です。

暗黙的待機 明示的待機 タイムアウトまで
なし 3秒 3.03秒
5秒 3秒 5.09秒
5秒 12秒 16.61秒

明示的待機は条件を繰り返し確かめますが、混在させると1回の確認ごとに暗黙的待機の5秒が丸ごとかかります。そのため3秒の指定は5秒の待ちが終わるまで打ち切られず、12秒の指定は3回目の確認が終わる16.6秒まで延びました。CIの所要時間が読めなくなるので、implicitly_wait() は一切使わず明示的待機だけで統一してください。

待機を入れても落ちるなら、原因は待ち時間ではありません。単体で実行すると通り、まとめて実行すると落ちるなら、テスト同士が同じデータを奪い合っています。待機を延ばしても直らないので、テストごとにデータを分けます。

テスト自動化への組み込み|pytest・ヘッドレス・CI

テストとして回すには、driverの生成と後始末を仕組み側に寄せ、画面なしで動く形にします。

pytestのフィクスチャと失敗時のスクリーンショット

conftest.py にdriverのフィクスチャを置くと、テスト本体は検証したいことだけになります。次の例は、失敗したテストに限って画面を保存します。

# conftest.py
import os

import pytest
from selenium import webdriver


@pytest.hookimpl(wrapper=True)
def pytest_runtest_makereport(item, call):
    rep = yield
    setattr(item, "rep_" + rep.when, rep)
    return rep


@pytest.fixture
def driver(request):
    options = webdriver.ChromeOptions()
    options.add_argument("--headless=new")
    options.add_argument("--window-size=1920,1080")
    d = webdriver.Chrome(options=options)
    yield d
    rep = getattr(request.node, "rep_call", None)
    if rep is not None and rep.failed:
        os.makedirs("artifacts", exist_ok=True)
        d.save_screenshot(f"artifacts/{request.node.name}.png")
    d.quit()
# test_login.py
from selenium.webdriver.common.by import By


def test_login_shows_dashboard(driver):
    driver.get("https://example.com/login")
    driver.find_element(By.ID, "username").send_keys("test_user")
    driver.find_element(By.ID, "password").send_keys("secret")
    driver.find_element(By.ID, "login").click()
    assert driver.find_element(By.CSS_SELECTOR, "h1").text == "ダッシュボード"

pytest 9.1.1で、検証の失敗(AssertionError)と要素が見つからない失敗(NoSuchElementException)の両方で画像が残ることを確かめています。テストの中で AssertionError だけを捕まえて撮る書き方だと、要素が見つからない失敗では画像が残りません。保存先を先に作るのは、save_screenshot() がディレクトリの無いときに例外も警告も出さず False を返すだけだからです。

テストが増えたら、ページごとの操作をPage Object Model(POM)とは?Playwright・Seleniumの実装例と保守コストの実測の形でクラスへ切り出すと、画面変更時の修正が1か所に収まります。キーワード駆動で書きたいならRobot Frameworkとは?Pythonのテスト自動化の使い方と主要ライブラリ【7.5対応】のSeleniumLibraryも選択肢です。

GitHub Actionsでのヘッドレス実行

ヘッドレスの指定は --headless=new です。Chrome 132以降は旧ヘッドレス実装が chrome-headless-shell という別バイナリに分かれたため、古い記事の --headless=old は使えません。

GitHub Actionsのubuntu-24.04ランナーにはブラウザが同梱されています。2026年10月12日版のイメージ(20261012.334.1)では、一覧上のGoogle ChromeとChromeDriverはどちらも155.0.8059.39、Firefoxは157.0とGeckodriver 0.37.1です。

# .github/workflows/e2e.yml
name: e2e
on: [push, pull_request]

jobs:
  e2e:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-python@v7
        with:
          python-version: "3.13"
      - run: pip install selenium pytest
      - run: pytest -v
      - if: failure()
        uses: actions/upload-artifact@v7
        with:
          name: screenshots
          path: artifacts/

この構成ではSelenium Managerによるダウンロードは起きません。ランナーの構築スクリプトがchromedriverを /usr/bin へシンボリックリンクしており、PATH上で見つかるからです。前の章で確かめたとおりPATH上のdriverが優先されるので、ランナー同梱のChromeとChromeDriverの組み合わせで動きます。テスト基盤をCIへ載せる設計から任せたい場合は、DevOps・CI/CD導入支援で構築から運用の引き継ぎまで請け負っています。

docker-seleniumによるブラウザ版の固定

ランナー同梱のブラウザは、ランナーイメージが更新されるたびに変わります。手元とCIで同じブラウザ版に固定したいなら、Seleniumプロジェクトが配布するdocker-seleniumのイメージを使います。

docker run -d -p 4444:4444 -p 7900:7900 --shm-size="2g" selenium/standalone-firefox:4.51.0-20261010
from selenium import webdriver

driver = webdriver.Remote("http://localhost:4444", options=webdriver.FirefoxOptions())

READMEは、ブラウザ入りのイメージを起動するときは --shm-size=2g を付けること、タグは日付まで含めた完全な形で固定することを求めています。localhost:7900 をブラウザで開くと、コンテナ内の画面をnoVNCで見られます(READMEの既定パスワードは secret)。Apple シリコンなどのarm64ではChrome・Chromium・Firefoxのイメージは使えますが、EdgeとChrome for Testingのイメージは非対応です。

Playwright・Cypressとの比較|Seleniumを選ぶ条件と見送る場面

E2Eテストの代表的なツールはこの3つです。違いはブラウザとのつなぎ方で、それが対応範囲の差になっています。

観点 Selenium 4.51 Playwright Cypress
記述言語 Java・Python・JS・C#・Ruby JS/TS・Python・Java・.NET JS/TS
ブラウザとの接続 W3C WebDriver(driver経由) WebSocketで常時接続 ブラウザ内で実行
Safari 本物のSafariを操作 WebKitのビルドで代替 WebKitは実験的対応
ブラウザの用意 手元のブラウザか自動取得 専用ビルドをCLIで取得(手元のChrome・Edgeも可) 手元のブラウザかElectron

Seleniumを選ぶのは、次のどれかに当てはまるときです。Firefox・Edge・Safariを含む複数ブラウザでの動作保証が要件になっている。テストをJavaやC#で書き、業務システム側のコード資産に合わせたい。Seleniumで書いたテストが既に数百本あり、書き直す費用を正当化できない。

逆に、ReactやVueの画面のE2Eをフロントエンド開発者だけで短期に立ち上げるなら、Seleniumは選びません。PlaywrightやCypressのほうが最初の1本まで速く、待機も自動で入ります。違いの詳細はPlaywright(プレイライト)とは?仕組み・できること・Seleniumとの違いを解説、ツール選定の前提になるテスト設計はE2E(エンドツーエンド)テストのベストプラクティス|結合テストとの違いとツール選定にまとめています。

今後の版についても触れておきます。リポジトリにはSelenium 5の計画書がありますが、状態は「Proposed」(提案段階)で、公開時期の記載はありません。CDP対応の非推奨化・削除は、Selenium 5の範囲外と明記されています。計画書は、代替を用意して非推奨にし、2リリース後に削除するという既存の方針に従うと明記しています。4.51.0で非推奨の警告が出ないコードを保っておけば、移行の負担は小さく済みます。

よく詰まるエラーと切り分け手順

例外の型を見れば原因の当たりがつきます。

  • NoSuchElementException:要素が見つからない。多くは描画前なので、まず WebDriverWait を挟みます。それでも出るならiframe内(switch_to.frame())かShadow DOM内(shadow_root)を疑います。
  • ElementClickInterceptedException:クリック対象が他の要素に覆われている。Cookie同意バナーや固定ヘッダーが定番です。バナーを閉じるか、scrollIntoView で位置をずらします。
  • StaleElementReferenceException:取得済みの要素が再描画で無効になった。操作の直前に取得し直します。
  • SessionNotCreatedException:ブラウザとdriverの組み合わせが合わない。PATH上の古いdriverが優先されて起きることが多いので、which chromedriver で確認し、不要なら削除します。
  • NoSuchDriverException:driverを取得できない。社内プロキシで外へ出られないか、SE_OFFLINE=true でキャッシュが空です。プロキシは SE_PROXY で指定できます。

場所が分からないときは、--headless=new を一時的に外して実際の画面を見るのが早道です。

スクレイピング用途で守る範囲

収集の前に、対象サイトの利用規約と robots.txt を確認します。自動アクセスを禁止しているなら、技術的に可能でも実施できません。アクセスの間隔を空け、個人情報を含むデータは個人情報保護法上の扱いに従います。CAPTCHAや「人間であることを確認してください」の画面で止まったら、そのサイトは自動収集を想定していないと判断してください。検知を回避する行為は規約違反になり、IDとパスワードなどのアクセス制御を突破する形なら不正アクセス禁止法の問題にもなりえます。法務面の判断はスクレイピングとは?クローリング・APIとの違いと実装・法務の判断を解説で整理しています。

よくある質問

Seleniumは無料で使えますか?

無料です。ライブラリ、Selenium Manager、Grid、IDEのいずれもApache License 2.0で公開されており、商用プロジェクトでも費用はかかりません。費用が出るのは周辺で、実行用サーバーのインフラ代や、クラウドの実機テストサービスを使う場合の利用料です。

SeleniumとRPAの違いは何ですか?

Seleniumが操作できるのはWebブラウザの中だけで、コードで書きます。RPAツールはデスクトップアプリやExcelまで含めて操作でき、多くは画面上で手順を組み立てます。ブラウザ内で完結し、コードを保守できる人がいるならSelenium、複数のアプリをまたぐ業務を現場の担当者が組むならRPAが向きます。

Seleniumで使える言語は?

公式の言語バインディングはJava・Python・JavaScript(Node.js)・C#・Rubyの5つで、4.51.0は5言語とも2026年10月9日に同じ番号で公開されました。KotlinはJVM上でJavaのバインディングを呼び出して使います。機能差はほとんど無いため、テストを保守する人が普段使う言語に合わせます。

ChromeDriverのダウンロードは今も必要ですか?

Selenium 4.6以降なら不要です。webdriver.Chrome() を引数なしで呼ぶと、Selenium ManagerがChromeのバージョンに合うdriverを取得し、~/.cache/selenium に保存します。手動でPATHに置く手順を説明している記事は4.6より前の情報です。外部通信が遮断された環境だけは、事前にキャッシュを用意するか、Service でdriverのパスを渡します。

Seleniumの弱点は何ですか?

対象がWebブラウザに限られることです。デスクトップアプリは操作できず、スマートフォンのネイティブアプリにはAppiumのような別ツールが要ります。1操作ごとにdriverとの通信が挟まるため、1台で直列に回すと本数に比例して時間がかかり、規模が大きくなるとGridでの並列実行が前提になります。待機を自動では入れないため、待機の設計を誤るとテストは不安定です。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

ほか 2 件の記事からもリンクされています。

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.07.21 テックブログ Apache Tomcatの脆弱性一覧【2026年10月】最新版11.0.27・10.1.61・9.0.123とCVE-2026-59083ほかの影響確認・対応手順
  2. 2026.10.21 テックブログ NEC委託先の不正アクセスとは|顧客システム暗号化・情報漏えいの経緯と委託元が点検する正規アカウント
  3. 2026.10.22 テックブログ Tomcatバージョン一覧とサポート期限【2026年10月】9.0系は2027年3月末で終了・9.1系と11.0系への移行判断
  4. 2026.10.21 テックブログ ふるさとチョイス不正アクセスで445万件流出:対象確認・パスワード変更と再開時期
  5. 2026.05.15 テックブログ scrcpyの最新版は5.0|ハードウェアデコード対応とインストール・使い方【2026年10月】

RELATED POSTS 関連記事

目次