← ブログ一覧に戻る
業務自動化

2026年版 PlaywrightでRPAを構築する実践ガイド(設計〜運用まで)

#Playwright#RPA#業務自動化#TypeScript#運用

はじめに

この記事は、Playwrightを使って実際の業務RPAを構築する流れを、サンプルケースで解説する実践編です。

想定ケースは、次のような「ありがちな業務」です。

毎朝9:00に管理画面へログインし、前日の売上CSVをダウンロードして、スプレッドシートに転記する。


1. 要件整理(まず最初にやること)

RPAは「作る前の設計」で8割が決まります。以下の要件を整理します。

項目
対象操作管理画面ログイン → CSVダウンロード → スプレッドシート更新
実行頻度毎日9:00
成功条件CSVが取得でき、シートに行が追加される
失敗時Slack通知+スクリーンショット保存
権限専用アカウント + 権限最小化

2. 構成とフォルダ設計

PlaywrightのRPAは、**“テスト設計”ではなく“ジョブ設計”**として組み立てます。

rpa-project/
├── src/
│   ├── jobs/
│   │   └── download-sales.ts
│   ├── steps/
│   │   ├── login.ts
│   │   ├── download.ts
│   │   └── upload-sheet.ts
│   ├── utils/
│   │   ├── logger.ts
│   │   └── notify.ts
│   └── index.ts
├── storage/
│   └── last-run.json
├── playwright.config.ts
└── .env
  • jobs:実行単位
  • steps:操作単位
  • utils:共通機能(ログ・通知など)

3. 実装例(Playwright + TypeScript)

3-1. ログイン処理

import { Page, expect } from '@playwright/test';

export async function login(page: Page, baseUrl: string, email: string, password: string) {
  await page.goto(`${baseUrl}/login`);
  await page.getByLabel('メールアドレス').fill(email);
  await page.getByLabel('パスワード').fill(password);
  await page.getByRole('button', { name: 'ログイン' }).click();

  await expect(page.getByRole('heading', { name: 'ダッシュボード' })).toBeVisible();
}

3-2. CSVダウンロード

import { Page, expect } from '@playwright/test';

export async function downloadSalesCsv(page: Page) {
  await page.getByRole('link', { name: '売上レポート' }).click();
  await expect(page.getByRole('heading', { name: '売上レポート' })).toBeVisible();

  const [download] = await Promise.all([
    page.waitForEvent('download'),
    page.getByRole('button', { name: 'CSVダウンロード' }).click(),
  ]);

  const path = await download.path();
  if (!path) {
    throw new Error('CSVのダウンロードに失敗しました');
  }

  return path;
}

3-3. スプレッドシート反映(擬似コード)

export async function uploadToSheet(csvPath: string) {
  // Sheets API or Apps Script を想定
  // ここでは処理内容のイメージのみ記載
  console.log(`Uploading ${csvPath} to sheet...`);
}

4. ジョブ実行フロー

import { chromium } from '@playwright/test';
import { login } from './steps/login';
import { downloadSalesCsv } from './steps/download';
import { uploadToSheet } from './steps/upload-sheet';

export async function runSalesJob() {
  const browser = await chromium.launch();
  const page = await browser.newPage();

  try {
    await login(page, process.env.BASE_URL!, process.env.EMAIL!, process.env.PASSWORD!);
    const csvPath = await downloadSalesCsv(page);
    await uploadToSheet(csvPath);
  } finally {
    await browser.close();
  }
}

5. 運用ポイント(2026年の実務目線)

5-1. 冪等性を意識する

  • 同じCSVを2回反映してもデータが重複しないようにする
  • 前回の反映日時をstorage/last-run.jsonに保持

5-2. 失敗時の証跡を必ず残す

  • スクリーンショット
  • HTMLスナップショット
  • 入力パラメータ

5-3. 監視と通知をセットで組み込む

  • Slack / Teamsに通知
  • 失敗理由を簡潔に記載(業務担当が理解できる言葉)

6. 実務導入時のチェックリスト

  • 重要操作に対して手動でのフォールバック手順がある
  • UIの変更が起きた場合に通知される仕組みがある
  • 1処理あたりの平均時間を計測している
  • 実行ログは最低3ヶ月保存
  • 専用アカウントの権限は最小限

まとめ

PlaywrightでRPAを構築する場合、実装そのものよりも“運用設計”が成果を左右します。

  • どこで止まりやすいか
  • 再実行時に安全か
  • 誰がログを見て判断するか

これらを最初から組み込むことで、2026年の業務現場でも“壊れないRPA”を実現できます。

情報まとめ編と合わせて読むことで、全体像が掴みやすくなるはずです。