◤Python無料教材配布◢ JobCodeメールマガジン実施中!

【Python】SeleniumにおけるWebDriverの使い方を徹底解説!

‎python-selenium-webdriver

Seleniumは、ChromeやEdgeなどのブラウザを自動的に操作するライブラリです。

利用用途として、WebサイトやWebアプリケーションの単体テスト、Webスクレイピングによるデータ収集に使われます。

また、Seleniumライブラリで制御するのがWebdriverになります。

本記事では、SeleniumにおけるWebdriverの使い方を解説します。

筆者の経歴
  • SIer/Web系企業での実務経験があるフリーランスエンジニア
  • プログラミングスクールでの講師実績あり
  • HR領域によるエンジニア特化の採用代行を業務委託で兼務
▼【無料配布】Python基礎学習教材のプレゼント実施中!▼

本記事をお読み頂いているPython初学者向けに、メルマガ登録にてPython基礎学習教材の無料配布を実施しています。

以下に無料配布するPython資料をご紹介します。

無料配布するPython各資料
  • Python入門ガイド
  • Python基礎知識ガイド
  • tkinter基礎知識ガイド
  • 【tkinter製】デスクトップアプリフォルダ
Python入門ガイドの概要

Python入門ガイドは、Python初学者向けに市場の動向や今後のプログラミングのヒントをまとめた資料になります。

以下は、Python入門ガイドの目次になります。(大枠のみ記載)

Python入門ガイドの目次(大枠)
  • Pythonとは
  • Pythonの動向
  • Pythonを学習するメリット
  • Pythonからプログラミングを始める

上記の目次から、Pythonの特徴/開発領域/ビジネス市場の動向/仕事幅の増やし方など様々な観点で図解化しています。

Python基礎知識ガイドの概要

Python基礎知識ガイドは、Pythonをこれから始めたい人へコーディング中心にまとめた学習教材になります。

以下は、Python基礎知識ガイドの目次になります。(大枠のみ記載)

Python基礎知識ガイドの目次(大枠)
  1. Pythonの実行方法
  2. Pythonプログラムの基本構造
  3. 基本データ
  4. コレクション
  5. 条件分岐
  6. ループ
  7. 関数
  8. クラス
  9. モジュールとパッケージ

上記の目次から、コーディングルール/実例コードによる解説/各機能の注意点など初学者が理解しておくべき学習ポイントを集約させました。

tkinter基礎知識ガイドの概要

tkinter基礎知識ガイドは、Pythonによるデスクトップアプリ開発をこれから始めたい人へGUIコーディング中心にまとめた学習教材になります。

以下は、tkinter基礎知識ガイドの目次になります。

tkinter基礎知識ガイドの目次
  1. tkinterの特徴
  2. 基本的な使い方
  3. 代表的なウィジェット
  4. レイアウト管理
  5. イベントとコールバック
  6. カスタマイズと拡張
  7. tkinterの構造(オブジェクト指向的設計)
  8. tkinterを扱う際の注意点
  9. tkinter製デスクトップアプリケーション例

特にGUIのデザイン性やtkinterによるアプリ開発に利用しやすいよう設計しております。

【tkinter製】デスクトップアプリフォルダ

【tkinter製】デスクトップアプリフォルダは、tkinterによるデスクトップアプリ開発をこれから始めたい人へサンプルアプリをまとめた管理フォルダになります。

以下は、【tkinter製】デスクトップアプリフォルダに格納しているサンプルアプリになります。

【tkinter製】デスクトップアプリフォルダ
  • 【tkinter製】デスクトップ用メモアプリ
  • 【tkinter製】デスクトップ用ToDoアプリ
  • 【tkinter製】デスクトップ用AI(Gemini)機能付きメモアプリ
  • Excel業務効率化ツール
  • CSVファイル結合ツール
  • Webサイト監視ツール
  • GoogleMapsデータ収集ツール
python-tools-to-automate-business-workflows-004
python-tools-to-automate-business-workflows-007
python-tools-to-automate-business-workflows-008

また、メルマガ登録の特典も今後増やしていく予定です。

特典1Pythonに限らずビジネス/その他技術関連の資料配布
特典2メルマガ登録者限定のPython資料配布

各資料データに関しては不定期の更新になりますが、メルマガ登録者へ優先的にお知らせします。

記事ではお伝えできない内容を多分に含むため、メルマガ登録者限定にさせて頂きました。

STEP
メールマガジンに登録

JobCode メールマガジン登録画面にてメールアドレスのみ入力いただき、読者登録して頂きます。

STEP
登録完了後すぐにメールが届く

添付されているドライブURLにアクセスし、各無料配布ファイルを受け取りください。

\ メールアドレスのみで10秒登録! /

メルマガ登録が100名に到達した時点で締め切りになります。

目次

Seleniumとは

Seleniumは、ブラウザを自動的に操作するライブラリであるため、自動化テストの実施やWebスクレイピングに利用されます。

また、SeleniumはWebサイト・Webアプリに対してブラウザ操作するため、静的ページで構成されたサイトだけでなく動的ページにも対応できます。

特に、SNS等のWebサイト・Webアプリも操作できるので、ログイン機能などが実装されるページにおいても対応できる利点があります。

Seleniumによる要素検索・要素抽出を詳しく知りたい人は、「【業務自動化】Seleniumとは?インストールから使い方まで徹底解説!」を一読ください。

関連記事は、自動化やスクレイピングで利用されるseleniumの使い方を解説してます。
また、データ収集方法や待機処理などのコードも記載してます。

Seleniumライブラリのクラス/メソッド一覧

Seleniumライブラリには多くのクラスとメソッド/引数が存在します。

ここでは、各クラスにおけるメソッドと引数をまとめます。

