【初心者向け完全解説】Playwrightで複数サイトのWebフォームを自動入力・送信する方法|セレクタ取得・エラー処理・再試行ロジックを全手順解説




【初心者向け完全解説】Playwrightで複数サイトのWebフォームを自動入力・送信する方法|セレクタ取得・エラー処理・再試行ロジックを全手順解説


はじめに

「また同じフォーム、手で埋めてる……」

そう思いながら、私は毎週末2〜3時間をフォーム入力作業に溶かしていました。

BOOTHへの商品出品フォーム、DLsiteへの申請フォーム、noteへの記事投稿フォーム——どれも「ほぼ同じ内容」を「ほぼ同じ手順」で入力するだけなのに、なぜか毎回ブラウザを開いて、コピペして、プルダウンを選んで、チェックボックスをポチポチして……。

副業の「作業時間」のうち、実に40%近くがこのフォーム入力に消えていたことに気づいたとき、私は本気で自動化を決意しました。

そしてPlaywrightと出会い、実装してみたところ——1フォームあたり30分かかっていた作業が、スクリプト実行の3分に短縮されました。

この記事では、私が実際に複数サイトのフォーム自動化を実装した経験をもとに、初心者でも読んだ当日に動かせるレベルで、Playwrightによるフォーム自動入力の全手順を解説します。


目次


この記事で学べること

この記事を読むことで、以下のことが実装レベルで理解できます。

  • Playwrightの基本的な使い方(ブラウザ起動〜フォーム送信まで)

  • CSSセレクタ・XPath・locator()を使ったHTML要素の特定方法

  • fill()select_option()check()など、フォーム要素別の操作メソッド

  • TimeoutErrorをはじめとするよくあるエラーの原因と解決策

  • 失敗しても自動で再試行する再試行ロジックの書き方

  • 複数サイトのフォームをYAML設定ファイルで一元管理する設計パターン

  • 私がBOOTH・DLsite・noteで実際に使っているコードの構造(有料パート)


なぜPlaywrightなのか?

Selenium・Requestsとの比較

フォーム自動化のツールは複数ありますが、私がPlaywrightを選んだ理由は明確です。

ツール 特徴 弱点 Requests + BeautifulSoup 軽量・高速 JavaScriptが動くフォームに対応不可 Selenium 実績豊富 セットアップが重い・待機処理が煩雑 Playwright 非同期対応・自動待機・複数ブラウザ対応 やや新しめ(情報量はSeleniumより少ない)

特に決め手になったのは「自動待機(auto-waiting)」機能です。Seleniumでは time.sleep(3) のような固定待機を随所に挟む必要がありましたが、Playwrightは要素が操作可能になるまで自動で待ってくれます。これだけで、私のスクリプトの安定性が劇的に上がりました。

また、Headlessモード(ブラウザ画面を表示せずバックグラウンドで実行)が非常に安定しており、Macのローカル環境でcronによる定期実行にも対応できています。


環境構築

必要なもの

  • Python 3.9以上(私は3.11を使用)

  • pip(Pythonパッケージ管理)

  • ターミナル(Mac標準のTerminal.appで十分)

インストール手順

# 1. Playwrightライブラリのインストール
pip install playwright

# 2. ブラウザバイナリのインストール(Chromium・Firefox・WebKit)
playwright install

# 3. 動作確認用スクリプト(test_playwright.py)
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)  # headless=Falseで画面表示
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    browser.close()

上記を実行してブラウザが起動し、Example Domain と表示されれば環境構築は完了です。

よくある躓きポイント

  • playwright install を忘れてブラウザバイナリがない → 必ず実行してください

  • M1/M2 Macの場合、playwright install chromium だけで十分なケースが多いです

  • Pythonのバージョンが3.8以下だと非同期APIで問題が出ることがあります


セレクタ取得の基本と実践

フォーム自動化で最初の壁になるのが「どの要素を操作すればいいか」の特定です。

