Playwright ネットワーク監視とAPIテスト
この章では、ブラウザーのネットワークトラフィックを監視する方法と、Playwright を使用した独立した API テストについて説明します。
ネットワークリクエストとレスポンスの監視
page.on('request') でリクエストを監視
例
test('ネットワークリクエストを監視', async ({ page }) => {
const requests = [];
// すべてのリクエストを監視
page.on('request', request => {
requests.push({
url: request.url(),
method: request.method(),
postData: request.postData(),
});
});
await page.goto('https://www.example.com/');
// すべてのリクエストを出力
console.log('ページは合計', requests.length, '個のリクエストを送信しました');
requests.forEach(r => console.log(r.method, r.url));
});
const requests = [];
// すべてのリクエストを監視
page.on('request', request => {
requests.push({
url: request.url(),
method: request.method(),
postData: request.postData(),
});
});
await page.goto('https://www.example.com/');
// すべてのリクエストを出力
console.log('ページは合計', requests.length, '個のリクエストを送信しました');
requests.forEach(r => console.log(r.method, r.url));
});
page.on('response') でレスポンスを監視
例
test('ネットワークレスポンスを監視', async ({ page }) => {
page.on('response', async response => {
// API レスポンスのみに注目
if (response.url().includes('/api/')) {
console.log('API ステータスコード:', response.status());
console.log('API URL:', response.url());
}
});
await page.goto('https://www.example.com/');
});
page.on('response', async response => {
// API レスポンスのみに注目
if (response.url().includes('/api/')) {
console.log('API ステータスコード:', response.status());
console.log('API URL:', response.url());
}
});
await page.goto('https://www.example.com/');
});
page.waitForResponse() で特定のレスポンスを待つ
例
test('API レスポンスの完了を待機', async ({ page }) => {
// ボタンをクリックする前に API レスポンスの監視を準備
const responsePromise = page.waitForResponse(
response => response.url().includes('/api/search') && response.status() === 200
);
// 検索をトリガー
await page.getByPlaceholder('サンプルチュートリアルを検索').fill('Playwright');
await page.keyboard.press('Enter');
// API レスポンスを待機
const response = await responsePromise;
const data = await response.json();
// API が返したデータを検証
expect(data.results.length).toBeGreaterThan(0);
});
// ボタンをクリックする前に API レスポンスの監視を準備
const responsePromise = page.waitForResponse(
response => response.url().includes('/api/search') && response.status() === 200
);
// 検索をトリガー
await page.getByPlaceholder('サンプルチュートリアルを検索').fill('Playwright');
await page.keyboard.press('Enter');
// API レスポンスを待機
const response = await responsePromise;
const data = await response.json();
// API が返したデータを検証
expect(data.results.length).toBeGreaterThan(0);
});
Console メッセージの監視
例
test('コンソールエラーの監視', async ({ page }) => {
const consoleErrors = [];
// console メッセージを監視
page.on('console', msg => {
if (msg.type() === 'error') {
consoleErrors.push(msg.text());
}
});
await page.goto('https://www.example.com/');
// ページに JavaScript エラーがないことを検証
expect(consoleErrors).toHaveLength(0);
});
const consoleErrors = [];
// console メッセージを監視
page.on('console', msg => {
if (msg.type() === 'error') {
consoleErrors.push(msg.text());
}
});
await page.goto('https://www.example.com/');
// ページに JavaScript エラーがないことを検証
expect(consoleErrors).toHaveLength(0);
});
ConsoleMessage 型
| 型 | 対応するメソッド |
|---|---|
'log' | console.log() |
'error' | console.error() |
'warning' | console.warn() |
'info' | console.info() |
'debug' | console.debug() |
API テスト(request fixture)
Playwright のrequestfixture を使用するとブラウザーを介さずに直接 HTTP リクエストを送信できます。
これは、テストの前後でサーバー側の状態を準備またはクリーンアップするのに最適です。
GET リクエストを送信
例
test('API GET リクエスト', async ({ request }) => {
const response = await request.get('https://jsonplaceholder.typicode.com/posts/1');
// レスポンスステータスを検証
expect(response.status()).toBe(200);
// JSON データを取得
const data = await response.json();
expect(data.id).toBe(1);
expect(data).toHaveProperty('title');
});
const response = await request.get('https://jsonplaceholder.typicode.com/posts/1');
// レスポンスステータスを検証
expect(response.status()).toBe(200);
// JSON データを取得
const data = await response.json();
expect(data.id).toBe(1);
expect(data).toHaveProperty('title');
});
POST リクエストを送信
例
test('API POST リクエスト', async ({ request }) => {
const response = await request.post('https://jsonplaceholder.typicode.com/posts', {
data: {
title: 'サンプル チュートリアル',
body: 'Playwright API テスト例',
userId: 1,
},
});
expect(response.status()).toBe(201);
const data = await response.json();
expect(data.title).toBe('サンプル チュートリアル');
});
const response = await request.post('https://jsonplaceholder.typicode.com/posts', {
data: {
title: 'サンプル チュートリアル',
body: 'Playwright API テスト例',
userId: 1,
},
});
expect(response.status()).toBe(201);
const data = await response.json();
expect(data.title).toBe('サンプル チュートリアル');
});
baseURL と認証ヘッダーの設定
例
// ファイルパス: playwright.config.ts
export default defineConfig({
use: {
// API リクエストのベース URL
baseURL: 'https://api.example.com',
// デフォルトのリクエストヘッダー
extraHTTPHeaders: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Accept': 'application/json',
},
},
});
export default defineConfig({
use: {
// API リクエストのベース URL
baseURL: 'https://api.example.com',
// デフォルトのリクエストヘッダー
extraHTTPHeaders: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Accept': 'application/json',
},
},
});
API + ブラウザー組み合わせテスト
実際のプロジェクトでは、ブラウザーを操作する前後に API を使用して状態管理を行うことがよくあります。
例
test('API でデータを準備 + ブラウザーで検証', async ({ request, page }) => {
// ステップ 1: API を介してテストデータを作成
const response = await request.post('/api/todos', {
data: { title: 'サンプル テストタスク', completed: false },
});
const todo = await response.json();
// ステップ 2: ブラウザーでデータが表示されていることを検証
await page.goto('/todos');
await expect(page.getByText('サンプル テストタスク')).toBeVisible();
// ステップ 3: API を介してデータをクリーンアップ
await request.delete(`/api/todos/${todo.id}`);
});
// ステップ 1: API を介してテストデータを作成
const response = await request.post('/api/todos', {
data: { title: 'サンプル テストタスク', completed: false },
});
const todo = await response.json();
// ステップ 2: ブラウザーでデータが表示されていることを検証
await page.goto('/todos');
await expect(page.getByText('サンプル テストタスク')).toBeVisible();
// ステップ 3: API を介してデータをクリーンアップ
await request.delete(`/api/todos/${todo.id}`);
});
その他の拡張API テストはブラウザー操作よりもはるかに高速で、データの準備やクリーンアップに適しています。API とブラウザー操作を組み合わせることで、テストの効率と信頼性を大幅に向上させることができます。