Seleniumにおける主なクラス
  • WebDriver
  • WebElement
  • By
  • Options
  • Service
  • ActionChains
  • Select
  • Alert

Seleniumにおける各クラスのメソッドと引数を確認していきましょう。

WebDriver

WebDriverクラスは、Seleniumでブラウザを操作する中心的なインターフェースです。

ブラウザ起動、Webページへのアクセス、ページ内の要素を検索/操作などの機能を提供します。

このクラスは、ChromeやFirefox/Edgeなど各種ブラウザに対応しており、操作の一貫性を保ちつつ自動化が可能です。

Seleniumを使った自動化スクリプトは、主にWebDriverのメソッドを通じて動作します。

スクロールできます
メソッド名引数説明
get(url)url (str)指定URLにブラウザを遷移させる
close()なし現在のウィンドウを閉じる
quit()なしブラウザ全体を終了する
find_element(by, value)by (By)、value (str)単一要素を取得
find_elements(by, value)by (By)、value (str)一致するすべての要素を取得
execute_script(script, *args)script (str)、args (任意)JavaScriptを実行
get_screenshot_as_file(path)path (str)スクリーンショットをファイル保存
get_cookies()なし現在の全クッキーを取得
add_cookie(cookie_dict)cookie_dict (dict)クッキーを追加
delete_all_cookies()なしすべてのクッキーを削除
back()なしブラウザで1ページ戻る
forward()  なしブラウザで1ページ進む
refresh()なしページをリロードする
maximize_window()なしウィンドウを最大化する
minimize_window()なしウィンドウを最小化する
set_window_size(w, h)w (int), h (int)ウィンドウサイズを設定
set_window_position(x, y)x (int), y (int)ウィンドウ位置を設定
switch_to.frame(frame)frame (index/id/element)指定フレームに切り替える
switch_to.default_content()なしフレーム外に戻る
switch_to.window(handle)handle (str)ウィンドウを切り替える
get_window_handles()なし開いているすべてのウィンドウハンドルを取得
get_window_handle()なし現在のウィンドウハンドルを取得
title(プロパティ)なし現在のページタイトルを取得
current_url(プロパティ)なし現在のURLを取得
WebDriverクラスの主要メソッド一覧
get(url)
driver.get("https://www.example.com")
close()
driver.close()  # 現在のタブを閉じる
quit()
driver.quit()  # すべてのタブとブラウザプロセスを終了
find_element()
from selenium.webdriver.common.by import By
element = driver.find_element(By.ID, "username")
find_elements()
elements = driver.find_elements(By.CLASS_NAME, "item")
execute_script()
driver.execute_script("alert('Hello from Selenium!')")
get_screenshot_as_file()
driver.get_screenshot_as_file("screenshot.png")
get_cookies()
cookies = driver.get_cookies()
add_cookie()
driver.add_cookie({"name": "mycookie", "value": "abc123"})
delete_all_cookies()
driver.delete_all_cookies()
back() / forward()
driver.back()
driver.forward()
refresh()
driver.refresh()
maximize_window() / minimize_window()
driver.maximize_window()
driver.minimize_window()
set_window_size() / set_window_position()
driver.set_window_size(1024, 768)
driver.set_window_position(100, 200)
switch_to.frame() / switch_to.default_content()
driver.switch_to.frame("iframe1")  # フレームに入る
driver.switch_to.default_content()  # フレームから出る
switch_to.window()
handles = driver.get_window_handles()
driver.switch_to.window(handles[1])  # 2つ目のタブへ
title / current_url
print(driver.title)
print(driver.current_url)

WebElement

WebElementクラスは、Seleniumで取得したページ上のHTML要素を表すオブジェクトです。

テキストの取得/クリック/入力/属性の取得など、ブラウザ上の要素に対する直接操作を提供します。

WebElementのインスタンスは、find_element()やfind_elements()にて取得されます。

ユーザーの代わりにボタンを押したり、フォームに入力したりといった自動化の核心的役割を担います。

スクロールできます
メソッド名 / プロパティ引数説明
click()なし要素をクリックする
submit()なしフォームを送信する
send_keys(*value)value: str要素にキー入力する
clear()なし入力フィールドをクリアする
get_attribute(name)name: str属性の値を取得する
get_dom_attribute(name)name: strDOM上の属性値を取得(非標準属性含む)
get_property(name)name: strJavaScriptのプロパティを取得
is_displayed()なし要素が表示されているかを確認
is_enabled()なし要素が有効かを確認
is_selected()なし選択状態かを確認(ラジオボタン等)
screenshot(filename)filename: str要素のスクリーンショットを保存
find_element(by, value)by, value子要素を1つ取得
find_elements(by, value)by, value子要素をすべて取得
value_of_css_property(name)name: strCSSプロパティの値を取得
tag_name(プロパティ)なし要素のタグ名を取得
text(プロパティ)なし要素内のテキストを取得
rect(プロパティ)なし要素の位置とサイズ情報を取得
location(プロパティ)なし要素の座標を取得
size(プロパティ)なし要素のサイズ(幅と高さ)を取得
WebElementクラスの主要メソッド一覧
click()
element = driver.find_element(By.ID, "submit-btn")
element.click()
submit()
form = driver.find_element(By.ID, "login-form")
form.submit()
send_keys()
input_box = driver.find_element(By.NAME, "username")
input_box.send_keys("admin123")
clear()
input_box.clear()
get_attribute()
href = element.get_attribute("href")
get_dom_attribute()
custom_attr = element.get_dom_attribute("data-custom-id")
get_property()
value = element.get_property("value")
is_displayed()
if element.is_displayed():
    print("表示されています")
is_enabled()
if element.is_enabled():
    print("操作可能です")
