Agentive
自動化ラボ

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)

セキュリティ上の注意点

  1. 認証情報はハードコードしない: 環境変数または.envから読み込む
  2. headless=Falseでデバッグ: 本番はheadless=True、開発時は画面を見て確認
  3. 送信前にスクリーンショットを保存: page.screenshot(path="before_submit.png")
  4. レート制限を尊重する: 連続送信にはインターバルを入れる

フォーム入力の自動化は業務効率化の入り口である。Playwrightの堅牢なセレクタとAIの構造解析を組み合わせれば、フォームの変更にも柔軟に対応できる自動化が実現する。

関連記事

A

Agentive 編集部

AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。