Python | Web / API:自動入力

Python Python
スポンサーリンク

概要(自動入力は「正しく見つけ、待って、確実に送る」型づくり)

Seleniumでの自動入力は、フォームや検索欄、ログイン画面などへ文字を入れる操作をコード化することです。重要なのは、要素の特定(ロケータ)、明示的待機(表示・入力可能の確認)、入力メソッド(send_keys・クリア・特殊キー)、例外対応(見つからない・タイムアウト・入力ブロック)の4点です。これを型として組み込めば、動的ページでも落ちずに安定した自動入力ができます。


はじめ方(最短の自動入力と環境の整え方)

最短の自動入力(ID/NAMEでシンプルに)

# pip install selenium webdriver-manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://example.com/login")

driver.find_element(By.NAME, "username").send_keys("taro")
driver.find_element(By.NAME, "password").send_keys("secret123")

driver.quit()
Python

IDやNAMEがある場合は、最短で堅牢です。まずここから始め、CSSやXPathは必要に応じて使い分けます。

ヘッドレス(画面非表示)で安定入力

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

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/login")

driver.find_element(By.ID, "username").send_keys("taro")
driver.find_element(By.ID, "password").send_keys("secret123")

driver.quit()
Python

ヘッドレス時はウィンドウサイズを指定して、要素が「画面外扱い」で操作不可になる問題を避けます。


明示的待機の深掘り(“準備完了”を確認してから入力)

表示・入力可能を保証してからsend_keys

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

driver.get("https://example.com/login")
wait = WebDriverWait(driver, 10)

user = wait.until(EC.visibility_of_element_located((By.ID, "username")))
pwd  = wait.until(EC.visibility_of_element_located((By.ID, "password")))

user.clear()                # 既存テキストを消す(後述)
user.send_keys("taro")
pwd.clear()
pwd.send_keys("secret123")
Python

visibility_of_element_locatedで「表示済み」を保証してから入力します。固定sleepより圧倒的に安定です。

クリックフォーカスが必要な入力欄への対処

field = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.search")))
field.click()               # フォーカス付与
field.send_keys("python 自動化")
Python

一部のUIは「フォーカスがないと入力を受け付けない」ため、クリックしてフォーカスを与えてからsend_keysします。


入力メソッドとコツ(クリア・特殊キー・選択系)

クリアしてから入力(誤混入の回避)

from selenium.webdriver.common.by import By

f = wait.until(EC.visibility_of_element_located((By.NAME, "email")))
f.clear()
f.send_keys("user@example.com")
Python

初期値やオートフィルが残っていると誤入力に。clearで消してから入れるのが基本です。

送信や特殊キー(Enter・Tab・Ctrl+A)

from selenium.webdriver.common.keys import Keys

q = wait.until(EC.visibility_of_element_located((By.NAME, "q")))
q.send_keys("Selenium Python")
q.send_keys(Keys.ENTER)  # フォーム送信
# 全選択→上書き
q.send_keys(Keys.CONTROL, "a")
q.send_keys("新しい検索語")
Python

Keysで特殊キーを送れます。検索はEnter送信、上書きならCtrl+A→入力。

ドロップダウンの選択

from selenium.webdriver.support.ui import Select

sel = Select(wait.until(EC.visibility_of_element_located((By.ID, "country"))))
sel.select_by_visible_text("Japan")       # 表示テキストで選択
# sel.select_by_value("JP")               # value属性で選択
# sel.select_by_index(0)                  # 位置で選択
Python

HTMLのselect要素はSelectラッパーで安全に扱えます。

チェックボックス・ラジオボタン

cb = wait.until(EC.element_to_be_clickable((By.ID, "agree")))
if not cb.is_selected():
    cb.click()

rb = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[type=radio][value=premium]")))
rb.click()
Python

状態確認(is_selected)→必要ならクリック。二重クリックで状態が戻る事故を防げます。


位置合わせと遮蔽対策(画面上で“入力可能”にする)

スクロールや移動で視野に入れてから入力

from selenium.webdriver.common.action_chains import ActionChains

target = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input.comment")))
ActionChains(driver).move_to_element(target).perform()  # 視野へ
target.clear(); target.send_keys("こんにちは!")
Python

