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”を実現できます。
情報まとめ編と合わせて読むことで、全体像が掴みやすくなるはずです。