AIでフォーム入力を自動化 — Playwrightで申請業務を効率化
約5分で読めます
申請フォーム、登録フォーム、応募フォーム。毎日同じフィールドに同じ情報を入力する作業はPlaywrightで自動化できる。AIと組み合わせれば、フォームの構造が変わっても自動で対応する。
基本: fill / click / select
Playwrightの3つの基本操作でほとんどのフォームは自動化できる。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com/apply")
# テキスト入力
page.fill('input[name="company_name"]', '株式会社サンプル')
page.fill('input[name="email"]', 'info@example.com')
page.fill('textarea[name="message"]', '応募メッセージ本文')
# セレクトボックス
page.select_option('select[name="category"]', value='web_development')
# チェックボックス
page.check('input[name="agree_terms"]')
# ラジオボタン
page.click('input[value="individual"]')
# 送信ボタン
page.click('button[type="submit"]')
# 送信完了の確認
page.wait_for_selector('.success-message', timeout=10000)
print("フォーム送信完了")
browser.close()
ページ遷移を伴う複数ステップフォーム
ウィザード形式のフォームはステップごとにwait_for_selectorで次の画面を待つ。
# ステップ1: 基本情報
page.fill('#name', '山田太郎')
page.fill('#phone', '03-1234-5678')
page.click('button:text("次へ")')
# ステップ2を待機してから入力
page.wait_for_selector('#step2', state='visible')
page.fill('#address', '東京都渋谷区...')
page.click('button:text("次へ")')
# ステップ3: 確認画面で送信
page.wait_for_selector('#confirm', state='visible')
page.click('button:text("送信")')
エラーハンドリング
フォーム自動化で最も重要なのはエラーハンドリング。ネットワーク障害、要素の未表示、バリデーションエラーに対応する。
from playwright.sync_api import TimeoutError as PlaywrightTimeout
def safe_fill(page, selector, value, timeout=5000):
try:
page.wait_for_selector(selector, state='visible', timeout=timeout)
page.fill(selector, value)
return True
except PlaywrightTimeout:
print(f"要素が見つかりません: {selector}")
return False
def submit_with_retry(page, submit_sel, success_sel, max_retries=3):
for attempt in range(max_retries):
page.click(submit_sel)
try:
page.wait_for_selector(success_sel, timeout=10000)
return True
except PlaywrightTimeout:
error = page.query_selector('.error-message')
if error:
print(f"バリデーションエラー: {error.text_content()}")
return False
print(f"リトライ {attempt + 1}/{max_retries}")
return False
ファイルアップロード
# 単一ファイル
page.set_input_files('input[type="file"]', 'resume.pdf')
# 複数ファイル
page.set_input_files('input[type="file"]', [
'document1.pdf',
'document2.pdf'
])
AIとの連携: 動的フォーム対応
フォーム構造をAIに解析させ、適切な値を自動判定する。
import json, subprocess
form_html = page.inner_html('form')
result = subprocess.run(
["claude", "-p", "以下のHTMLフォームの各フィールドに適切な値をJSON形式で返せ"],
capture_output=True, text=True, input=form_html
)
field_values = json.loads(result.stdout)
for selector, value in field_values.items():
safe_fill(page, selector, value)
セキュリティ上の注意点
- 認証情報はハードコードしない: 環境変数または
.envから読み込む - headless=Falseでデバッグ: 本番はheadless=True、開発時は画面を見て確認
- 送信前にスクリーンショットを保存:
page.screenshot(path="before_submit.png") - レート制限を尊重する: 連続送信にはインターバルを入れる
フォーム入力の自動化は業務効率化の入り口である。Playwrightの堅牢なセレクタとAIの構造解析を組み合わせれば、フォームの変更にも柔軟に対応できる自動化が実現する。
関連記事
A
Agentive 編集部
AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。