見えていない・被さっている要素は入力に失敗します。まず視野へ持ってくるのが定石です。

iframe内の入力は「スイッチ」してから

frame = wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe#payment")))
wait.until(EC.visibility_of_element_located((By.ID, "cardNumber"))).send_keys("4242 4242 4242 4242")
driver.switch_to.default_content()
Python

iframeは別DOM。切り替え後に入力し、終わったら戻ります。

JavaScript経由のフォールバック(最終手段)

el = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input.comment")))
driver.execute_script("arguments[0].value = 'JSで直接入力'; arguments[0].dispatchEvent(new Event('input'));", el)
Python

通常入力がUIの制約に阻まれる場合の最終手段。イベント発火も合わせて行うと反映されやすくなります。


例外とエラーへの対処(落ちないための型)

代表的な例外のハンドリング

from selenium.common.exceptions import TimeoutException, NoSuchElementException, ElementNotInteractableException

try:
    field = WebDriverWait(driver, 8).until(EC.visibility_of_element_located((By.ID, "username")))
    field.clear(); field.send_keys("taro")
except TimeoutException:
    print("入力欄が現れない/見えない")
except NoSuchElementException:
    print("入力欄が存在しない。ロケータ再確認")
except ElementNotInteractableException:
    print("入力不可状態(無効・覆われている)。待機・位置合わせを検討")
Python

原因に応じて「待機条件の変更」「フォーカス付与」「スクロール」「iframe切替」をセットで備えます。

入力が通ったかの検証(値読み戻し)

field = wait.until(EC.visibility_of_element_located((By.ID, "username")))
field.clear(); field.send_keys("taro")
assert field.get_attribute("value") == "taro"
Python

値の読み戻しで「確かに入力された」を自動検証できます。


実務の型(ログイン→検索→フォーム送信を“落ちない”ように書く)

一連の流れを「待機+例外+後始末」で守る

import csv
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
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

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
wait = WebDriverWait(driver, 12)

try:
    driver.get("https://example.com/login")
    u = wait.until(EC.visibility_of_element_located((By.ID, "username"))); u.clear(); u.send_keys("taro")
    p = wait.until(EC.visibility_of_element_located((By.ID, "password"))); p.clear(); p.send_keys("secret123")
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type=submit]"))).click()

    wait.until(EC.url_contains("/dashboard"))
    s = wait.until(EC.visibility_of_element_located((By.NAME, "q"))); s.clear(); s.send_keys("python 自動入力"); s.submit()

    rows = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.item")))
    data = [(r.find_element(By.CSS_SELECTOR, "h3").text, r.find_element(By.CSS_SELECTOR, "a").get_attribute("href")) for r in rows[:20]]

    with open("results.csv", "w", newline="", encoding="utf-8") as f:
        csv.writer(f).writerows(data)
finally:
    driver.quit()
Python

ログイン→検索→抽出→保存までを明示的待機で守り、finallyで必ずquit。これが“落ちない自動入力・送信”の基本形です。


よくある落とし穴の回避(アンチパターンを避ける)

固定sleep乱用で不安定

  • 対策: WebDriverWait+expected_conditionsで「条件に合うまで待つ」。固定秒は遅いか足りないのどちらかになりがち。

長い絶対XPathに依存

  • 対策: まずID/NAME、次にCSS。XPathは短く・属性中心で。DOM変更に強いロケータを意識する。

ヘッドレスで入力不可

  • 対策: –window-size指定、スクロールやmove_to_elementで視野に入れる。クリックでフォーカス付与後に入力。

iframe未対応

  • 対策: frame_to_be_available_and_switch_to_itで切替。終わったらdefault_contentへ戻す。

まとめ

自動入力を安定させる鍵は、正しいロケータで要素を見つけ、明示的待機で「表示・入力可能」を確認してからsend_keysすることです。クリア→入力→検証の型を徹底し、必要に応じてEnter送信や特殊キー、Selectでの選択、チェックボックスの状態確認を組み合わせる。ヘッドレス時はサイズ指定と位置合わせ、iframeはスイッチ、例外を手掛かりに待機条件を調整する。これらを型として身につければ、初心者でも動的ページ相手に“落ちない・確実に入る”自動入力が短いコードで書けます。

タイトルとURLをコピーしました