is_selected()
checkbox = driver.find_element(By.ID, "agree")
print(checkbox.is_selected())
screenshot()
element.screenshot("element.png")
find_element()(子要素)
table = driver.find_element(By.ID, "user-table")
row = table.find_element(By.TAG_NAME, "tr")
find_elements()(複数子要素)
rows = table.find_elements(By.TAG_NAME, "tr")
value_of_css_property()
color = element.value_of_css_property("color")
tag_name(プロパティ)
print(element.tag_name)  # 例: 'input'
text(プロパティ)
print(element.text)
rect
print(element.rect)  # {'height': 20, 'width': 100, 'x': 10, 'y': 50}
location
print(element.location)  # {'x': 10, 'y': 50}
size
print(element.size)  # {'width': 100, 'height': 20}

By

Byクラスは、SeleniumでHTML要素を検索する際に使用する定数を提供します。

find_element()やfind_elements()メソッドと組み合わせて使用し、ID/クラス名/CSSセレクタ/XPathなど多様な方法で要素を特定できます。

可読性・保守性を高めるために、By.IDやBy.CSS_SELECTORのように使うことが推奨されます。

スクロールできます
定数名利用できる引数の形式説明
By.ID“id値”HTMLのid属性による検索
By.NAME“name値”HTMLのname属性による検索
By.CLASS_NAME“class値”要素のクラス名による検索
By.TAG_NAME“タグ名”HTMLタグ名(例:div, a)による検索
By.LINK_TEXT“リンク文字列”<a>タグのリンク文字列と完全一致で検索
By.PARTIAL_LINK_TEXT“部分文字列”<a>タグのリンク文字列の一部と一致するものを検索
By.CSS_SELECTOR“セレクタ文字列”CSSセレクタによる検索(柔軟・高速)
By.XPATH“XPath文字列”XPathによる構造的な検索
Byクラスの定数一覧
By.ID
from selenium.webdriver.common.by import By
element = driver.find_element(By.ID, "login-button")
By.NAME
element = driver.find_element(By.NAME, "username")
By.CLASS_NAME
element = driver.find_element(By.CLASS_NAME, "alert")
By.TAG_NAME
element = driver.find_element(By.TAG_NAME, "footer")
By.LINK_TEXT
element = driver.find_element(By.LINK_TEXT, "お問い合わせ")
By.PARTIAL_LINK_TEXT
element = driver.find_element(By.PARTIAL_LINK_TEXT, "問い")
By.CSS_SELECTOR
element = driver.find_element(By.CSS_SELECTOR, "div.alert > span.message")
By.XPATH
element = driver.find_element(By.XPATH, "//div[@class='alert']/span")
よくある使い方の例(まとめ)
# 例: ログインボタンをIDで取得してクリック
driver.find_element(By.ID, "login-btn").click()
# 例: フォーム入力
driver.find_element(By.NAME, "email").send_keys("user@example.com")
# 例: 複数要素取得
items = driver.find_elements(By.CLASS_NAME, "product-item")
# 例: CSSセレクタによる階層検索
driver.find_element(By.CSS_SELECTOR, "#main > ul > li:nth-child(2)")

Options

Optionsクラスは、ブラウザドライバー(ChromeやFirefoxなど)の起動時に使用するオプション設定を構成するクラスです。

ユーザーの指定により、ヘッドレスモード/拡張機能の追加/起動引数の設定/プロファイルの指定などが可能になります。

webdriver.Chrome(options=…) のようにOptionsオブジェクトを渡して使います。

ブラウザごとにChromeOptions,FirefoxOptions,EdgeOptionsなどが用意されています。

以下は、ChromeOptionsを基点に主要メソッド一覧を記載します。

スクロールできます
メソッド名引数説明
add_argument(argument)argument: strコマンドライン引数を追加(例:–headless)
add_experimental_option(name, value)name: str, value: AnyChromeの実験的オプションを追加
add_extension(path)path: strChrome拡張機能(.crx)の追加
add_encoded_extension(encoded)encoded: bytesbase64でエンコードされた拡張機能の追加
set_headless(headless=True)headless: boolヘッドレスモードを有効化(非推奨、add_argument推奨)
set_capability(name, value)name: str, value: AnyDesired Capabilitiesを個別に設定
to_capabilities()なし現在のオプション設定をcapabilities辞書として返す
set_binary(path)path: strChromeの実行ファイルのパスを指定
accept_insecure_certs(属性)True/Falseセルフ署名証明書などの許可
Optionsクラスの主要メソッド一覧
add_argument()
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless")
options.add_argument("--window-size=1280,800")
add_experimental_option()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
add_extension()
options.add_extension("/path/to/extension.crx")
add_encoded_extension()
with open("my_ext.crx", "rb") as f:
    encoded = f.read()
options.add_encoded_extension(encoded)
set_headless()
options.set_headless(True)  # ⚠️ 非推奨、--headless を add_argument で使うべき
set_capability()
options.set_capability("goog:loggingPrefs", {"performance": "ALL"})
to_capabilities()
caps = options.to_capabilities()
print(caps)
set_binary()
options.set_binary("/usr/bin/google-chrome-stable")
accept_insecure_certs
options.accept_insecure_certs = True
起動時にOptionsを使う例
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless")
options.add_argument("--disable-gpu")

driver = webdriver.Chrome(options=options)

Service

Serviceクラスは、Seleniumで使用するブラウザドライバー自体の起動・停止を制御するクラスです。

従来はexecutable_pathを直接webdriver.Chrome()に渡していましたが、Selenium4以降はServiceクラスの使用が推奨されています。

ドライバーのログ出力/ポート番号/環境変数などの高度な制御も可能になります。

