セットアップ
インストール
pip install selenium webdriver-manager # webdriver-manager がブラウザドライバを自動ダウンロード
基本的なドライバセットアップ
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()))
ヘッドレスモード
options = webdriver.ChromeOptions() options.add_argument("--headless=new") options.add_argument("--no-sandbox") driver = webdriver.Chrome(options=options)
対応ブラウザ
webdriver.Chrome()Google Chrome / Chromium
webdriver.Firefox()Mozilla Firefox(GeckoDriver)
webdriver.Edge()Microsoft Edge(Chromium ベース)
webdriver.Safari()Apple Safari(macOS のみ)
ブラウザとナビゲーション
ナビゲーション
driver.get("https://example.com") driver.back() # ブラウザの戻る driver.forward() # ブラウザの進む driver.refresh() # ページを再読み込み
ブラウザのプロパティ
driver.title現在のページタイトル
driver.current_url現在のページ URL
driver.page_sourceページの HTML ソース全体
driver.get_cookies()すべてのクッキーを一覧表示
ウィンドウ管理
driver.set_window_size(1920, 1080) driver.maximize_window() driver.minimize_window() driver.quit() # すべてのウィンドウを閉じてセッション終了
要素の検索
ロケータ戦略
from selenium.webdriver.common.by import By driver.find_element(By.ID, "login-btn") driver.find_element(By.CLASS_NAME, "nav-item") driver.find_element(By.CSS_SELECTOR, "div.card > h2") driver.find_element(By.XPATH, "//input[@name='q']")
By 戦略
By.ID要素の id 属性でマッチ
By.NAME要素の name 属性でマッチ
By.CLASS_NAMECSS クラスでマッチ(単一クラス)
By.TAG_NAMEHTML タグ名でマッチ
By.CSS_SELECTORCSS セレクタ(最も柔軟)
By.XPATHXPath 式
By.LINK_TEXTアンカーテキストの完全一致
By.PARTIAL_LINK_TEXTアンカーテキストの部分一致
複数要素の検索
items = driver.find_elements(By.CSS_SELECTOR, "li.item") for item in items: print(item.text) # 見つからない場合は空のリストを返す(例外なし)
インタラクション
クリックと入力
elem = driver.find_element(By.ID, "search") elem.clear() # 既存のテキストをクリア elem.send_keys("selenium python") elem.submit() # 親フォームをサブミット
ドロップダウン
from selenium.webdriver.support.ui import Select select = Select(driver.find_element(By.ID, "country")) select.select_by_visible_text("Canada") select.select_by_value("ca") select.select_by_index(2)
要素のプロパティ
.text表示テキストの内容
.get_attribute('href')HTML 属性の値
.is_displayed()要素が表示されている場合 True
.is_enabled()要素が操作可能な場合 True
.is_selected()チェックボックス・ラジオが選択されている場合 True
.tag_nameHTML タグ(例: 'input'、'div')
.value_of_css_property('color')計算済み CSS プロパティの値
待機
明示的な待機
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC elem = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "result")))
期待される条件
presence_of_element_located要素が DOM に存在する
visibility_of_element_located要素がページに表示されている
element_to_be_clickable要素が表示されており操作可能
text_to_be_present_in_element要素に期待するテキストが含まれる
alert_is_presentJavaScript アラートが表示されている
staleness_of要素が DOM から除去された
title_containsページタイトルにテキストが含まれる
暗黙的な待機
driver.implicitly_wait(10) # 秒単位、グローバルに適用 # 明示的な待機が推奨 — より精密な制御が可能
フレームとウィンドウ
フレーム
driver.switch_to.frame("frame-name") # 名前またはIDで driver.switch_to.frame(0) # インデックスで driver.switch_to.frame(elem) # 要素で driver.switch_to.default_content() # メインに戻る
ウィンドウとタブ
original = driver.current_window_handle driver.switch_to.new_window("tab") # 新しいタブを開く driver.switch_to.window(original) # 元に戻る driver.close() # 現在のタブを閉じる
アラート
alert = driver.switch_to.alert print(alert.text) alert.accept() # OK をクリック alert.dismiss() # キャンセルをクリック alert.send_keys("input text")
スクリーンショット
スクリーンショットの取得
driver.save_screenshot("page.png") # ページ全体 elem = driver.find_element(By.ID, "chart") elem.screenshot("chart.png") # 単一要素
Base64 でのスクリーンショット
b64 = driver.get_screenshot_as_base64() png = driver.get_screenshot_as_png() # バイト列
アクション
アクションチェーン
from selenium.webdriver.common.action_chains import ActionChains actions = ActionChains(driver) actions.move_to_element(menu).click().perform()
キーボード操作
from selenium.webdriver.common.keys import Keys elem.send_keys(Keys.ENTER) elem.send_keys(Keys.CONTROL, "a") # すべて選択 actions.key_down(Keys.SHIFT).click(elem).perform()
マウス操作
.click(elem)要素をクリック
.double_click(elem)要素をダブルクリック
.context_click(elem)要素を右クリック
.move_to_element(elem)要素にホバー
.drag_and_drop(src, dst)ソースをドラッグしてデスティネーションにドロップ
.click_and_hold(elem)マウスボタンを押し続ける
.release()マウスボタンを離す
アサーション
よく使うアサーション(pytest)
assert "Dashboard" in driver.title assert driver.find_element(By.ID, "msg").text == "Done" assert driver.current_url.endswith("/home") assert len(driver.find_elements(By.CSS_SELECTOR, "tr")) > 0
待機ベースのアサーション
WebDriverWait(driver, 5).until( # 表示を待つ EC.visibility_of_element_located((By.ID, "success"))) WebDriverWait(driver, 5).until( # 非表示を待つ EC.invisibility_of_element_located((By.ID, "spinner")))
JavaScript の実行
result = driver.execute_script("return document.title") driver.execute_script( "arguments[0].scrollIntoView(true);", elem)
よく使うパターン
ページオブジェクトパターン
class LoginPage: URL = "/login" user_loc = (By.ID, "username") def login(self, drv, user, pwd): drv.find_element(*self.user_loc).send_keys(user)
コンテキストマネージャ
from selenium import webdriver with webdriver.Chrome() as driver: driver.get("https://example.com") print(driver.title) # driver.quit() が自動的に呼ばれる
リトライとクリーンアップ
try: driver.get("https://example.com") WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "btn"))) finally: driver.quit()