ブラウザの開発者ツールを使う

  1. 対象のフォームページをChromeで開く

  2. 入力したいフィールドを右クリック → 検証

  3. HTMLの該当タグを確認する

例えば、以下のようなHTMLがあった場合:

<input type="text" id="product-title" name="title" placeholder="商品タイトルを入力">

locator()を使った指定方法は複数あります:

# IDで指定(最も安定)
page.locator("#product-title")

# nameで指定
page.locator("[name='title']")

# placeholderで指定(IDがない場合に便利)
page.locator("[placeholder='商品タイトルを入力']")

# テキストラベルで指定(Playwrightの強力な機能)
page.get_by_label("商品タイトル")

私が最もよく使うのは get_by_label() と #id 指定の組み合わせです。IDが付いている要素は変更されにくく、スクリプトが壊れにくいためです。


フォーム要素別の自動化

テキスト入力:fill()

# 基本的なテキスト入力
page.locator("#product-title").fill("オリジナルイラスト集 Vol.1")

# 既存のテキストをクリアしてから入力
page.locator("#product-title").clear()
page.locator("#product-title").fill("新しいタイトル")

プルダウン選択:select_option()

# valueで選択
page.locator("#category").select_option("illustration")

# 表示テキストで選択
page.locator("#category").select_option(label="イラスト")

# インデックスで選択(0始まり)
page.locator("#category").select_option(index=2)

チェックボックス:check() / uncheck()

# チェックを入れる
page.locator("#agree-terms").check()

# チェックを外す
page.locator("#newsletter").uncheck()

# 現在の状態を確認してから操作
if not page.locator("#agree-terms").is_checked():
    page.locator("#agree-terms").check()

フォーム送信

# submitボタンをクリック
page.locator("button[type='submit']").click()

# または、フォームのEnterキー送信
page.locator("#product-title").press("Enter")

# 送信後のページ遷移を待つ(重要!)
page.wait_for_url("**/success**")

エラー対処法

TimeoutErrorが発生する主な原因

TimeoutErrorPlaywrightで最も頻繁に遭遇するエラーです。デフォルトのタイムアウトは30秒ですが、以下の原因で発生します。

  • 要素がまだDOMに存在しない(ページ読み込み中)

  • セレクタが間違っている(要素が見つからない)

  • 要素が存在するが非表示・無効化されている

  • JavaScriptによる動的レンダリングの完了を待てていない

# タイムアウト時間を延長する
page.locator("#product-title").fill("タイトル", timeout=60000)  # 60秒

# ページ全体の読み込みを待つ
page.wait_for_load_state("networkidle")

# 特定の要素が表示されるまで待つ
page.wait_for_selector("#product-title", state="visible")

再試行ロジック

ネットワークの不安定さやサイト側の一時的なエラーに対応するため、再試行ロジックは必須です。私のスクリプトには必ずこの関数を組み込んでいます。

import time
from playwright.sync_api import TimeoutError as PlaywrightTimeoutError

def fill_with_retry(page, selector, value, max_retries=3, wait_sec=2):
    """
    フォーム入力を最大max_retries回リトライする汎用関数
    """
    for attempt in range(1, max_retries + 1):
        try:
            page.locator(selector).wait_for(state="visible", timeout=10000)
            page.locator(selector).fill(value)
            print(f"✅ 入力成功: {selector} = {value}")
            return True
        except PlaywrightTimeoutError as e:
            print(f"⚠️ 試行 {attempt}/{max_retries} 失敗: {e}")
            if attempt < max_retries:
                time.sleep(wait_sec)
            else:
                print(f"❌ 最大リトライ回数に達しました: {selector}")
                raise
    return False

この関数を使うことで、一時的なタイムアウトで全体のスクリプトが止まることを防げます。私の実装では、この再試行ロジックのおかげでBOOTH出品スクリプトのエラー率が約70%低下しました。


複数サイト対応設計