Chrome,Firefox,Edgeなど各ブラウザごとに専用のサブクラス(例:ChromeService)があります。

スクロールできます
メソッド名 / プロパティ引数説明
__init__()executable_path=None, port=0, service_args=None, env=None, log_path=NoneServiceオブジェクトを初期化
tart()なしドライバーサービスを起動
top()なしドライバーサービスを停止
is_connectable()なしサービスが接続可能か確認
assert_process_still_running()なしプロセスがまだ生きているかを確認(例外を投げる)
command_line_args()なし実行時の引数をリストで取得
send_remote_shutdown_command()なしリモートでシャットダウン要求を送信(内部使用)
Serviceクラスの主要メソッド/プロパティ一覧

また、初期化引数の詳細については以下になります。

スクロールできます
引数名説明
executable_pathstrドライバーのパス(例:chromedriver)
portint使用するポート(0指定で自動割り当て)
service_argslist起動時に渡す追加引数
envdict環境変数の指定
log_pathstrログファイルのパス指定
初期化引数
__init__()(Service の作成)
from selenium.webdriver.chrome.service import Service as ChromeService

service = ChromeService(executable_path="/path/to/chromedriver", log_path="chrome.log")
start()
service.start()
print(f"Service started at {service.service_url}")
stop()
service.stop()
is_connectable()
if service.is_connectable():
    print("サービスに接続可能です")
assert_process_still_running()
try:
    service.assert_process_still_running()
except Exception as e:
    print("ドライバープロセスが停止しています", e)
command_line_args()
args = service.command_line_args()
print("実行時引数:", args)
send_remote_shutdown_command()(内部用途)
# 通常使用しません(例: テストや拡張時)
service.send_remote_shutdown_command()
WebDriverへの組み込み例
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService

service = ChromeService(executable_path="/path/to/chromedriver")
driver = webdriver.Chrome(service=service)

driver.get("https://example.com")
driver.quit()

その他のブラウザ向けServiceクラスは以下になります。

スクロールできます
ブラウザインポート名
Chromefrom selenium.webdriver.chrome.service import Service
Firefoxfrom selenium.webdriver.firefox.service import Service
Edgefrom selenium.webdriver.edge.service import Service

各クラスは同じインターフェースを持っています。

ActionChains

ActionChainsクラスは、Seleniumで複雑なユーザー操作(マウスの移動/ドラッグ&ドロップ/右クリック/キーボード操作など)をシミュレートするクラスです。

複数の操作をチェーン形式で順に記述し、perform()を呼び出すことで実行できます。

特に、ホバー操作/クリック&ホールド/キーボードショートカットの再現に便利です。

スクロールできます
メソッド名引数説明
click(on_element=None)on_element: WebElement(任意)要素上または現在の位置で左クリック
click_and_hold(on_element=None)on_element: WebElement(任意)要素をクリックしたまま保持
context_click(on_element=None)on_element: WebElement(任意)要素上または現在の位置で右クリック
double_click(on_element=None)on_element: WebElement(任意)要素上でダブルクリック
drag_and_drop(source, target)source, target: WebElement要素を別の要素へドラッグ&ドロップ
drag_and_drop_by_offset(source, xoffset, yoffset)source: WebElement, xoffset: int, yoffset: int指定ピクセル分ドラッグ
move_by_offset(xoffset, yoffset)xoffset, yoffset: int現在の位置から指定オフセットへ移動
move_to_element(to_element)to_element: WebElement要素の中央にマウスを移動(ホバー)
move_to_element_with_offset(to_element, xoffset, yoffset)to_element: WebElement, xoffset: int, yoffset: int要素の一部(オフセット)に移動
key_down(value, element=None)value: str, element: WebElement(任意)キーを押下
key_up(value, element=None)value: str, element: WebElement(任意)キーを放す
send_keys(*keys_to_send)*keys_to_send: strキー入力を送信
pause(seconds)seconds: float指定秒数の待機を挿入
release(on_element=None)on_element: WebElement(任意)押されたマウスボタンを放す
perform()なしすべての操作を一括実行
ActionChainsクラスの主要メソッド一覧
click()
from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
actions.click().perform()
click_and_hold()
element = driver.find_element(By.ID, "drag-item")
actions.click_and_hold(element).pause(1).release().perform()
context_click()
element = driver.find_element(By.ID, "menu")
actions.context_click(element).perform()
double_click()
element = driver.find_element(By.ID, "button")
actions.double_click(element).perform()
drag_and_drop()
source = driver.find_element(By.ID, "item")
target = driver.find_element(By.ID, "dropzone")
actions.drag_and_drop(source, target).perform()
drag_and_drop_by_offset()
element = driver.find_element(By.ID, "item")
actions.drag_and_drop_by_offset(element, 100, 0).perform()
move_by_offset()
actions.move_by_offset(50, 100).click().perform()
move_to_element()
element = driver.find_element(By.ID, "hover-item")
actions.move_to_element(element).perform()
move_to_element_with_offset()
actions.move_to_element_with_offset(element, 10, 10).click().perform()
key_down() / key_up()
from selenium.webdriver.common.keys import Keys
input_box = driver.find_element(By.ID, "input")
actions.key_down(Keys.SHIFT).send_keys("hello").key_up(Keys.SHIFT).perform()
send_keys()
actions.send_keys("Hello Selenium!").perform()
pause()
actions.pause(2).click(element).perform()
release()
actions.click_and_hold(element).pause(1).release().perform()
perform()
actions.move_to_element(element).click().perform()
よくあるチェーン例(実践)
#ドラッグ&ドロップ
actions.click_and_hold(source).move_to_element(target).release().perform()
#ホバーして表示されたメニューをクリック
actions.move_to_element(menu).click(sub_item).perform()

Select

