Playwright 2025 新機能は、フロントエンド開発においてますます広く活用されています。本記事では、実際のプロジェクトを起点に、その核心的な原理とベストプラクティスを深く解説します。
基本的な使い方
次の方法で改善できます:
javascript
import { test, expect } from "@playwright/test";
test.describe("用户登录流程", () => {
test("成功登录跳转到首页", async ({ page }) => {
await page.goto("/login");
await page.fill('[data-testid="email"]', "admin@example.com");
await page.fill('[data-testid="password"]', "admin123");
await page.click('[data-testid="submit-btn"]');
await expect(page).toHaveURL("/dashboard");
await expect(page.locator(".welcome")).toContainText("欢迎回来");
});
});
このソリューションは半年以上本番環境で安定稼働しており、実証済みです。
応用的な使い方
まずは基本的な実装方法を見てみましょう:
javascript
import { render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { LoginForm } from "./LoginForm";
describe("LoginForm", () => {
it("提交有效的登录表单", async () => {
const onSubmit = jest.fn();
render(<LoginForm onSubmit={onSubmit} />);
await userEvent.type(screen.getByLabelText(/邮箱/), "user@example.com");
await userEvent.type(screen.getByLabelText(/密码/), "password123");
await userEvent.click(screen.getByRole("button", { name: /登录/ }));
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledWith({
email: "user@example.com",
password: "password123",
});
});
});
});
このコードは基本的な使い方を示しています。実際のプロジェクトでは、エラーハンドリングやエッジケースも考慮する必要があります。
実践事例
この基礎の上で、さらに最適化できます:
javascript
import { test, expect } from "@playwright/test";
test.describe("用户登录流程", () => {
test("成功登录跳转到首页", async ({ page }) => {
await page.goto("/login");
await page.fill('[data-testid="email"]', "admin@example.com");
await page.fill('[data-testid="password"]', "admin123");
await page.click('[data-testid="submit-btn"]');
await expect(page).toHaveURL("/dashboard");
await expect(page.locator(".welcome")).toContainText("欢迎回来");
});
});
このパターンは大規模プロジェクトで非常に実用的で、メンテナンスコストを大幅に削減できます。
パフォーマンス最適化
実際のプロジェクトでは、より複雑な使い方が求められます:
javascript
import { render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { LoginForm } from "./LoginForm";
describe("LoginForm", () => {
it("提交有效的登录表单", async () => {
const onSubmit = jest.fn();
render(<LoginForm onSubmit={onSubmit} />);
await userEvent.type(screen.getByLabelText(/邮箱/), "user@example.com");
await userEvent.type(screen.getByLabelText(/密码/), "password123");
await userEvent.click(screen.getByRole("button", { name: /登录/ }));
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledWith({
email: "user@example.com",
password: "password123",
});
});
});
});
この方法により、コードのテスタビリティと拡張性が向上します。
よくある落とし穴
以下は完全なサンプルです:
javascript
import { test, expect } from "@playwright/test";
test.describe("用户登录流程", () => {
test("成功登录跳转到首页", async ({ page }) => {
await page.goto("/login");
await page.fill('[data-testid="email"]', "admin@example.com");
await page.fill('[data-testid="password"]', "admin123");
await page.click('[data-testid="submit-btn"]');
await expect(page).toHaveURL("/dashboard");
await expect(page.locator(".welcome")).toContainText("欢迎回来");
});
});
エッジケースの処理に注意してください。本番環境では非常に重要です。
まとめ
- コミュニティの動向に注目し、技術的なアプローチは継続的に反復が必要
- 新しい技術を使うこと自体を目的にしない
- コードサンプルはあくまで参考で、ビジネスシナリオに応じて調整が必要
- Playwright 2025 新機能は銀の弾丸ではなく、プロジェクト規模や技術スタックに応じて選択する必要がある
- API を覚えるより、根本的な原理を理解することが重要