複数のサイトのフォームを自動化する場合、サイトごとにスクリプトを書くのは非効率です。私はYAML設定ファイルでサイト情報を管理し、共通のエンジンで処理する設計を採用しています。

# config.yaml のイメージ(有料パートで全文公開)
sites:
  booth:
    url: "https://manage.booth.pm/items/new"
    fields:
      title: "#item_title"
      description: "#item_description"
      price: "#item_price"
  dlsite:
    url: "https://www.dlsite.com/..."
    fields:
      title: "[name='work_name']"
      # ...

この設計にすることで、新しいサイトを追加するときはYAMLに数行書き足すだけで対応できます。


購入案内

ここまで読んでいただいた方は、すでに「自分のフォームでも動かせそう」という感覚を持っていただけているのではないでしょうか。

しかし実際に副業で使えるレベルのスクリプトを組むには、もう少し踏み込んだ知識が必要です。

「セレクタは取れた、でも実際のBOOTHやDLsiteのフォームで動かすとエラーが出る」 「複数商品を一括で処理したいが、ループの書き方がわからない」 「ログイン状態の維持や、CAPTCHA対策はどうすればいい?」

有料パートでは、私が実際に稼働させているスクリプトのコードと設計思想を、すべて公開します。

¥490の有料パートで得られるもの

BOOTH出品フォーム完全自動化スクリプト(全文コード)  商品タイトル・説明文・価格・カテゴリ・ファイルアップロードまで対応した、私が実際に10商品/バッチで稼働させているPlaywrightスクリプトの全コードを掲載。コピペして設定ファイルを書き換えるだけで動作します。

DLsite申請フォーム自動化スクリプト(全文コード)  DLsite特有の複雑なフォーム構造(動的に変化するセレクタ・複数ステップの申請フロー)に対応したスクリプトを公開。私が実際に申請作業を30分→3分に短縮した実装そのものです。

ログイン状態の永続化(Cookie保存・再利用)の実装方法  毎回ログインし直すのは非効率かつBANリスクがあります。Playwrightでセッションクッキーをファイルに保存し、次回実行時に再利用する実装パターンを解説。これにより、ログインフォームの自動化も不要になります。

YAML設定ファイルによる複数サイト一元管理の完全設計  サイトごとのURL・セレクタ・入力値をYAMLで管理し、1つのエンジンスクリプトで複数サイトに対応する設計パターンを全公開。新しいサイトを追加するときの手順も解説します。私はこの設計でBOOTH・DLsite・noteの3サイトを同一スクリプトで管理しています。

本番運用で遭遇した実際のエラー10選と解決策集  TimeoutError・ElementNotFound・StaleElementReference・ログインセッション切れ・CAPTCHA検知・レート制限など、私が実際に副業スクリプトを運用して遭遇したエラーとその対処法を、エラーメッセージ・原因・解決コードのセットで10例掲載。これを読めば、初心者が詰まりがちなポイントをほぼすべてカバーできます。

cronによるMacローカル定期実行の設定方法  VPS不使用・ローカルMacだけで定期実行を実現するcron設定の書き方、実行ログの保存方法、エラー時のメール通知設定まで解説。月$0の追加コストで自動化を維持する私の運用方法をそのまま公開します。

スクリプト設計のチェックリスト(PDF)  新しいサイトのフォームを自動化するときに私が必ず確認する15項目のチェックリストをPDF形式で提供。「セレクタは安定しているか」「動的レンダリングの待機は適切か」「リトライ処理は入っているか」など、本番投入前の品質確認に使えます。

¥490という価格は、私が副業で1商品出品するたびに節約できる30分の価値と比べれば、初回の実行で元が取れる計算です。コードはすべてコピペで動作確認済みです。ぜひ今日中に自分のフォームで試してみてください。


🔒 ここから先は有料パートです

ここから先は

16,051字

¥ 490

この記事が気に入ったらチップで応援してみませんか?