Playwright完全ガイド - インストールから実行まで
目次
Playwrightとは
Playwrightは、WebページのGUIを自動操作するためのライブラリです。
主な特徴
- ブラウザの自動操作(クリック、入力、スクロールなど)
- 複数ブラウザ対応(Chrome、Firefox、Safari)
- スクリーンショット・動画撮影
- ネットワーク監視・モック機能
- 高速で信頼性の高い実行
用途
- GUI自動テスト
- Webスクレイピング
- 繰り返し作業の自動化
- パフォーマンステスト
環境セットアップ
1. プロジェクト作成
# 新しいディレクトリを作成
mkdir playwright-demo
cd playwright-demo
# package.json作成
npm init -y
2. Playwrightインストール
# Playwrightをインストール
npm install playwright
# ブラウザをダウンロード(初回のみ必要)
npx playwright install
# Ubuntu/Linux用の依存関係インストール
sudo npx playwright install-deps
3. インストール確認
# ブラウザが正しくインストールされているか確認
npx playwright --version
ハローワールド(ブラウザ非表示)
hello-world.jsを作成:
const { chromium } = require('playwright');
(async () => {
console.log('🚀 Playwright ハローワールド開始(headlessモード)');
const browser = await chromium.launch({
headless: true // ブラウザを表示しない
});
const page = await browser.newPage();
try {
// シンプルなサイトを開く
console.log('📖 example.comを開きます...');
await page.goto('https://example.com');
// ページタイトルを取得
const title = await page.title();
console.log(`📋 ページタイトル: ${title}`);
// スクリーンショットを撮影
console.log('📸 スクリーンショットを撮影します...');
await page.screenshot({ path: 'hello-world-screenshot.png' });
// テキストの検証
const bodyText = await page.textContent('body');
if (bodyText.includes('Example')) {
console.log('🎉 ページテキストの検証も成功!');
}
console.log('✅ ハローワールド完了!');
console.log('📁 hello-world-screenshot.png が保存されました');
} catch (error) {
console.error('❌ エラーが発生しました:', error.message);
} finally {
await browser.close();
}
})();
実行
node hello-world.js
ブラウザを表示して実行
📋 重要: デスクトップ環境(Windows、Mac、Linux GUI)でのみ動作します。
デスクトップ環境用(ブラウザ表示あり)
visual-demo.jsを作成:
const { chromium } = require('playwright');
(async () => {
console.log('🚀 Playwright 目視確認デモ開始');
const browser = await chromium.launch({
headless: false, // ブラウザを表示
slowMo: 2000, // 操作を2秒間隔でゆっくり実行
devtools: true // デベロッパーツールも表示(オプション)
});
const page = await browser.newPage();
try {
// Googleを開く
console.log('📖 Googleを開きます...');
await page.goto('https://www.google.com');
// 少し待つ(目視確認のため)
await page.waitForTimeout(3000);
// 検索ボックスを見つける
const searchBox = page.locator('textarea[name="q"]').first();
await searchBox.waitFor({ timeout: 10000 });
console.log('✅ 検索ボックスを発見しました!');
// 検索キーワードを入力(ゆっくり)
console.log('✏️ 検索キーワードを入力します...');
await searchBox.fill('Playwright 自動化テスト');
// Enterキーを押す
console.log('🔍 検索を実行します...');
await searchBox.press('Enter');
// 検索結果の読み込みを待つ
console.log('⏳ 検索結果を待っています...');
await page.waitForTimeout(5000);
// スクリーンショットを撮影
console.log('📸 スクリーンショットを撮影します...');
await page.screenshot({ path: 'visual-demo-screenshot.png' });
console.log('🎉 デモ完了!10秒後にブラウザを閉じます');
await page.waitForTimeout(10000);
} catch (error) {
console.error('❌ エラーが発生しました:', error.message);
await page.waitForTimeout(5000); // エラー時も少し待つ
} finally {
await browser.close();
}
})();
SSH/サーバー環境での画面表示方法
方法1: X11フォワーディング(Linux/Mac)
# SSHでX11フォワーディングを有効にして接続
ssh -X username@your-server
# または
ssh -Y username@your-server
# その後、ブラウザ表示ありのスクリプトを実行
node visual-demo.js
方法2: VNC接続
# サーバーにデスクトップ環境をインストール
sudo apt update
sudo apt install ubuntu-desktop-minimal
sudo apt install tightvncserver
# VNCサーバーを起動
vncserver :1
# ローカルからVNCクライアントで接続後、スクリプト実行
実行
# デスクトップ環境で実行
node visual-demo.js
トラブルシューティング
よくあるエラーと解決方法
1. ブラウザが見つからないエラー
Executable doesn't exist at /home/ubuntu/.cache/ms-playwright/chromium...
解決方法:
npx playwright install
sudo npx playwright install-deps
2. ディスプレイがないエラー(Linux)
Error: Could not find display
解決方法:
# headless: true に変更するか、X11フォワーディングを使用
export DISPLAY=:0
3. 要素が見つからないエラー
page.fill: Timeout 30000ms exceeded
解決方法:
// より柔軟な要素選択
const element = page.locator('input').first();
await element.waitFor({ timeout: 10000 });
// 複数の候補を試す
const selectors = ['input[name="q"]', 'textarea[name="q"]'];
for (const selector of selectors) {
try {
await page.locator(selector).first().waitFor({ timeout: 5000 });
break;
} catch (e) {
console.log(`${selector} not found, trying next...`);
}
}
4. 権限エラー
# 実行権限がない場合
chmod +x node_modules/.bin/playwright
# システム依存関係の問題
sudo apt-get install libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0
実用的な操作例
フォーム入力とファイルアップロード
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false, slowMo: 1000 });
const page = await browser.newPage();
await page.goto('https://example-form-site.com');
// テキスト入力
await page.fill('#username', 'testuser');
await page.fill('#email', 'test@example.com');
// セレクトボックス
await page.selectOption('#country', 'Japan');
// チェックボックス
await page.check('#agree');
// ラジオボタン
await page.check('input[name="gender"][value="male"]');
// ファイルアップロード
await page.setInputFiles('#file', 'path/to/file.pdf');
// ボタンクリック
await page.click('#submit');
// 結果を待つ
await page.waitForSelector('.success-message');
await browser.close();
})();
複数タブの操作
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
// 最初のタブ
const page1 = await context.newPage();
await page1.goto('https://example.com');
// 新しいタブを開く
const page2 = await context.newPage();
await page2.goto('https://google.com');
// タブを切り替えながら操作
await page1.bringToFront();
await page1.screenshot({ path: 'tab1.png' });
await page2.bringToFront();
await page2.screenshot({ path: 'tab2.png' });
await browser.close();
})();
スクロールと要素待機
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://infinite-scroll-site.com');
// ページの一番下までスクロール
await page.evaluate(() => {
window.scrollTo(0, document.body.scrollHeight);
});
// 特定要素が表示されるまで待機
await page.waitForSelector('.load-more-content', { timeout: 10000 });
// 要素が見えるまでスクロール
await page.locator('.target-element').scrollIntoViewIfNeeded();
await browser.close();
})();
まとめ
- headless: true: サーバー環境、バックグラウンド実行
- headless: false: デスクトップ環境、目視確認
- slowMo: 動作をゆっくりにして確認しやすくする
- screenshot(): 実行結果の確認に便利
デスクトップ環境があれば headless: false
でブラウザを表示して動作確認できます。サーバー環境では headless: true
でスクリーンショットを撮影して結果を確認しましょう。