ã2026幎çãPlaywrightã®å§ãæ¹ â ã€ã³ã¹ããŒã«ããæåã®E2Eãã¹ããŸã§å®å šã¬ã€ã
- Playwrightã®ã€ã³ã¹ããŒã«ãšãã©ãŠã¶ã»ããã¢ãã
- ããŒãžæäœïŒã¯ãªãã¯ã»å ¥åã»ã¢ãµãŒã·ã§ã³ïŒã®åºæ¬
- ãã¹ãã®å®è¡ãšãã¬ãŒã¹ãã¥ãŒã¢ã§ã®ãããã°
ãŸã1æ¬ããã¹ããåãã
Node.jsãšnpmãå¿
èŠã§ããnpm init playwright@latest ã§ãã¹ãç°å¢ãäœãããã©ãŠã¶ã®ã€ã³ã¹ããŒã«ãéžãã§ãã ãããäžã®ã¿ã€ãã«ç¢ºèªã®ãã¹ãã ããªãããã°ã€ã³æ©èœã®ããã¢ããªãèªåã§çšæããå¿
èŠã¯ãããŸãããã€ã³ã¿ãŒãããæ¥ç¶ã®ããç°å¢ã§ npx playwright test tests/example.spec.ts --project=chromium ãå®è¡ããæåã確èªããŸãããã
ãã°ã€ã³ã®äŸã¯ãèªåã®æ€èšŒçšã¢ããªã /login ãš /dashboard ãæã¡ãæå®ã®ã©ãã«ãããå Žåã«éã£ãŠåããŸããååã¯ã¿ã€ãã«ç¢ºèªã ãã tests/example.spec.ts ã«ä¿åããŠãã ããã
ã³ãã³ãæ©èŠè¡š
# ã€ã³ã¹ããŒã«
npm init playwright@latest
# â ãã¹ãèšèªããã©ãŠã¶ãCIã¯ãŒã¯ãããŒãéžæ
# ãã¹ãå®è¡
npx playwright test # å
šãã¹ãå®è¡
npx playwright test --headed # ãã©ãŠã¶ã衚瀺ããªããå®è¡
npx playwright test example.spec.ts # ç¹å®ãã¡ã€ã«ã®ã¿
npx playwright test --trace on # ãã¬ãŒã¹åéããŠå®è¡
npx playwright show-report # HTMLã¬ããŒãã衚瀺
npx playwright show-trace trace.zip # ãã¬ãŒã¹ã衚瀺
// tests/example.spec.ts
import { test, expect } from '@playwright/test';
test('ãããããŒãžã®ã¿ã€ãã«ç¢ºèª', async ({ page }) => {
await page.goto('https://example.com');
await expect(page).toHaveTitle(/Example/);
});
test('ãã°ã€ã³ãã©ãŒã ã®ãã¹ã', async ({ page }) => {
// å¥éãæ€èšŒçšã¢ããªãš baseURL ã®èšå®ãå¿
èŠãªäŸ
await page.goto('/login');
// ãã©ãŒã ã«å
¥å
await page.getByLabel('ã¡ãŒã«ã¢ãã¬ã¹').fill('user@example.com');
await page.getByLabel('ãã¹ã¯ãŒã').fill('password');
await page.getByRole('button', { name: 'ãã°ã€ã³' }).click();
// ãã°ã€ã³åŸã®URLã確èª
await expect(page).toHaveURL('/dashboard');
});
// playwright.config.tsïŒãã«ããã©ãŠã¶èšå®ïŒ
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
{ name: 'webkit', use: { ...devices['Desktop Safari'] } },
],
reporter: 'html',
use: {
// çžå¯ŸURLã®äŸãåããå Žåãæ€èšŒçšã¢ããªãå¥éèµ·åãã
baseURL: 'http://127.0.0.1:3000',
screenshot: 'only-on-failure',
video: 'retain-on-failure',
trace: 'on-first-retry',
},
});
ããããè©°ãŸããã€ã³ã
Q. SeleniumãCypressãšã®éãã¯ïŒ 察å¿ãã©ãŠã¶ãè€æ°ã¿ããå¥ãªãªãžã³ã®æ±ããæ¢åè³ç£ãšã®çžæ§ã§éžã³ãŸããCypressã¯Firefoxã«ã察å¿ããŠããŸãããSeleniumã¯é ãããCypressã¯Chromiumã ãããšãã£ãäžè¬åã¯é¿ããå¿ èŠãªæäœãå°ããªãã¹ãã§ç¢ºèªããŸãããã
Q. ãã¹ããäžå®å®ïŒFlakyïŒã«ãªããã©ãããã°å®å®ããïŒ
èŠçŽ ã®æºåç¶æ
ããã¹ãããŒã¿ã®å¹²æžãªã©ã確èªããŸããLocatorã®æäœãš await expect(locator).toBeVisible() ãªã©ã®èªåå詊è¡ããã¢ãµãŒã·ã§ã³ã䜿ããŸããããå
¬åŒè³æã¯ãã¹ãã§ã® networkidle åŸ
æ©ãæšå¥šããŠããŸãããåºå®ã®ç§æ°ãéä¿¡åæ¢ãåŸ
ã€ãããæ€èšŒãããç»é¢ã®ç¶æ
ãçŽæ¥ç¢ºèªããŸãã
Q. ãããã¬ã¹ã¢ãŒãã§ãªããšé
ããCIã§ã¯å¿
ãheadlessã«ãã¹ãïŒ
éåžžã®ãã¹ãå®è¡ã¯headlessãæ¢å®ã§ããããŒã«ã«ã§åå ã調ã¹ãå Žå㯠--headed ã --debug ã§ç»é¢ãæäœã確èªã§ããŸããCIãçµã段éã«ãªã£ãããæ¬¡ã®GitHub Actionså
¥éãšå
¬åŒã®CIæé ãåç
§ããŠãã ããã
次ã«èªãèšäºããç®çã§éžã¶
- ãã¹ããpushã®ãã³ã«åãããããªãïŒGitHub Actionså ¥é â ã¯ãŒã¯ãããŒã®åºæ¬ãåŠã¶ã
- 颿°åäœã®ãã¹ãã远å ããããªãïŒJestå ¥é â ç»é¢å šäœã®ãã¹ããšåäœãã¹ãã䜿ãåããã
- TypeScriptã®åã§ã€ãŸããããïŒTypeScriptå ¥é â åæ³šéãšåãã§ãã¯ã®åºæ¬ã確èªããã
åèè³æ
ç¢ºèªæ¥ïŒ2026幎10æ5æ¥ã
- PlaywrightïŒInstallation
- PlaywrightïŒAssertions
- PlaywrightïŒPage API
- PlaywrightïŒBrowsers
- PlaywrightïŒSetting up CI
- CypressïŒLaunching browsers