Selectクラスは、HTMLの<select>タグを操作する専用ユーティリティです。

select,deselect,get_optionsなど、ドロップダウンメニューの操作を直感的に行えます。

複数選択が可能な<select multiple>要素にも対応しており、is_multipleプロパティで確認できます。

単純なclick()より堅牢で、選択肢の値や表示テキストに基づいて操作できます。

スクロールできます
メソッド名・プロパティ引数説明
__init__(webelement)<select>要素(WebElement)Selectオブジェクトの初期化
select_by_value(value)value: str<option value=”…”> の値で選択
select_by_index(index)index: intインデックス番号(0始まり)で選択
select_by_visible_text(text)text: str表示テキストで選択
deselect_all()なし全選択を解除(multipleのみ)
deselect_by_value(value)value: str指定のvalueを解除
deselect_by_index(index)index: int指定インデックスを解除
deselect_by_visible_text(text)text: str表示テキストで解除
all_selected_options(プロパティ)なし選択中の <option> 要素リストを取得
first_selected_option(プロパティ)なし最初に選択されている <option> を取得
options(プロパティ)なしすべての <option> 要素を取得
is_multiple(プロパティ)なし複数選択が可能かどうかを返す
Selectクラスのメソッド一覧
初期化
from selenium.webdriver.support.ui import Select

select_element = driver.find_element(By.ID, "dropdown")
select = Select(select_element)
select_by_value()
select.select_by_value("python")
select_by_index()
select.select_by_index(2)
select_by_visible_text()
select.select_by_visible_text("Java")
deselect_all()
if select.is_multiple:
    select.deselect_all()
deselect_by_value()
select.deselect_by_value("java")
deselect_by_index()
select.deselect_by_index(0)
deselect_by_visible_text()
select.deselect_by_visible_text("Python")
all_selected_options
for option in select.all_selected_options:
    print(option.text)
first_selected_option
print(select.first_selected_option.text)
options
for option in select.options:
    print(option.get_attribute("value"))
is_multiple
if select.is_multiple:
    print("複数選択が可能なドロップダウンです")
複数選択ボックスの操作
# 複数選択可なselect要素
select = Select(driver.find_element(By.ID, "multi-select"))

select.select_by_visible_text("Option 1")
select.select_by_visible_text("Option 3")

select.deselect_by_visible_text("Option 1")

Alert

Alertクラスは、ブラウザ上で表示されるJavaScriptアラート/確認ダイアログ/プロンプト入力などの操作に使用するクラスです。

Seleniumでは、これらのポップアップは通常のDOMでは取得できないため、driver.switch_to.alertを使ってAlertオブジェクトに切り替え操作します。

ボタンのクリック(OK/キャンセル)や、テキスト入力/アラートのメッセージ取得などが可能です。

主にalert(),confirm(),prompt()に対応した自動テストに役立ちます。

スクロールできます
メソッド名引数説明
accept()なしアラートを受け入れる(OKを押す)
dismiss()なしアラートをキャンセル(Cancelを押す)
send_keys(text)text: strプロンプトに文字列を入力
text(プロパティ)なしアラートに表示されているメッセージを取得
Alertクラスのメソッド一覧
accept()
from selenium.webdriver.common.alert import Alert

alert = driver.switch_to.alert
alert.accept()
dismiss()
alert = driver.switch_to.alert
alert.dismiss()
send_keys()
alert = driver.switch_to.alert
alert.send_keys("Test input")
alert.accept()
text(プロパティ)
alert = driver.switch_to.alert
print("アラートメッセージ:", alert.text)
実践例:確認ダイアログの操作
# 確認ダイアログを開くような操作
driver.find_element(By.ID, "delete-btn").click()
# アラートへ切り替え
alert = driver.switch_to.alert
# メッセージ取得
print("確認メッセージ:", alert.text)
# OKをクリック(confirmを受け入れる)
alert.accept()
実践例:プロンプトへの入力
driver.find_element(By.ID, "prompt-btn").click()

alert = driver.switch_to.alert
alert.send_keys("Selenium User")
alert.accept()
注意点と補足

アラートが出る前にdriver.switch_to.alertを呼ぶとNoAlertPresentExceptionが発生します。

アラートを扱う前にWebDriverWaitで待機するのが推奨されます。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 10).until(EC.alert_is_present())
alert = driver.switch_to.alert
alert.accept()

Webdriverとは

Webdriverは、各driver(ChromeDriverやFireFoxDriverなど)を通じてブラウザと通信します。

また、Webdriverは各driverを通じてブラウザにコマンドを渡し、同ルートを介して情報を受け取ります。

Seleniumのインストール

Seleniumは、Pythonの標準ライブラリとしてインストールされていないため、別途インストールする必要があります。

Seleniumはバージョン3とバージョン4の書き方がネット上で混同されているケースが多いです。

そのため、Seleniumのバージョン確認を実施していただけると幸いです。

ここでは、バージョン3とバージョン4の書き方を並行して記載していきます。

pip show selenium

上記コマンドをMacであればターミナル、Windowsであればコマンドプロンプトで実施すれば、Seleniumのバージョンを確認できます。

pip install selenium==3.141.0

上記のpipコマンドでは、バージョン3を指定していますが任意のバージョンを指定し実施してください。

webdriver(ChromeDriver/EdgeDriver)のインストール

seleniumでは、webdriverとセットで利用する必要があります。

本記事では、最も利用されるChromeDriverによるwebdriverになります。

まだお使いのPCにChromeブラウザがインストールされていない場合、以下のリンクからChromeのダウンロードとインストールを実施してください。

あるいはMicrosoft Edge Chromiumがインストールされていない場合、以下のリンクからダウンロードとインストールを実施してください。

