19
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】Selenium 徹底解説:入門で終わらせない実践的ブラウザ自動化

Posted at

はじめに

―― 自動化テストを超えた「ブラウザ操作エンジン」の本質

Selenium を「テスト用ツール」だと思っているうちは、
まだこの道具の半分も使えていません。

Selenium は単なる UI 自動化ツールではなく、
実ブラウザを完全に支配できる強力な自動化基盤です。

本記事では、

  • 初学者が最初につまずかないための基礎
  • 実務で差がつく設計・待機・構造
  • そして「精通」と呼べるレベルに必要な視点

を一気通貫で解説します。


1. Seleniumとは何か?よくある誤解から正す

多くの資料では、Selenium は次のように説明されます。

Selenium は Web アプリケーションの自動テストフレームワークである

これは間違いではありませんが、本質を言い切れていません

より正確には:

Selenium は WebDriver プロトコルを通じて、実際のブラウザを遠隔操作する自動化フレームワークである

重要なのは「実ブラウザ」です。

  • JavaScript は実行される
  • フロントエンドの暗号化もそのまま動く
  • Cookie / LocalStorage / IndexedDB に直接アクセスできる
  • 難読化されたコードも“中で”動いてしまう

つまり、

ブラウザでできることは、Seleniumでもできる

ということです。


2. Seleniumのアーキテクチャを理解する

Selenium を正しく使うためには、内部構造の理解が不可欠です。

あなたのコード(Python / Java / JS)
        ↓
Selenium Client Library
        ↓  WebDriver Protocol(HTTP + JSON)
Browser Driver(ChromeDriver 等)
        ↓
実ブラウザ(Chrome / Firefox)

ここから分かる重要な点:

  • Selenium はブラウザに直接命令しているわけではない
  • Driver を介した リモート操作 である
  • そのため強力だが、検知されやすい側面もある

「なぜ検知されるのか」を理解できるかどうかが、
入門者と中級者の分岐点になります。


3. 入門:まずは正しい最小構成で動かす

3.1 インストール(Python)

pip install selenium webdriver-manager

webdriver-manager を使うことで、Driver 管理の地獄から解放されます。


3.2 最初のサンプルコード

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

driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install())
)

driver.get("https://example.com")
print(driver.title)

driver.quit()

ここで重要なのは「短く・正しく」動かすことです。
この時点で環境依存トラブルが出るなら、
後工程は必ず破綻します


4. 基本操作:だが“雑に”使わない

4.1 要素の取得(設計が9割)

from selenium.webdriver.common.by import By

driver.find_element(By.ID, "login")
driver.find_element(By.NAME, "username")
driver.find_element(By.CSS_SELECTOR, ".btn.primary")
driver.find_element(By.XPATH, "//input[@type='password']")

実務での推奨優先度

  1. id
  2. data-* 属性
  3. CSS Selector
  4. XPath(最終手段)

XPath が悪いのではなく、
メンテ不能な XPath が悪いのです。


4.2 待機処理:ここで力量が分かれる

❌ 初心者がやりがち:

time.sleep(5)

✅ 実務での正解:

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

WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "login"))
)

時間を待つのではなく、状態を待つ。
これが Selenium を安定させる最大のコツです。


5. 中級:ブラウザ操作を正しく扱う

5.1 入力・送信・キーボード操作

from selenium.webdriver.common.keys import Keys

search = driver.find_element(By.NAME, "q")
search.send_keys("Selenium")
search.send_keys(Keys.ENTER)

5.2 iframe・ウィンドウ切り替え

driver.switch_to.frame("iframe_id")
driver.switch_to.default_content()

driver.switch_to.window(driver.window_handles[-1])

ここを理解していないと、
「要素が見つからない」問題に永遠に悩まされます。


6. 精通への第一関門:自動化検知を理解する

ここから先は「使える人」と「任せられる人」の差です。

6.1 代表的な検知ポイント

  • navigator.webdriver === true
  • Chrome 起動フラグ
  • Headless 特有の挙動
  • 不自然な操作速度
  • 指紋(Canvas / WebGL)

6.2 最低限の対策例

from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

driver = webdriver.Chrome(options=options)

加えて JavaScript 注入:

driver.execute_script("""
Object.defineProperty(navigator, 'webdriver', {
  get: () => undefined
})
""")

この時点で、
Selenium は「テストツール」ではなくなります。


7. Selenium最大の強み:JavaScript完全支配

7.1 任意の JavaScript 実行

token = driver.execute_script(
    "return localStorage.getItem('token')"
)

これにより:

  • JWT の直接取得
  • フロントエンド暗号の結果取得
  • 内部関数の直接呼び出し

が可能になります。

どれだけ複雑な前処理も、
ブラウザ内で実行される限り無意味です。


7.2 Cookie 操作

driver.add_cookie({
    "name": "session",
    "value": "xxxx",
    "domain": ".example.com"
})

ログインフローそのものを省略することもできます。


8. 精通者は「スクリプト」を書かない

8.1 Page Object Model(POM)

class LoginPage:
    def __init__(self, driver):
        self.driver = driver

    def login(self, user, pwd):
        self.driver.find_element(By.ID, "u").send_keys(user)
        self.driver.find_element(By.ID, "p").send_keys(pwd)
        self.driver.find_element(By.ID, "submit").click()
  • 可読性
  • 再利用性
  • 保守性

すべてが段違いになります。


8.2 Seleniumは「仕組み」として使う

  • Selenium Grid
  • Docker + ブラウザ
  • ブラウザプール
  • 分散実行

このレベルになると、
Selenium は ツールではなく基盤です。


9. Selenium と Playwright の位置づけ

項目 Selenium Playwright
成熟度 非常に高い 新しい
安定性 高い 高い
多タブ操作 やや複雑 簡単
反検知 弱め 強め

結論:

Seleniumは基礎体力、Playwrightは瞬発力。
本当に強い人は両方使える。


10. 「精通している」と言える条件

以下がすべて説明・実装できるなら、
あなたはもう初心者ではありません。

  • sleep に頼らない
  • 待機条件を設計できる
  • 自動化検知の仕組みを理解している
  • JavaScript を自在に実行できる
  • コードを構造化できる
  • WebDriver の仕組みを説明できる

おわりに

Selenium は古いツールではありません。
理解が浅いまま使われがちなツールなだけです。

ブラウザが主戦場である限り、
Selenium の価値は失われません。

ブラウザを制する者は、Webを制する。

19
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?