また、ChromeDriverも同様に以下のリンクからダウンロードを実施してください。

webdriverのパス指定について、Selenium3と4で異なるため、注意が必要です。

Chrome用とEdge用にて、それぞれSelenium3,4を記載します。

Google Chrome
# Selenium 3
from selenium import webdriver

options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path="./path/to/driver", options=options)

以下は、改めてSelenium3におけるGoogle Chromeの具体的な手順を示します。

STEP
Google Chrome WebDriverのダウンロード
  • Chromeのバージョンに一致するWebDriverをダウンロードします。
  • ダウンロードリンク: Google Chrome WebDriver
STEP
WebDriverのパスを設定
  • ダウンロードしたchromedriver.exeのパスを指定します。

webdriver.ChromeOptions(): Chrome用のオプションを設定するためのオブジェクトを作成します。
webdriver.Chrome(...): Chrome用のWebDriverを初期化します。
executable_path="./path/to/chromedriver": Chrome WebDriverの実行ファイルへのパスを指定します。

これで、Google Chromeブラウザを使用したSelenium3のテストを実行できます。

# Selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

options = webdriver.ChromeOptions()
service = Service(executable_path="./path/to/driver")
driver = webdriver.Chrome(service=service, options=options)

以下は、改めてSelenium4におけるGoogle Chromeの具体的な手順を示します。

STEP
Google Chrome WebDriverのダウンロード
  • Edgeのバージョンに一致するWebDriverをダウンロードします。
  • ダウンロードリンク: Google Chrome WebDriver
STEP
WebDriverのパスを設定
  • ダウンロードしたchromedriver.exeのパスを指定します。

webdriver.ChromeOptions(): Chrome用のオプションを設定するためのオブジェクトを作成します。
Service(executable_path="./path/to/chromedriver"): Chrome WebDriverの実行ファイルへのパスを指定し、サービスを初期化します。
webdriver.Chrome(service=service, options=options): Chrome用のWebDriverを初期化します。

これで、Google Chromeブラウザを使用したSelenium4のテストを実行できます。

Microsoft Edge
# Selenium 3
from selenium import webdriver

options = webdriver.EdgeOptions()
driver = webdriver.Edge(executable_path="./path/to/msedgedriver", options=options)

以下は、改めてSelenium3におけるMicrosoft Edgeの具体的な手順を示します。

STEP
Microsoft Edge WebDriverのダウンロード
  • Edgeのバージョンに一致するWebDriverをダウンロードします。
  • ダウンロードリンク: Microsoft Edge WebDriver
STEP
WebDriverのパスを設定
  • ダウンロードしたmsedgedriver.exeのパスを指定します。

webdriver.EdgeOptions(): Edge用のオプションを設定するためのオブジェクトを作成します。
webdriver.Edge(...): Edge用のWebDriverを初期化します。
executable_path="./path/to/msedgedriver": Edge WebDriverの実行ファイルへのパスを指定します。

これで、Microsoft Edgeブラウザを使用したSelenium3のテストを実行できます。

# Selenium 4
from selenium import webdriver
from selenium.webdriver.edge.service import Service

options = webdriver.EdgeOptions()
service = Service(executable_path="./path/to/msedgedriver")
driver = webdriver.Edge(service=service, options=options)

以下は、改めてSelenium4におけるMicrosoft Edgeの具体的な手順を示します。

STEP
Microsoft Edge WebDriverのダウンロード
  • Edgeのバージョンに一致するWebDriverをダウンロードします。
  • ダウンロードリンク: Microsoft Edge WebDriver
STEP
WebDriverのパスを設定
  • ダウンロードしたmsedgedriver.exeのパスを指定します。

webdriver.EdgeOptions(): Edge用のオプションを設定するためのオブジェクトを作成します。
Service(executable_path="./path/to/msedgedriver"): Edge WebDriverの実行ファイルへのパスを指定し、サービスを初期化します。
webdriver.Edge(service=service, options=options): Edge用のWebDriverを初期化します。

これで、Microsoft Edgeブラウザを使用したSelenium4のテストを実行できます。

端的に言えばSelenium3では、直接executable_pathを指定します。

一方で、Selenium4ではServiceオブジェクトを経由してexecutable_pathに渡します。

webdriver-managerのインストール(自動更新)

Seleniumを利用するにあたり、webdriver(ChromeDriver/EdgeDriverなど)をインストールする必要があります。

また、Chrome等のブラウザは定期的にアップデートされ、古いバージョンのwebdriverが使用できなくなるケースがあります。

そのため、webdriverを自動更新するライブラリであるwebdriver-managerのインストールをおすすめします。

pip install webdriver-manager

上記コマンド実施後、Successfullyが表示されればインストール完了です。

また、Selenium3とSelenium4によってPythonファイルへの記述方法が異なります。

Google Chrome
# Selenium 3
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
# Selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
Microsoft Edge
# Selenium 3
from selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager

driver = webdriver.Edge(executable_path=EdgeChromiumDriverManager().install())
# Selenium 4
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from webdriver_manager.microsoft import EdgeChromiumDriverManager

driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()))

上記コードを記述することで、ブラウザバージョンのアップデートの度に、webdriver更新時の手間が省けます。

Webdriverの対応ブラウザ

上記では、最も利用されるGoogle ChromeブラウザとMicrosoft Edgeブラウザを示しました。

その他にも、Webdriverから各driverを利用できます。

主なdriverは以下の5つです。

メソッド名説明
.Chrome()Google Chromeブラウザ
.Edge()Microsoft Edgeブラウザ
.Firefox()Mozilla Firefoxブラウザ
.Ie()IEブラウザ
.Safari()Apple Safariブラウザ
主なdriver

Seleniumの公式ドキュメントにて5つのブラウザに対して操作が可能です。

.ChromeOptions()の使い方

以下のOptionsモジュールをインポートします。

from selenium.webdriver.chrome.options import Options

代表的なオプションは以下です。

また、.add_argument()メソッドで利用します。

オプション名説明
options.add_argument(‘–blink-settings=imagesEnabled=false’)画像の非表示
options.add_argument(‘–disable-blink-features=AutomationControlled’)navigator.webdriver=false とする設定
options.add_argument(‘–disable-browser-side-navigation’)Timed out receiving message from renderer: の修正
options.add_argument(‘–disable-dev-shm-usage’)ディスクのメモリスペースを使う
options.add_argument(‘–disable-extensions’)すべての拡張機能を無効
options.add_argument(‘–disable-gpu’)GPUハードウェアアクセラレーションを無効
options.add_argument(‘–headless’)ヘッドレスモードで起動
options.add_argument(‘–ignore-certificate-errors’)SSL認証を無効
options.add_argument(‘–incognito’)シークレットモードで起動
options.add_argument(‘–no-sandbox’)Chromeの保護機能を無効
options.add_argument(‘–start-maximized’)初期のウィンドウサイズを最大化
options.add_argument(‘–window-size=1920,1080’)初期のウィンドウサイズを指定
.ChromeOptions()の代表的なオプション

特にリモートでSelenium Serverを稼働させる場合など、ヘッドレスモードを利用することが多いです。

以下に利用しやすいコードブロックを記載しておきます。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--blink-settings=imagesEnabled=false') #画像の非表示
options.add_argument('--disable-blink-features=AutomationControlled') #navigator.webdriver=false とする設定
options.add_argument('--disable-browser-side-navigation') #Timed out receiving message from renderer: の修正
options.add_argument('--disable-dev-shm-usage') #ディスクのメモリスペースを使う
options.add_argument('--disable-extensions') #すべての拡張機能を無効
options.add_argument('--disable-gpu') #GPUハードウェアアクセラレーションを無効
options.add_argument('--headless') #ヘッドレスモードで起動
options.add_argument('--ignore-certificate-errors') #SSL認証を無効
options.add_argument('--incognito') #シークレットモードで起動
options.add_argument('--no-sandbox') #Chromeの保護機能を無効
options.add_argument('--start-maximized') #初期のウィンドウサイズを最大化
options.add_argument('--window-size=1920,1080') #初期のウィンドウサイズを指定

# ------ ChromeDriver の起動 ------
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://www.xxxx.jp')

SeleniumのWebDriverWaitの使い方

Seleniumを利用してブラウザ操作する場合、ブラウザに対する待機時間もうまく処理する必要があります。

また、Seleniumにおけるエラーの原因は、指定した要素が見つからないことがほとんどです。

人間の操作より遥かに速い操作でプログラムが処理するため、指定要素の存在有無でエラーを引き起こします。

ここでは、Webdriverの待機処理について解説します。

待機処理では、以下の3つを紹介します。

主な待機処理
  • .implicitly_wait()による暗黙的な待機処理
  • WebDriverWait.until()による明示的な待機処理
  • time.sleep()の待機処理

暗黙的・明示的といった単語も含めて解説します。

また、Seleniumで待機処理を実施する場合に以下のWebDriverWaitモジュールをインポートしておきます。

.implicitly_wait()による暗黙的な待機処理

暗黙的な待機処理とは、『ブラウザの表示処理を指定時間内で待機する』ことを指します。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

# Chrome Driverを起動する
driver = webdriver.Chrome(executable_path='path/to/driver', chrome_options=options)

driver.implicitly_wait(10) # 秒

# Webページを開く
driver.get('URL')

# Chrome Driverを終了する
driver.quit()

上記のコードのように、暗黙的な待機処理は共通的な待ち時間を設定できます。

ブラウザの表示が完了すれば、残りの時間を無視して次の処理に移ります。

処理コードは、driver起動直後で問題ありません。

WebDriverWait.until()による明示的な待機処理

暗黙的な待機処理では対応できない(特定要素の読み込みが遅いなど)場合に、明示的な待機処理を追加する必要があります。

WebDriverWait.until()メソッドを利用し、HTML要素が特定の状態になるまで待機する設定ができます。

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

# Chrome Driverを起動する
driver = webdriver.Chrome(executable_path='path/to/driver', chrome_options=options)

# Webページを開く
driver.get('URL')

# 指定した要素が表示されるまで、明示的に10秒待機する
css_selector = 'css_selector'
element = WebDriverWait(driver, 10).until(
	EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
)

# Chrome Driverを終了する
driver.quit()

WebDriverWait.until()メソッドは、『特定要素の状態に対しての待機時間』を設定しています。

また、visibility_of_element_located()メソッドは『特定要素の表示』を設定しています。

他にも待機処理で利用できるメソッドは以下になります。

メソッド名説明
alert_is_presentAlertが表示されるまで待機する
element_to_be_clickable要素がクリック出来る状態になるまで待機する
visibility_of_element_located指定した要素が表示されるまで待機する
invisibility_of_element_located指定した要素が非表示になるまで待機する
text_to_be_present_in_element指定したテキストが表示されるまで待機する
presence_of_element_located指定した要素がDOM上に現れるまで待機する
待機処理で利用するメソッド

明示的な待機処理に関しては、WebページのHTMLデータを取得後に実行しましょう。

time.sleep()の待機処理

暗黙的・明示的な待機処理が利用できないケースの場合は、time.sleep()メソッドを利用しましょう。

import time
time.sleep(10) # 秒

time.sleep()メソッドは、強制的に指定時間を待機してしまうため、全体の処理が遅れてしまいます。

ただ、複雑なプログラムになるとブラウザ操作以外に処理するコードが多くなり、selenium以外の処理で時間を要する場合があります。

その際に、Seleniumでは処理できない別処理の待機はtime.sleep()メソッドを利用します。

WebDriverにおけるタブ・ウィンドウの切り替え方法

Selenium3とSelenium4では、それぞれタブ・ウィンドウの切り替え方法が異なります。

Selenium4は新しいドライバーオブジェクトを作成せず、同じセッションで新しいタブやウィンドウを作成し、フォーカスできます。

そのため、Selenium4は新しいタブあるいは新しいウィンドウを作成し自動的に切り替えるAPIである.new_windowが用意されています。

一方でSelenium3は、URLを新しいタブあるい新しいウィンドウを作成後、ハンドルの切り替えswitch_to.window()を実行する必要があります。

Selenium3メソッド
タブの作成driver.execute_script(“window.open()”)
タブの切り替えdriver.switch_to.window(driver.window_handles[1])
Selenium3 – タブ/ウィンドウ作成と切り替え
Selenium4メソッド
タブの作成/切り替えdriver.switch_to.new_window(“tab”)
ウィンドウの作成/切り替えdriver.switch_to.new_window(“window”)
Selenium4 – タブ/ウィンドウ作成と切り替え

どちらもタブ・ウィンドウ作成後、前のタブ・ウィンドウに戻したい場合はハンドルの切り替えで調整しましょう。

仮に作成後のタブ・ウィンドウの作業が終了し、 ブラウザーで最後に開いたウィンドウまたはタブではない場合、以前使用していたタブ・ウィンドウに切り替える必要があります。

ウィンドウを閉じた後に、別のウィンドウハンドルに切り替えを忘れると、現在閉じられたページでWebDriverが実行されたままになり、No Such Window Exceptionといったエラーが発生します。

Seleniumの実行を継続するには、有効なウィンドウハンドルに切り替える必要があるため注意しましょう。

例えば、対象サイトの検索結果一覧ページを表示しながら、別タブで詳細ページを表示してスクレイピングを実行するといったケースで役立ちます。

Seleniumによるエラー時の対処

Seleniumによるスクレイピングプログラムを実行する際に、いくつかのエラーあるいは突破しなければならない課題があります。

以下が主なエラーに対する対処内容になります。

主なエラー時の対処内容
  • 指定したHTML要素が見つからない時(InvalidSelectorExceptionやNoSuchElementException)
  • 特定サイトの無応答時(タイムアウト)

それぞれのエラーに対する対処方法を解説します。

指定したHTML要素が見つからない時(InvalidSelectorExceptionやNoSuchElementException)

上述したように、Seleniumによる大半のエラーの原因は、指定した要素が見つからないことです。

そのため、Timeout時のエラー対処を解説します。

Pythonでは、エラー通知にtry-except文を利用します。

from selenium.common.exceptions import TimeoutException

try:
	# 指定した要素が表示されるまで、明示的に10秒待機する
    css_selector = 'css_selector'
    element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
    )

except TimeoutException as e:
	# 失敗時の処理

あるいは、関数を利用して再処理を実施すると良いです。

# リトライして失敗したらエラーメッセージを通知する。成功したらelementを返す
def getElement(css_selector, wait_second, retries_count):

	error = ''
	for _ in range(retries_count):
		try:
			# 失敗しそうな処理
			css_selector = 'css_selector'
			element = WebDriverWait(driver, wait_second).until(
				EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
			)
		except TimeoutException as e:
			# エラーメッセージを格納する
			error = e
		else:
			# 失敗しなかった場合は、ループを抜ける
			break
	else:
		# リトライが全部失敗したときの処理
	
		# エラー内容(error)や実行時間、操作中のURL、セレクタ、スクショなどを通知する。
		do_something() # 好きな処理

		# プログラムを強制終了する
		sys.exit(1)
	return element

element = getElement('css_selector', {{ 待機時間 }}, {{ リトライする回数 }})

エラーが発生した場合に、任意の回数分をリトライすることで待機処理ではカバーしきれない通信不具合の状況なども対処できます。

特定サイトの無応答時(タイムアウト:timeout)

特定サイトの無応答時のタイムアウトには、Seleniumによる自動制御を事前にアクセス拒否してるケースもあります。

つまり、Webスクレイピングしたいが特定サイト側でnavigator.webdriver=trueなブラウザだとNGなサイトであるわけです。

上記の場合は、navigator.webdriver=Falseに設定する必要があります。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager

# ------ ChromeDriver の起動 ------
options = Options()
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
#print(driver.execute_script('return navigator.webdriver'))

Optionsモジュールをインポート後、.add_argument()メソッドにてオプション設定を行います。

options.add_argument('--disable-blink-features=AutomationControlled')を追加することで、navigator.webdriver=trueからnavigator.webdriver=Falseへ変更できます。

変更後にプログラムを実施すると、Seleniumによるスクレイピングを拒否されることなく実行できます。

driver.execute_script('return navigator.webdriver')

driverの起動コードの下に、print文を追加し上記のコードを記述すると、navigator.webdriverの設定を確認できます。

navigator.webdriverとは

webdriverはnavigatorインターフェイスの読み取り専用プロパティにより、ユーザーエージェントが自動制御されているかどうかを示します。

navigator.webdriverの値がtrueの場合はWebブラウザが自動制御されており、falseの場合は自動制御されていないことを示します。

この記事を書いた人

sugiのアバター sugi SUGI

【経歴】玉川大学工学部卒業→新卒SIer企業入社→2年半後に独立→プログラミングスクール運営/受託案件→フリーランスエンジニア&SEOコンサル→Python特化のコンテンツサイトJob Code運営中

目次